{"id":17838138,"url":"https://github.com/dmickelson/carrentalproject","last_synced_at":"2026-05-02T04:41:19.333Z","repository":{"id":259518308,"uuid":"876963372","full_name":"dmickelson/CarRentalProject","owner":"dmickelson","description":"Car Reservation Application focusing on SOLID, MVC well-architected principles. ","archived":false,"fork":false,"pushed_at":"2024-10-26T23:33:21.000Z","size":91,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-08T04:45:58.746Z","etag":null,"topics":["java","javaspringboot","jpa-hibernate","junit","mvc-architecture","springboot","springtest"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmickelson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-22T21:09:40.000Z","updated_at":"2024-10-26T23:33:24.000Z","dependencies_parsed_at":"2024-10-26T06:24:22.151Z","dependency_job_id":"461ac82f-2a53-45df-a193-e866081d1037","html_url":"https://github.com/dmickelson/CarRentalProject","commit_stats":null,"previous_names":["dmickelson/carrentalproject"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmickelson%2FCarRentalProject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmickelson%2FCarRentalProject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmickelson%2FCarRentalProject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmickelson%2FCarRentalProject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmickelson","download_url":"https://codeload.github.com/dmickelson/CarRentalProject/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246827758,"owners_count":20840464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","javaspringboot","jpa-hibernate","junit","mvc-architecture","springboot","springtest"],"created_at":"2024-10-27T20:52:26.645Z","updated_at":"2026-05-02T04:41:19.255Z","avatar_url":"https://github.com/dmickelson.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Car Rental Project\n\nA robust car rental system built with Spring Boot implementing MVC architecture and factory patterns for vehicle management.\n\n## Architecture Overview\n\nThe Car Rental Project demonstrates robust SOLID principles through clear separation of concerns and single responsibility\nin each component, while the MVC architecture ensures clean data flow from the UI through controllers and services\ndown to the H2 database. The implementation of factory patterns and DTOs further strengthens the design by providing\nflexible object creation and secure data transfer between layers.\n\n### MVC Pattern\n\n- **Model**: Entity classes (Car, CarType, User, Reservation)\n- **Service**: Services for business logic (CarService, ReservationService, UserService)\n- **Controller**: REST endpoints handling business logic routing\n- **View**: UI components for web interface\n\n### Design Patterns\n\n- **Factory Pattern**: Vehicle creation and type management, extensible for future vehicle types\n- **Repository Pattern**: Data access abstraction\n- **DTO Pattern**: Clean data transfer between layers\n- **Service Layer Pattern**: Business logic encapsulation\n\n## Project Structure\n\n### Core Components\n\n#### Entities\n\nEntities are the core domain objects that map directly to database tables and represent\nthe fundamental data structures of the car rental system.\n\n- `Car`: Vehicle representation: Active, Reserved, Maintenance\n- `CarType`: Vehicle category definition: Sedan, SUV, Van\n- `User`: User account details\n- `Reservation`: Reservation records: Active, Cancelled, Completed\n\n#### Repositories\n\nRepositories provide a clean abstraction layer for database operations, handling\nall CRUD (Create, Read, Update, Delete) operations for their respective entities.\n\n- `CarRepository`: Vehicle data access\n- `ReservationRepository`: Booking records management\n- `UserRepository`: User data persistence\n- `CarTypeRepository`: Vehicle categories management\n\n#### DTOs\n\nDTOs serve as lightweight data carriers that safely transfer information between the application\nlayers while hiding internal entity complexity.\n\n- `CarDTO`: Vehicle data transfer\n- `ReservationDTO`: Booking information transfer\n- `UserDTO`: User data transfer\n\n#### Services\n\nServices encapsulate the core business logic and rules, acting as the intermediary\nbetween controllers and repositories while enforcing domain-specific operations and validations.\n\n- `CarTypeService`: Handles vehicle type management and categorization logic\n- `CarService`: Vehicle inventory and availability logic\n- `ReservationService`: Booking management and validation\n- `UserService`: User authentication and profile management\n\n#### Controllers\n\nThe Controllers in this Car Rental system handle HTTP requests and orchestrate the flow\nbetween the frontend UI and backend services.\n\n- `CarTypeController`: Manages vehicle type operations and classifications\n- `CarController`: Handles vehicle operations\n- `ReservationController`: Manages booking flows\n- `UserController`: User management endpoints\n\n### Testing\n\nComprehensive integration tests covering:\n\n- Multiple reservation scenarios\n- Overlapping booking prevention\n- Multi-car type availability\n- Edge case handling\n\n## Class Architecture\n\n### Layred Architecture Diagram\n\nOutlines the separation of concerns and the flow of data between different layers of the application.\n\n```mermaid\ngraph TB\n    subgraph UI_Layer[Presentation Layer]\n        UI[UI Components]\n    end\n\n    subgraph Controller_Layer[Controller Layer]\n        CTRL[REST Controllers]\n    end\n\n    subgraph Service_Layer[Service Layer]\n        SVC[Business Services]\n        DTO[DTOs]\n        FAC[Factories]\n    end\n\n    subgraph Repository_Layer[Repository Layer]\n        REPO[JPA Repositories]\n        ENT[Entities]\n    end\n\n    subgraph Database_Layer[Database Layer]\n        H2[H2 In-Memory Database]\n    end\n\n    UI --\u003e CTRL\n    CTRL --\u003e SVC\n    SVC --\u003e REPO\n    REPO --\u003e H2\n\n    style UI_Layer fill:#2B5B84\n    style Controller_Layer fill:#1E4620\n    style Service_Layer fill:#8B4513\n    style Repository_Layer fill:#8B7355\n    style Database_Layer fill:#2F4F4F\n\n```\n\n### Class Diagram\n\n```mermaid\nclassDiagram\n    %% Core Domain Entities\n    class Car {\n        -Integer carId\n        -CarStatus status\n        -CarType type\n    }\n    class CarType {\n        -VehicleType type\n        -Integer typeId\n    }\n    class Reservation {\n        -Integer reservationId\n        -LocalDate startDate\n        -LocalDate endDate\n        -ReservationStatus status\n    }\n    class User {\n        -Integer userId\n        -String username\n        -String password\n    }\n\n    %% DTOs\n    class CarDTO {\n        -Integer carId\n        -CarStatus status\n        -VehicleType type\n    }\n    class ReservationDTO {\n        -LocalDate startDate\n        -LocalDate endDate\n        -CarDTO car\n        -UserDTO user\n    }\n    class UserDTO {\n        -Integer userId\n        -String firstName\n        -String lastName\n    }\n\n    %% Repositories\n    class CarRepository {\n        +findById(Integer) Car\n        +save(Car) Car\n    }\n    class ReservationRepository {\n        +findById(Integer) Reservation\n        +save(Reservation) Reservation\n    }\n    class UserRepository {\n        +findById(Integer) User\n        +save(User) User\n    }\n    class CarTypeRepository {\n        +findById(Integer) CarType\n        +findByVehicleType(VehicleType) CarType\n    }\n\n    %% Services\n    class CarTypeService {\n        +getAllCarTypes() List\u003cCarTypeDTO\u003e\n        +getCarTypeById(Integer) CarTypeDTO\n        -convertToDTO(CarType) CarTypeDTO\n    }\n    class CarService {\n        +getCar(Integer) CarDTO\n        +updateCarStatus(Integer, Status) CarDTO\n    }\n    class ReservationService {\n        +createReservation(ReservationDTO) ReservationDTO\n        +getReservation(Integer) ReservationDTO\n    }\n    class UserService {\n        +getUser(Integer) UserDTO\n        +createUser(UserDTO) UserDTO\n    }\n\n    %% Controllers\n    class CarTypeController {\n        +getAllCarTypes() List\u003cCarTypeDTO\u003e\n        +getCarTypeById(Integer) CarTypeDTO\n    }\n\n    class CarController {\n        +getCar(Integer) ResponseEntity\n        +updateCar(CarDTO) ResponseEntity\n    }\n    class ReservationController {\n        +createReservation(ReservationDTO) ResponseEntity\n        +getReservation(Integer) ResponseEntity\n    }\n    class UserController {\n        +getUser(Integer) ResponseEntity\n        +createUser(UserDTO) ResponseEntity\n    }\n\n    %% Factory\n    class CarFactory {\n        +createCar(CarDTO) Car\n        +createCarDTO(Car) CarDTO\n    }\n\n    %% Relationships\n    Car --\u003e CarType\n    Reservation --\u003e Car\n    Reservation --\u003e User\n\n    CarTypeController --\u003e CarTypeService\n    CarController --\u003e CarService\n    ReservationController --\u003e ReservationService\n    UserController --\u003e UserService\n\n    CarTypeService --\u003e CarTypeRepository\n    CarTypeService --\u003e CarTypeDTO\n    CarService --\u003e CarRepository\n    CarService --\u003e CarFactory\n    CarService --\u003e CarDTO\n    ReservationService --\u003e ReservationRepository\n    ReservationService --\u003e ReservationDTO\n    UserService --\u003e UserRepository\n    UserService --\u003e UserDTO\n\n    CarFactory ..\u003e Car : creates\n    CarFactory ..\u003e CarDTO : creates\n\n    CarTypeDTO ..\u003e CarType : transforms\n    CarDTO ..\u003e Car : transforms\n    ReservationDTO ..\u003e Reservation : transforms\n    UserDTO ..\u003e User : transforms\n\n    CarRepository ..\u003e Car : persists\n    ReservationRepository ..\u003e Reservation : persists\n    UserRepository ..\u003e User : persists\n    CarTypeRepository ..\u003e CarType : persists\n\n```\n\n## Dependencies\n\n```\n\n\u003cdependencies\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n        \u003cartifactId\u003espring-boot-starter-web\u003c/artifactId\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n        \u003cartifactId\u003espring-boot-starter-data-jpa\u003c/artifactId\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.vaadin\u003c/groupId\u003e\n        \u003cartifactId\u003evaadin-spring-boot-starter\u003c/artifactId\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.h2database\u003c/groupId\u003e\n        \u003cartifactId\u003eh2\u003c/artifactId\u003e\n        \u003cscope\u003eruntime\u003c/scope\u003e\n    \u003c/dependency\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n        \u003cartifactId\u003espring-boot-starter-test\u003c/artifactId\u003e\n        \u003cscope\u003etest\u003c/scope\u003e\n    \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n## Features\n\n- Car reservation system\n- Multiple vehicle type support\n- User management\n- Booking validation\n- Real-time availability tracking\n- H2 in-memory database\n- Vaadin-based UI\n\n## Getting Started\n\n- Clone the repository\n- Run `mvn clean install`\n- Test the application with `mvn test`\n- Run specific business integration tests with `mvn test -Dtest=ReservationServiceIntegrationTest`\n- Start the application with `mvn spring-boot:run`\n- Access the H2 console at `/h2-console`\n- Access the application at `localhost:8080`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmickelson%2Fcarrentalproject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmickelson%2Fcarrentalproject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmickelson%2Fcarrentalproject/lists"}