-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Dennis Chacko edited this page Jul 19, 2024
·
95 revisions
Table of Contents |
---|
The Tool Rental Service is simple tool rental application with the below features:
- Customers rent a tool for a specified number of days.
- When a customer checks out a tool, a Rental Agreement is produced.
- The store charges a daily rental fee, whose amount is different for each tool type.
- Some tools are free of charge on weekends or holidays.
- Clerks may give customers a discount that is applied to the total daily charges to reduce the final charge.
- The service exposes an REST API that supports the below resources/operations
- Operation to read all available tools
- Operation to read pricing details per tool
- Operation to checkout and create a rental agreement per tool
-
[Future state]
Operation to add/delete tools available for rent - [
Future state]
Operation to add/update pricing details per tool
- Each operation should validate user entered input and throw
HTTP BAD Request
for validation errors - The service should follow an API First Design approach while adding new functionality. See API First Design approach for more details
- The service should auto-generate Spring REST code using the supplied Open API file. The OpenAPI file is available here
The Class Diagram includes some classes auto-generated from the OpenApi specification for this service
- The OpenAPI specification for the Tool Rental Service is available here.
- The service uses an API first approach to implement this service. The Java and Spring annotated REST classes were auto generated from The Online Swagger Editor
- The
AbstractController
clas implements the API interface - The below JPA repository classes are used to interface with the database
- ToolRepository to fetch available tools from the database
- ToolPriceRepository to fetch pricing details about a tool
- RentalRequestRepository to persist each rental request in the database
- RentalAgreementRepository to persist rental agreements in the database
---
title: ToolRentalService Class Diagram
---
classDiagram
namespace ControllerClasses{
class ToolRentalAPI{
<<interface>>
}
class Tool{
}
class ToolRentalPrice{
}
class RentalRequest{
}
class RentalAgreement{
}
class AbstractController{
}
}
Tool <-- ToolRentalAPI
ToolRentalPrice <-- ToolRentalAPI
RentalRequest <-- ToolRentalAPI
RentalAgreement <-- ToolRentalAPI
ToolRentalAPI <|-- AbstractController
namespace ServiceClasses {
class IRentalAgreementService {
<<interface>>
}
class IHoliday {
<<interface>>
}
class FourthJuly{
+isHoliday()
}
class LaborDay{
+isHoliday()
}
class Weekend{
+isHoliday()
}
class ObserverableHoliday{
+isHoliday()
}
class RentalAgreementService{
}
class RentalDurationService{
}
class DateRangeDetails {
}
}
IRentalAgreementService <|-- RentalAgreementService
RentalDurationService <-- RentalAgreementService
Weekend <-- RentalDurationService
ObserverableHoliday <-- RentalDurationService
DateRangeDetails <-- RentalDurationService
DateRangeDetails <-- RentalAgreementService
IRentalAgreementService <-- AbstractController
namespace PersistenceClasses {
class ToolRepository {
<<interface>>
}
class ToolPriceRepository {
<<interface>>
}
class RentalRequestRepository {
<<interface>>
}
class RentalAgreementRepository {
<<interface>>
}
class ToolEntity{
}
class ToolPriceEntity{
}
class RentalRequestEntity{
}
class RentalAgreementEntity{
}
}
ToolRepository <-- RentalAgreementService
ToolPriceRepository <-- RentalAgreementService
RentalRequestRepository <-- RentalAgreementService
RentalAgreementRepository <-- RentalAgreementService
RentalAgreementEntity <-- RentalAgreementRepository
RentalRequestEntity <-- RentalRequestRepository
ToolPriceEntity <-- ToolPriceRepository
ToolEntity <-- ToolRepository
IHoliday <|-- FourthJuly
IHoliday <|-- LaborDay
IHoliday <|-- Weekend
IHoliday <|-- ObserverableHoliday
LaborDay <-- ObserverableHoliday
FourthJuly <-- ObserverableHoliday
IHoliday: +isHoliday()
The service currently supports the below holidays:
- Fourth of July
- Labor Day
New holidays can be added by following the below steps:
- Create a new class that implements the
IHoliday
interface - Create a instance of this new class and add it to the
ObservedHoliday
class. for e.g to support Memorial Day as an observed holiday:
public class ObservedHoliday implements IHoliday{
private static final List<IHoliday> observedHolidays = List.of(
new FourthJuly(),
new LaborDay(),
new MemorialDay());
The below operations are supported by this service
Please see Fetch all tools available for rent
Please see Fetch Pricing Details for each Tool
Please see Checkout a tool for rental
The OpenAPI specification for this service is available here
- All business errors should be wrapped in an
ValidationException
class - Communicate business exception as HTTP 400 Bad Request
Sample error handling Spring-based RestService . Reference Error Handling for Spring Rest Services
@ControllerAdvice
public class RestResponseEntityExceptionHandler
extends ResponseEntityExceptionHandler {
@ExceptionHandler(value
= { ValidationException.class })
protected ResponseEntity<Object> handleConflict(
RuntimeException ex, WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse,
new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
}
}