├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── src ├── main │ ├── java │ │ └── kodlama │ │ │ └── io │ │ │ └── rentacar │ │ │ ├── business │ │ │ ├── abstracts │ │ │ │ ├── PosService.java │ │ │ │ ├── BrandService.java │ │ │ │ ├── ModelService.java │ │ │ │ ├── RentalService.java │ │ │ │ ├── InvoiceService.java │ │ │ │ ├── CarService.java │ │ │ │ ├── MaintenanceService.java │ │ │ │ └── PaymentService.java │ │ │ ├── dto │ │ │ │ ├── requests │ │ │ │ │ ├── create │ │ │ │ │ │ ├── CreateBrandRequest.java │ │ │ │ │ │ ├── CreateModelRequest.java │ │ │ │ │ │ ├── CreateMaintenanceRequest.java │ │ │ │ │ │ ├── CreatePaymentRequest.java │ │ │ │ │ │ ├── CreateRentalRequest.java │ │ │ │ │ │ ├── CreateInvoiceRequest.java │ │ │ │ │ │ └── CreateCarRequest.java │ │ │ │ │ ├── update │ │ │ │ │ │ ├── UpdateBrandRequest.java │ │ │ │ │ │ ├── UpdateModelRequest.java │ │ │ │ │ │ ├── UpdateRentalRequest.java │ │ │ │ │ │ ├── UpdateCarRequest.java │ │ │ │ │ │ ├── UpdateMaintenanceRequest.java │ │ │ │ │ │ ├── UpdatePaymentRequest.java │ │ │ │ │ │ └── UpdateInvoiceRequest.java │ │ │ │ │ └── PaymentRequest.java │ │ │ │ └── responses │ │ │ │ │ ├── get │ │ │ │ │ ├── GetBrandResponse.java │ │ │ │ │ ├── GetAllBrandsResponse.java │ │ │ │ │ ├── GetModelResponse.java │ │ │ │ │ ├── GetAllModelsResponse.java │ │ │ │ │ ├── GetPaymentResponse.java │ │ │ │ │ ├── GetRentalResponse.java │ │ │ │ │ ├── GetAllRentalsResponse.java │ │ │ │ │ ├── GetAllPaymentsResponse.java │ │ │ │ │ ├── GetMaintenanceResponse.java │ │ │ │ │ ├── GetAllMaintenancesResponse.java │ │ │ │ │ ├── GetCarResponse.java │ │ │ │ │ ├── GetAllCarsResponse.java │ │ │ │ │ ├── GetInvoiceResponse.java │ │ │ │ │ └── GetAllInvoicesResponse.java │ │ │ │ │ ├── update │ │ │ │ │ ├── UpdateBrandResponse.java │ │ │ │ │ ├── UpdateModelResponse.java │ │ │ │ │ ├── UpdateCarResponse.java │ │ │ │ │ ├── UpdatePaymentResponse.java │ │ │ │ │ ├── UpdateRentalResponse.java │ │ │ │ │ ├── UpdateMaintenanceResponse.java │ │ │ │ │ └── UpdateInvoiceResponse.java │ │ │ │ │ └── create │ │ │ │ │ ├── CreateBrandResponse.java │ │ │ │ │ ├── CreateModelResponse.java │ │ │ │ │ ├── CreateCarResponse.java │ │ │ │ │ ├── CreateRentalResponse.java │ │ │ │ │ ├── CreatePaymentResponse.java │ │ │ │ │ ├── CreateMaintenanceResponse.java │ │ │ │ │ └── CreateInvoiceResponse.java │ │ │ ├── rules │ │ │ │ ├── CarBusinessRules.java │ │ │ │ ├── ModelBusinessRules.java │ │ │ │ ├── InvoiceBusinessRules.java │ │ │ │ ├── BrandBusinessRules.java │ │ │ │ ├── RentalBusinessRules.java │ │ │ │ ├── MaintenanceBusinessRules.java │ │ │ │ └── PaymentBusinessRules.java │ │ │ └── concretes │ │ │ │ ├── ModelManager.java │ │ │ │ ├── BrandManager.java │ │ │ │ ├── InvoiceManager.java │ │ │ │ ├── CarManager.java │ │ │ │ ├── PaymentManager.java │ │ │ │ ├── MaintenanceManager.java │ │ │ │ └── RentalManager.java │ │ │ ├── entities │ │ │ ├── enums │ │ │ │ └── State.java │ │ │ ├── Brand.java │ │ │ ├── Payment.java │ │ │ ├── Model.java │ │ │ ├── Rental.java │ │ │ ├── Maintenance.java │ │ │ ├── Invoice.java │ │ │ └── Car.java │ │ │ ├── common │ │ │ ├── constants │ │ │ │ ├── Regex.java │ │ │ │ ├── ExceptionTypes.java │ │ │ │ └── Messages.java │ │ │ ├── dto │ │ │ │ └── CreateRentalPaymentRequest.java │ │ │ └── utils │ │ │ │ └── annotations │ │ │ │ ├── NotFutureYearValidator.java │ │ │ │ └── NotFutureYear.java │ │ │ ├── core │ │ │ ├── exceptions │ │ │ │ └── BusinessException.java │ │ │ ├── utils │ │ │ │ └── results │ │ │ │ │ └── ExceptionResult.java │ │ │ └── configuration │ │ │ │ └── exceptions │ │ │ │ └── RestExceptionHandler.java │ │ │ ├── repository │ │ │ ├── InvoiceRepository.java │ │ │ ├── ModelRepository.java │ │ │ ├── RentalRepository.java │ │ │ ├── BrandRepository.java │ │ │ ├── CarRepository.java │ │ │ ├── MaintenanceRepository.java │ │ │ └── PaymentRepository.java │ │ │ ├── configuration │ │ │ └── mapper │ │ │ │ └── ModelMapperConfig.java │ │ │ ├── RentACarApplication.java │ │ │ ├── adapters │ │ │ └── FakePosServiceAdapter.java │ │ │ └── api │ │ │ └── controllers │ │ │ ├── PaymentsController.java │ │ │ ├── BrandsController.java │ │ │ ├── ModelsController.java │ │ │ ├── RentalsController.java │ │ │ ├── InvoicesController.java │ │ │ ├── CarsController.java │ │ │ └── MaintenancesController.java │ └── resources │ │ └── application.properties └── test │ └── java │ └── kodlama │ └── io │ └── rentacar │ └── RentACarApplicationTests.java ├── .gitignore ├── pom.xml ├── mvnw.cmd └── mvnw /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kalayciburak-instruction/turkcell2-rent-a-car/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/PosService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | public interface PosService { 4 | void pay(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/enums/State.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities.enums; 2 | 3 | public enum State { 4 | AVAILABLE, 5 | RENTED, 6 | MAINTENANCE 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/constants/Regex.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.constants; 2 | 3 | public class Regex { 4 | public final static String Plate = "^(0[1-9]|[1-7][0-9]|8[01]) [A-Z]{1,3} \\d{3,4}$"; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/core/exceptions/BusinessException.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.core.exceptions; 2 | 3 | public class BusinessException extends RuntimeException { 4 | public BusinessException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/InvoiceRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Invoice; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface InvoiceRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/ModelRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Model; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface ModelRepository extends JpaRepository { 7 | } 8 | 9 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/RentalRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Rental; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface RentalRepository extends JpaRepository { 7 | } 8 | -------------------------------------------------------------------------------- /src/test/java/kodlama/io/rentacar/RentACarApplicationTests.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class RentACarApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect 2 | spring.jpa.hibernate.ddl-auto=update 3 | spring.datasource.url=jdbc:postgresql://localhost:5432/turkcell2-rentacardb 4 | spring.datasource.username=postgres 5 | spring.datasource.password=12345 6 | spring.jpa.properties.javax.persistence.validation.mode=none -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/BrandRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Brand; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | // CRUD operations 7 | public interface BrandRepository extends JpaRepository { 8 | boolean existsByNameIgnoreCase(String name); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateBrandRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreateBrandRequest { 13 | private String name; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateBrandRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class UpdateBrandRequest { 13 | private String name; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/CarRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Car; 4 | import kodlama.io.rentacar.entities.enums.State; 5 | import org.springframework.data.jpa.repository.JpaRepository; 6 | 7 | import java.util.List; 8 | 9 | public interface CarRepository extends JpaRepository { 10 | List findAllByStateIsNot(State state); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateModelRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreateModelRequest { 13 | private int brandId; 14 | private String name; 15 | } -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateModelRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class UpdateModelRequest { 13 | private int brandId; 14 | private String name; 15 | } -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetBrandResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetBrandResponse { 13 | private int id; 14 | private String name; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllBrandsResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetAllBrandsResponse { 13 | private int id; 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateBrandResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class UpdateBrandResponse { 13 | private int id; 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateBrandResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreateBrandResponse { 13 | private int id; 14 | private String name; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/configuration/mapper/ModelMapperConfig.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.configuration.mapper; 2 | 3 | import org.modelmapper.ModelMapper; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | public class ModelMapperConfig { 9 | @Bean 10 | public ModelMapper getModelMapper() { 11 | return new ModelMapper(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetModelResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetModelResponse { 13 | private int id; 14 | private int brandId; 15 | private String name; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateMaintenanceRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreateMaintenanceRequest { 13 | private int carId; 14 | private String information; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllModelsResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetAllModelsResponse { 13 | private int id; 14 | private int brandId; 15 | private String name; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateModelResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class UpdateModelResponse { 13 | private int id; 14 | private int brandId; 15 | private String name; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateModelResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreateModelResponse { 13 | private int id; 14 | private int brandId; 15 | private String name; 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/dto/CreateRentalPaymentRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.dto; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.PaymentRequest; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class CreateRentalPaymentRequest extends PaymentRequest { 14 | private double price; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/RentACarApplication.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cache.annotation.EnableCaching; 6 | 7 | @EnableCaching 8 | @SpringBootApplication 9 | public class RentACarApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(RentACarApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/constants/ExceptionTypes.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.constants; 2 | 3 | public class ExceptionTypes { 4 | public static class Exception { 5 | public static final String Validation = "VALIDATION_EXCEPTION"; 6 | public static final String Business = "BUSINESS_EXCEPTION"; 7 | public static final String Runtime = "RUNTIME_EXCEPTION"; 8 | public static final String DataIntegrityViolation = "DATA_INTEGRITY_VIOLATION_EXCEPTION"; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/MaintenanceRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Maintenance; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface MaintenanceRepository extends JpaRepository { 7 | // @Nonnull 8 | // Maintenance findById(int id); 9 | Maintenance findMaintenanceByCarIdAndIsCompletedFalse(int carId); 10 | boolean existsByCarIdAndIsCompletedIsFalse(int carId); 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/core/utils/results/ExceptionResult.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.core.utils.results; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.time.LocalDateTime; 7 | 8 | @Setter 9 | @Getter 10 | public class ExceptionResult { 11 | private LocalDateTime timestamp; 12 | private String type; 13 | private T message; 14 | 15 | public ExceptionResult(String type, T message) { 16 | timestamp = LocalDateTime.now(); 17 | this.type = type; 18 | this.message = message; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateRentalRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateRentalRequest { 15 | private int carId; 16 | private double dailyPrice; 17 | private int rentedForDays; 18 | private LocalDateTime startDate; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreatePaymentRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import kodlama.io.rentacar.business.dto.requests.PaymentRequest; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | import lombok.Setter; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class CreatePaymentRequest extends PaymentRequest { 15 | @Min(value = 1) 16 | private double balance; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateCarRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import kodlama.io.rentacar.entities.enums.State; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class UpdateCarRequest { 14 | private int modelId; 15 | private double dailyPrice; 16 | private int modelYear; 17 | private String plate; 18 | private State state; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/utils/annotations/NotFutureYearValidator.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.utils.annotations; 2 | 3 | import jakarta.validation.ConstraintValidator; 4 | import jakarta.validation.ConstraintValidatorContext; 5 | 6 | import java.time.Year; 7 | 8 | public class NotFutureYearValidator implements ConstraintValidator { 9 | @Override 10 | public boolean isValid(Integer value, ConstraintValidatorContext context) { 11 | int currentYear = Year.now().getValue(); 12 | return value <= currentYear; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateCarResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import kodlama.io.rentacar.entities.enums.State; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class CreateCarResponse { 14 | private int id; 15 | private int modelId; 16 | private double dailyPrice; 17 | private int modelYear; 18 | private String plate; 19 | private State state; 20 | } -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateCarResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import kodlama.io.rentacar.entities.enums.State; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class UpdateCarResponse { 14 | private int id; 15 | private int modelId; 16 | private double dailyPrice; 17 | private int modelYear; 18 | private String plate; 19 | private State state; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateMaintenanceRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateMaintenanceRequest { 15 | private int carId; 16 | private String information; 17 | private boolean isCompleted; 18 | private LocalDateTime startDate; 19 | private LocalDateTime endDate; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetPaymentResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetPaymentResponse { 13 | private int id; 14 | private String cardNumber; 15 | private String cardHolder; 16 | private int cardExpirationYear; 17 | private int cardExpirationMonth; 18 | private String cardCvv; 19 | private double balance; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetRentalResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetRentalResponse { 15 | private int id; 16 | private int carId; 17 | private double dailyPrice; 18 | private int rentedForDays; 19 | private double totalPrice; 20 | private LocalDateTime startDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateRentalRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.PaymentRequest; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class CreateRentalRequest { 14 | private int carId; 15 | private double dailyPrice; 16 | private int rentedForDays; 17 | // Kart bilgileri 18 | private PaymentRequest paymentRequest; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateRentalResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class CreateRentalResponse { 15 | private int id; 16 | private int carId; 17 | private double dailyPrice; 18 | private int rentedForDays; 19 | private double totalPrice; 20 | private LocalDateTime startDate; 21 | } -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllRentalsResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetAllRentalsResponse { 15 | private int id; 16 | private int carId; 17 | private double dailyPrice; 18 | private int rentedForDays; 19 | private double totalPrice; 20 | private LocalDateTime startDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreatePaymentResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class CreatePaymentResponse { 13 | private int id; 14 | private String cardNumber; 15 | private String cardHolder; 16 | private int cardExpirationYear; 17 | private int cardExpirationMonth; 18 | private String cardCvv; 19 | private double balance; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdatePaymentResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class UpdatePaymentResponse { 13 | private int id; 14 | private String cardNumber; 15 | private String cardHolder; 16 | private int cardExpirationYear; 17 | private int cardExpirationMonth; 18 | private String cardCvv; 19 | private double balance; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateRentalResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateRentalResponse { 15 | private int id; 16 | private int carId; 17 | private double dailyPrice; 18 | private int rentedForDays; 19 | private double totalPrice; 20 | private LocalDateTime startDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllPaymentsResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class GetAllPaymentsResponse { 13 | private int id; 14 | private String cardNumber; 15 | private String cardHolder; 16 | private int cardExpirationYear; 17 | private int cardExpirationMonth; 18 | private String cardCvv; 19 | private double balance; 20 | } 21 | 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetMaintenanceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetMaintenanceResponse { 15 | private int id; 16 | private int carId; 17 | private String information; 18 | private boolean isCompleted; 19 | private LocalDateTime startDate; 20 | private LocalDateTime endDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllMaintenancesResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetAllMaintenancesResponse { 15 | private int id; 16 | private int carId; 17 | private String information; 18 | private boolean isCompleted; 19 | private LocalDateTime startDate; 20 | private LocalDateTime endDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateMaintenanceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateMaintenanceResponse { 15 | private int id; 16 | private int carId; 17 | private String information; 18 | private boolean isCompleted; 19 | private LocalDateTime startDate; 20 | private LocalDateTime endDate; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdatePaymentRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import jakarta.validation.constraints.NotNull; 5 | import kodlama.io.rentacar.business.dto.requests.PaymentRequest; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | import lombok.NoArgsConstructor; 9 | import lombok.Setter; 10 | 11 | @Setter 12 | @Getter 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class UpdatePaymentRequest extends PaymentRequest { 16 | @NotNull 17 | @Min(value = 1) 18 | private double balance; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateMaintenanceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class CreateMaintenanceResponse { 15 | private int id; 16 | private int carId; 17 | private String information; 18 | private boolean isCompleted; 19 | private LocalDateTime startDate; 20 | private LocalDateTime endDate; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/adapters/FakePosServiceAdapter.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.adapters; 2 | 3 | import kodlama.io.rentacar.business.abstracts.PosService; 4 | import kodlama.io.rentacar.common.constants.Messages; 5 | import kodlama.io.rentacar.core.exceptions.BusinessException; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.Random; 9 | 10 | @Service 11 | public class FakePosServiceAdapter implements PosService { 12 | @Override 13 | public void pay() { 14 | boolean isPaymentSuccessful = new Random().nextBoolean(); 15 | if (!isPaymentSuccessful) throw new BusinessException(Messages.Payment.Failed); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetCarResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import kodlama.io.rentacar.entities.enums.State; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class GetCarResponse { 14 | private int id; 15 | private int modelId; 16 | private double dailyPrice; 17 | private int modelYear; 18 | private String plate; 19 | private State state; 20 | private String modelName; 21 | private String modelBrandName; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Brand.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | import java.util.List; 10 | 11 | // code first 12 | @Entity 13 | @Setter 14 | @Getter 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Table(name = "brands") 18 | public class Brand { 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | private int id; 22 | private String name; 23 | @OneToMany(mappedBy = "brand") 24 | // @JsonBackReference 25 | private List models; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllCarsResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import kodlama.io.rentacar.entities.enums.State; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Setter 10 | @Getter 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class GetAllCarsResponse { 14 | private int id; 15 | private int modelId; 16 | private double dailyPrice; 17 | private int modelYear; 18 | private String plate; 19 | private State state; 20 | // private String modelName; 21 | // private String modelBrandName; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/CarBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.repository.CarRepository; 6 | import lombok.AllArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @AllArgsConstructor 11 | public class CarBusinessRules { 12 | private final CarRepository repository; 13 | 14 | public void checkIfCarExists(int id) { 15 | if (!repository.existsById(id)) { 16 | throw new BusinessException(Messages.Car.NotExists); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/update/UpdateInvoiceRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateInvoiceRequest { 15 | private String cardHolder; 16 | private String modelName; 17 | private String brandName; 18 | private String plate; 19 | private int modelYear; 20 | private double dailyPrice; 21 | private int rentedForDays; 22 | private LocalDateTime rentedAt; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/ModelBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.repository.ModelRepository; 6 | import lombok.AllArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @AllArgsConstructor 11 | public class ModelBusinessRules { 12 | private final ModelRepository repository; 13 | 14 | public void checkIfModelExists(int id) { 15 | if (!repository.existsById(id)) { 16 | throw new BusinessException(Messages.Model.NotExists); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateInvoiceRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class CreateInvoiceRequest { 15 | private String cardHolder; 16 | private String modelName; 17 | private String brandName; 18 | private String plate; 19 | private int modelYear; 20 | private double dailyPrice; 21 | private int rentedForDays; 22 | private LocalDateTime rentedAt; 23 | } 24 | 25 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Payment.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | @Entity 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | @Table(name = "payments") 15 | public class Payment { 16 | @Id 17 | @GeneratedValue(strategy = GenerationType.IDENTITY) 18 | private int id; 19 | private String cardNumber; 20 | private String cardHolder; 21 | private int cardExpirationYear; 22 | private int cardExpirationMonth; 23 | private String cardCvv; 24 | private double balance; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/InvoiceBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.repository.InvoiceRepository; 6 | import lombok.AllArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @AllArgsConstructor 11 | public class InvoiceBusinessRules { 12 | private final InvoiceRepository repository; 13 | 14 | public void checkIfInvoiceExists(int id) { 15 | if (!repository.existsById(id)) { 16 | throw new BusinessException(Messages.Invoice.NotFound); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Model.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | import java.util.List; 10 | 11 | @Entity 12 | @Setter 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Table(name = "models") 17 | public class Model { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private int id; 21 | private String name; 22 | @ManyToOne 23 | // @JsonManagedReference 24 | private Brand brand; // brandId 25 | @OneToMany(mappedBy = "model") 26 | // @JsonBackReference 27 | private List cars; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetInvoiceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetInvoiceResponse { 15 | private int id; 16 | private String cardHolder; 17 | private String modelName; 18 | private String brandName; 19 | private String plate; 20 | private int modelYear; 21 | private double dailyPrice; 22 | private double totalPrice; 23 | private int rentedForDays; 24 | private LocalDateTime rentedAt; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/create/CreateInvoiceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.create; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class CreateInvoiceResponse { 15 | private int id; 16 | private String cardHolder; 17 | private String modelName; 18 | private String brandName; 19 | private String plate; 20 | private int modelYear; 21 | private double dailyPrice; 22 | private double totalPrice; 23 | private int rentedForDays; 24 | private LocalDateTime rentedAt; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/get/GetAllInvoicesResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.get; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class GetAllInvoicesResponse { 15 | private int id; 16 | private String cardHolder; 17 | private String modelName; 18 | private String brandName; 19 | private String plate; 20 | private int modelYear; 21 | private double dailyPrice; 22 | private double totalPrice; 23 | private int rentedForDays; 24 | private LocalDateTime rentedAt; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/responses/update/UpdateInvoiceResponse.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.responses.update; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | @Setter 11 | @Getter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UpdateInvoiceResponse { 15 | private int id; 16 | private String cardHolder; 17 | private String modelName; 18 | private String brandName; 19 | private String plate; 20 | private int modelYear; 21 | private double dailyPrice; 22 | private double totalPrice; 23 | private int rentedForDays; 24 | private LocalDateTime rentedAt; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Rental.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | @Entity 12 | @Setter 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Table(name = "rentals") 17 | public class Rental { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private int id; 21 | private double dailyPrice; 22 | private int rentedForDays; 23 | private double totalPrice; 24 | private LocalDateTime startDate; 25 | 26 | @ManyToOne 27 | @JoinColumn(name = "car_id") 28 | private Car car; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Maintenance.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | @Entity 12 | @Setter 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Table(name = "maintenances") 17 | public class Maintenance { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private int id; 21 | private String information; 22 | private boolean isCompleted; 23 | private LocalDateTime startDate; 24 | private LocalDateTime endDate; 25 | 26 | @ManyToOne 27 | @JoinColumn(name = "car_id") 28 | private Car car; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/create/CreateCarRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests.create; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import jakarta.validation.constraints.Pattern; 5 | import kodlama.io.rentacar.common.constants.Regex; 6 | import kodlama.io.rentacar.common.utils.annotations.NotFutureYear; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | import lombok.Setter; 11 | 12 | @Setter 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class CreateCarRequest { 17 | private int modelId; 18 | @Min(1) 19 | private double dailyPrice; 20 | @Min(1998) 21 | @NotFutureYear 22 | private int modelYear; 23 | @Pattern(regexp = Regex.Plate) 24 | private String plate; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Invoice.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | @Entity 12 | @Setter 13 | @Getter 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Table(name = "invoices") 17 | public class Invoice { 18 | @Id 19 | @GeneratedValue(strategy = GenerationType.IDENTITY) 20 | private int id; 21 | private String cardHolder; 22 | private String modelName; 23 | private String brandName; 24 | private String plate; 25 | private int modelYear; 26 | private double dailyPrice; 27 | private double totalPrice; 28 | private int rentedForDays; 29 | private LocalDateTime rentedAt; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/BrandBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.repository.BrandRepository; 6 | import lombok.AllArgsConstructor; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | @AllArgsConstructor 11 | public class BrandBusinessRules { 12 | private final BrandRepository repository; 13 | 14 | public void checkIfBrandExists(int id) { 15 | if (!repository.existsById(id)) throw new BusinessException(Messages.Brand.NotExists); 16 | } 17 | 18 | public void checkIfBrandExistsByName(String name) { 19 | if (repository.existsByNameIgnoreCase(name)) { 20 | throw new BusinessException(Messages.Brand.Exists); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/BrandService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateBrandRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateBrandRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateBrandResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllBrandsResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetBrandResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateBrandResponse; 9 | 10 | import java.util.List; 11 | 12 | public interface BrandService { 13 | List getAll(); 14 | GetBrandResponse getById(int id); 15 | CreateBrandResponse add(CreateBrandRequest request); 16 | UpdateBrandResponse update(int id, UpdateBrandRequest request); 17 | void delete(int id); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/ModelService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateModelRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateModelRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateModelResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllModelsResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetModelResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateModelResponse; 9 | 10 | import java.util.List; 11 | 12 | public interface ModelService { 13 | List getAll(); 14 | GetModelResponse getById(int id); 15 | CreateModelResponse add(CreateModelRequest request); 16 | UpdateModelResponse update(int id, UpdateModelRequest request); 17 | void delete(int id); 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/RentalService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateRentalRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateRentalRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateRentalResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllRentalsResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetRentalResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateRentalResponse; 9 | 10 | import java.util.List; 11 | 12 | public interface RentalService { 13 | List getAll(); 14 | GetRentalResponse getById(int id); 15 | CreateRentalResponse add(CreateRentalRequest request); 16 | UpdateRentalResponse update(int id, UpdateRentalRequest request); 17 | void delete(int id); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/InvoiceService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateInvoiceRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateInvoiceRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateInvoiceResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllInvoicesResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetInvoiceResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateInvoiceResponse; 9 | 10 | import java.util.List; 11 | 12 | public interface InvoiceService { 13 | List getAll(); 14 | GetInvoiceResponse getById(int id); 15 | CreateInvoiceResponse add(CreateInvoiceRequest request); 16 | UpdateInvoiceResponse update(int id, UpdateInvoiceRequest request); 17 | void delete(int id); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/utils/annotations/NotFutureYear.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.utils.annotations; 2 | 3 | import jakarta.validation.Constraint; 4 | import jakarta.validation.Payload; 5 | 6 | import java.lang.annotation.ElementType; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | 11 | @Target({ElementType.FIELD, ElementType.PARAMETER}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Constraint(validatedBy = NotFutureYearValidator.class) 14 | public @interface NotFutureYear { 15 | String message() default "Model year value cannot be in the future"; 16 | //? Farklı kullanıcı gruplarına özelleştirilmiş işlemler veya özellikler tanımlamak için kullanılır. 17 | Class[] groups() default {}; 18 | //? veri transfer nesnelerinde belirli bir grubun mesajlarını taşımak için kullanılır. 19 | Class[] payload() default {}; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/entities/Car.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.entities; 2 | 3 | import jakarta.persistence.*; 4 | import kodlama.io.rentacar.entities.enums.State; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | import lombok.NoArgsConstructor; 8 | import lombok.Setter; 9 | 10 | import java.util.List; 11 | 12 | @Entity 13 | @Setter 14 | @Getter 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | @Table(name = "cars") 18 | public class Car { 19 | @Id 20 | @GeneratedValue(strategy = GenerationType.IDENTITY) 21 | private int id; 22 | private int modelYear; 23 | private String plate; 24 | private double dailyPrice; 25 | @Enumerated(EnumType.STRING) 26 | private State state; 27 | 28 | @ManyToOne 29 | private Model model; 30 | 31 | @OneToMany(mappedBy = "car") 32 | private List maintenances; 33 | 34 | @OneToMany(mappedBy = "car") 35 | private List rentals; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/RentalBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.entities.enums.State; 6 | import kodlama.io.rentacar.repository.RentalRepository; 7 | import lombok.AllArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | @AllArgsConstructor 12 | public class RentalBusinessRules { 13 | private final RentalRepository repository; 14 | 15 | public void checkIfRentalExists(int id) { 16 | if (!repository.existsById(id)) { 17 | throw new BusinessException(Messages.Rental.NotExists); 18 | } 19 | } 20 | 21 | public void checkIfCarAvailable(State state) { 22 | if (!state.equals(State.AVAILABLE)) { 23 | throw new BusinessException(Messages.Car.NotAvailable); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/CarService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateCarRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateCarRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateCarResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllCarsResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetCarResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateCarResponse; 9 | import kodlama.io.rentacar.entities.enums.State; 10 | 11 | import java.util.List; 12 | 13 | public interface CarService { 14 | List getAll(boolean includeMaintenance); 15 | GetCarResponse getById(int id); 16 | CreateCarResponse add(CreateCarRequest request); 17 | UpdateCarResponse update(int id, UpdateCarRequest request); 18 | void delete(int id); 19 | void changeState(int carId, State state); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/MaintenanceService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreateMaintenanceRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdateMaintenanceRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreateMaintenanceResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllMaintenancesResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetMaintenanceResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdateMaintenanceResponse; 9 | 10 | import java.util.List; 11 | 12 | public interface MaintenanceService { 13 | List getAll(); 14 | GetMaintenanceResponse getById(int id); 15 | GetMaintenanceResponse returnCarFromMaintenance(int carId); 16 | CreateMaintenanceResponse add(CreateMaintenanceRequest request); 17 | UpdateMaintenanceResponse update(int id, UpdateMaintenanceRequest request); 18 | void delete(int id); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/abstracts/PaymentService.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.abstracts; 2 | 3 | import kodlama.io.rentacar.business.dto.requests.create.CreatePaymentRequest; 4 | import kodlama.io.rentacar.business.dto.requests.update.UpdatePaymentRequest; 5 | import kodlama.io.rentacar.business.dto.responses.create.CreatePaymentResponse; 6 | import kodlama.io.rentacar.business.dto.responses.get.GetAllPaymentsResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetPaymentResponse; 8 | import kodlama.io.rentacar.business.dto.responses.update.UpdatePaymentResponse; 9 | import kodlama.io.rentacar.common.dto.CreateRentalPaymentRequest; 10 | 11 | import java.util.List; 12 | 13 | public interface PaymentService { 14 | List getAll(); 15 | GetPaymentResponse getById(int id); 16 | CreatePaymentResponse add(CreatePaymentRequest request); 17 | UpdatePaymentResponse update(int id, UpdatePaymentRequest request); 18 | void delete(int id); 19 | void processRentalPayment(CreateRentalPaymentRequest request); 20 | } 21 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # https://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, 12 | # software distributed under the License is distributed on an 13 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 14 | # KIND, either express or implied. See the License for the 15 | # specific language governing permissions and limitations 16 | # under the License. 17 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip 18 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar 19 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/dto/requests/PaymentRequest.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.dto.requests; 2 | 3 | import jakarta.validation.constraints.Max; 4 | import jakarta.validation.constraints.Min; 5 | import jakarta.validation.constraints.NotBlank; 6 | import jakarta.validation.constraints.NotNull; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Getter; 9 | import lombok.NoArgsConstructor; 10 | import lombok.Setter; 11 | import org.hibernate.validator.constraints.Length; 12 | 13 | @Setter 14 | @Getter 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class PaymentRequest { // Base/Super class 18 | @NotBlank(message = "Kart numarası boş bırakılamaz.") 19 | @Length(min = 16, max = 16, message = "Kart numarası 16 haneden oluşmak zorunda.") 20 | private String cardNumber; 21 | 22 | @NotBlank 23 | @Length(min = 5) 24 | private String cardHolder; 25 | 26 | @Min(value = 2023) 27 | private int cardExpirationYear; 28 | 29 | @Max(value = 12) 30 | @Min(value = 1) 31 | private int cardExpirationMonth; 32 | 33 | @NotNull 34 | @NotBlank 35 | @Length(min = 3, max = 3) 36 | private String cardCvv; 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/repository/PaymentRepository.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.repository; 2 | 3 | import kodlama.io.rentacar.entities.Payment; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface PaymentRepository extends JpaRepository { 7 | Payment findByCardNumber(String cardNumber); 8 | boolean existsByCardNumber(String cardNumber); 9 | boolean existsByCardNumberAndCardHolderAndCardExpirationYearAndCardExpirationMonthAndCardCvv( 10 | String cardNumber, String cardHolder, int cardExpirationYear, int cardExpirationMonth, String cardCvv 11 | ); 12 | 13 | // SPeL -> Spring Experssion Language 14 | // @Query("SELECT CASE WHEN COUNT(p) > 0 THEN true ELSE false END " + 15 | // "FROM Payment p WHERE p.cardNumber = :#{#paymentRequest.cardNumber}" + 16 | // " AND p.cardHolder = :#{#paymentRequest.cardHolder} AND" + 17 | // " p.cardExpirationYear = :#{#paymentRequest.cardExpirationYear} AND" + 18 | // " p.cardExpirationMonth = :#{#paymentRequest.cardExpirationMonth} AND" + 19 | // " p.cardCvv = :#{#paymentRequest.cardCvv}") 20 | // boolean existsByCardNumberAndCardHolderAndCardExpirationYearAndCardExpirationMonthAndCardCvv( 21 | // @Param("paymentRequest") PaymentRequest paymentRequest); 22 | } -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/MaintenanceBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.core.exceptions.BusinessException; 5 | import kodlama.io.rentacar.entities.enums.State; 6 | import kodlama.io.rentacar.repository.MaintenanceRepository; 7 | import lombok.AllArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | @AllArgsConstructor 12 | public class MaintenanceBusinessRules { 13 | private final MaintenanceRepository repository; 14 | 15 | public void checkIfMaintenanceExists(int id) { 16 | if (!repository.existsById(id)) { 17 | throw new BusinessException(Messages.Maintenance.NotExists); 18 | } 19 | } 20 | 21 | public void checkIfCarUnderMaintenance(int carId) { 22 | if (repository.existsByCarIdAndIsCompletedIsFalse(carId)) { 23 | throw new BusinessException(Messages.Maintenance.CarExists); 24 | } 25 | } 26 | 27 | public void checkIfCarIsNotUnderMaintenance(int carId) { 28 | if (!repository.existsByCarIdAndIsCompletedIsFalse(carId)) { 29 | throw new BusinessException(Messages.Maintenance.CarNotExists); 30 | } 31 | } 32 | 33 | public void checkCarAvailabilityForMaintenance(State state) { 34 | if (state.equals(State.RENTED)) { 35 | throw new BusinessException(Messages.Maintenance.CarIsRented); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/PaymentsController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import jakarta.validation.Valid; 4 | import kodlama.io.rentacar.business.abstracts.PaymentService; 5 | import kodlama.io.rentacar.business.dto.requests.create.CreatePaymentRequest; 6 | import kodlama.io.rentacar.business.dto.requests.update.UpdatePaymentRequest; 7 | import kodlama.io.rentacar.business.dto.responses.create.CreatePaymentResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetAllPaymentsResponse; 9 | import kodlama.io.rentacar.business.dto.responses.get.GetPaymentResponse; 10 | import kodlama.io.rentacar.business.dto.responses.update.UpdatePaymentResponse; 11 | import lombok.AllArgsConstructor; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/payments") 19 | public class PaymentsController { 20 | private final PaymentService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetPaymentResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | public CreatePaymentResponse add(@Valid @RequestBody CreatePaymentRequest request) { 34 | return service.add(request); 35 | } 36 | 37 | @PutMapping("/{id}") 38 | public UpdatePaymentResponse update(@PathVariable int id, @Valid @RequestBody UpdatePaymentRequest request) { 39 | return service.update(id, request); 40 | } 41 | 42 | @DeleteMapping("/{id}") 43 | public void delete(@PathVariable int id) { 44 | service.delete(id); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/rules/PaymentBusinessRules.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.rules; 2 | 3 | import kodlama.io.rentacar.common.constants.Messages; 4 | import kodlama.io.rentacar.common.dto.CreateRentalPaymentRequest; 5 | import kodlama.io.rentacar.core.exceptions.BusinessException; 6 | import kodlama.io.rentacar.repository.PaymentRepository; 7 | import lombok.AllArgsConstructor; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Service 11 | @AllArgsConstructor 12 | public class PaymentBusinessRules { 13 | private final PaymentRepository repository; 14 | 15 | public void checkIfPaymentExists(int id) { 16 | if (!repository.existsById(id)) { 17 | throw new BusinessException(Messages.Payment.NotFound); 18 | } 19 | } 20 | 21 | public void checkIfBalanceIdEnough(double balance, double price) { 22 | if (balance < price) { 23 | throw new BusinessException(Messages.Payment.NotEnoughMoney); 24 | } 25 | } 26 | 27 | public void checkIfCardExists(String cardNumber) { 28 | if (repository.existsByCardNumber(cardNumber)) { 29 | throw new BusinessException(Messages.Payment.CardNumberAlreadyExists); 30 | } 31 | } 32 | 33 | public void checkIfPaymentIsValid(CreateRentalPaymentRequest request) { 34 | if (!repository.existsByCardNumberAndCardHolderAndCardExpirationYearAndCardExpirationMonthAndCardCvv( 35 | request.getCardNumber(), 36 | request.getCardHolder(), 37 | request.getCardExpirationYear(), 38 | request.getCardExpirationMonth(), 39 | request.getCardCvv() 40 | )) { 41 | throw new BusinessException(Messages.Payment.NotAValidPayment); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/BrandsController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import kodlama.io.rentacar.business.abstracts.BrandService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateBrandRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateBrandRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateBrandResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllBrandsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetBrandResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateBrandResponse; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.http.HttpStatus; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/brands") 19 | public class BrandsController { 20 | private final BrandService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetBrandResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | @ResponseStatus(HttpStatus.CREATED) 34 | public CreateBrandResponse add(@RequestBody CreateBrandRequest request) { 35 | return service.add(request); 36 | } 37 | 38 | @PutMapping("/{id}") 39 | public UpdateBrandResponse update(@PathVariable int id, @RequestBody UpdateBrandRequest request) { 40 | return service.update(id, request); 41 | } 42 | 43 | @DeleteMapping("/{id}") 44 | @ResponseStatus(HttpStatus.NO_CONTENT) 45 | public void delete(@PathVariable int id) { 46 | service.delete(id); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/ModelsController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import kodlama.io.rentacar.business.abstracts.ModelService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateModelRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateModelRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateModelResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllModelsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetModelResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateModelResponse; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.http.HttpStatus; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/models") 19 | public class ModelsController { 20 | private final ModelService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetModelResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | @ResponseStatus(HttpStatus.CREATED) 34 | public CreateModelResponse add(@RequestBody CreateModelRequest request) { 35 | return service.add(request); 36 | } 37 | 38 | @PutMapping("/{id}") 39 | public UpdateModelResponse update(@PathVariable int id, @RequestBody UpdateModelRequest request) { 40 | return service.update(id, request); 41 | } 42 | 43 | @DeleteMapping("/{id}") 44 | @ResponseStatus(HttpStatus.NO_CONTENT) 45 | public void delete(@PathVariable int id) { 46 | service.delete(id); 47 | } 48 | } 49 | 50 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/RentalsController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import kodlama.io.rentacar.business.abstracts.RentalService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateRentalRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateRentalRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateRentalResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllRentalsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetRentalResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateRentalResponse; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.http.HttpStatus; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/rentals") 19 | public class RentalsController { 20 | private final RentalService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetRentalResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | @ResponseStatus(HttpStatus.CREATED) 34 | public CreateRentalResponse add(@RequestBody CreateRentalRequest request) { 35 | return service.add(request); 36 | } 37 | 38 | @PutMapping("/{id}") 39 | public UpdateRentalResponse update(@PathVariable int id, @RequestBody UpdateRentalRequest request) { 40 | return service.update(id, request); 41 | } 42 | 43 | @DeleteMapping("/{id}") 44 | @ResponseStatus(HttpStatus.NO_CONTENT) 45 | public void delete(@PathVariable int id) { 46 | service.delete(id); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/InvoicesController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import kodlama.io.rentacar.business.abstracts.InvoiceService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateInvoiceRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateInvoiceRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateInvoiceResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllInvoicesResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetInvoiceResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateInvoiceResponse; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.http.HttpStatus; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/invoices") 19 | public class InvoicesController { 20 | private final InvoiceService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetInvoiceResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | @ResponseStatus(HttpStatus.CREATED) 34 | public CreateInvoiceResponse add(@RequestBody CreateInvoiceRequest request) { 35 | return service.add(request); 36 | } 37 | 38 | @PutMapping("/{id}") 39 | public UpdateInvoiceResponse update(@PathVariable int id, @RequestBody UpdateInvoiceRequest request) { 40 | return service.update(id, request); 41 | } 42 | 43 | @DeleteMapping("/{id}") 44 | @ResponseStatus(HttpStatus.NO_CONTENT) 45 | public void delete(@PathVariable int id) { 46 | service.delete(id); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/common/constants/Messages.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.common.constants; 2 | 3 | public class Messages { 4 | public static class Car { 5 | public static final String NotExists = "CAR_NOT_EXISTS"; 6 | public static final String Exists = "CAR_ALREADY_EXISTS"; 7 | public static final String NotAvailable = "CAR_NOT_AVAILABLE"; 8 | } 9 | 10 | public static class Model { 11 | public static final String NotExists = "MODEL_NOT_EXISTS"; 12 | public static final String Exists = "MODEL_ALREADY_EXISTS"; 13 | } 14 | 15 | public static class Brand { 16 | public static final String NotExists = "BRAND_NOT_EXISTS"; 17 | public static final String Exists = "BRAND_ALREADY_EXISTS"; 18 | } 19 | 20 | public static class Maintenance { 21 | public static final String NotExists = "MAINTENANCE_NOT_EXISTS"; 22 | public static final String CarExists = "CAR_IS_CURRENTLY_UNDER_MAINTENANCE"; 23 | public static final String CarNotExists = "CAR_NOT_REGISTERED_FOR_MAINTENANCE"; 24 | public static final String CarIsRented = "CAR_IS_CURRENTLY_RENTED_AND_CANNOT_BE_SERVICED_FOR_MAINTENANCE"; 25 | } 26 | 27 | public static class Rental { 28 | public static final String NotExists = "RENTAL_NOT_EXISTS"; 29 | } 30 | 31 | public static class Payment { 32 | public static final String NotFound = "PAYMENT_NOT_FOUND"; 33 | public static final String CardNumberAlreadyExists = "CARD_NUMBER_ALREADY_EXISTS"; 34 | public static final String NotEnoughMoney = "NOT_ENOUGH_MONEY"; 35 | public static final String NotAValidPayment = "NOT_A_VALID_PAYMENT"; 36 | public static final String Failed = "PAYMENT_FAILED"; 37 | } 38 | 39 | public static class Invoice { 40 | public static final String NotFound = "INVOICE_NOT_FOUND"; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/CarsController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import jakarta.validation.Valid; 4 | import kodlama.io.rentacar.business.abstracts.CarService; 5 | import kodlama.io.rentacar.business.dto.requests.create.CreateCarRequest; 6 | import kodlama.io.rentacar.business.dto.requests.update.UpdateCarRequest; 7 | import kodlama.io.rentacar.business.dto.responses.create.CreateCarResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetAllCarsResponse; 9 | import kodlama.io.rentacar.business.dto.responses.get.GetCarResponse; 10 | import kodlama.io.rentacar.business.dto.responses.update.UpdateCarResponse; 11 | import lombok.AllArgsConstructor; 12 | import org.springframework.http.HttpStatus; 13 | import org.springframework.web.bind.annotation.*; 14 | 15 | import java.util.List; 16 | 17 | @RestController 18 | @AllArgsConstructor 19 | @RequestMapping("/api/cars") 20 | public class CarsController { 21 | private final CarService service; 22 | 23 | @GetMapping 24 | public List getAll(@RequestParam(defaultValue = "true") boolean includeMaintenance) { 25 | return service.getAll(includeMaintenance); 26 | } 27 | 28 | @GetMapping("/{id}") 29 | public GetCarResponse getById(@PathVariable int id) { 30 | return service.getById(id); 31 | } 32 | 33 | @PostMapping 34 | @ResponseStatus(HttpStatus.CREATED) 35 | public CreateCarResponse add(@Valid @RequestBody CreateCarRequest request) { 36 | return service.add(request); 37 | } 38 | 39 | @PutMapping("/{id}") 40 | public UpdateCarResponse update(@PathVariable int id, @RequestBody UpdateCarRequest request) { 41 | return service.update(id, request); 42 | } 43 | 44 | @DeleteMapping("/{id}") 45 | @ResponseStatus(HttpStatus.NO_CONTENT) 46 | public void delete(@PathVariable int id) { 47 | service.delete(id); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/api/controllers/MaintenancesController.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.api.controllers; 2 | 3 | import kodlama.io.rentacar.business.abstracts.MaintenanceService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateMaintenanceRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateMaintenanceRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateMaintenanceResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllMaintenancesResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetMaintenanceResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateMaintenanceResponse; 10 | import lombok.AllArgsConstructor; 11 | import org.springframework.http.HttpStatus; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import java.util.List; 15 | 16 | @RestController 17 | @AllArgsConstructor 18 | @RequestMapping("/api/maintenances") 19 | public class MaintenancesController { 20 | private final MaintenanceService service; 21 | 22 | @GetMapping 23 | public List getAll() { 24 | return service.getAll(); 25 | } 26 | 27 | @GetMapping("/{id}") 28 | public GetMaintenanceResponse getById(@PathVariable int id) { 29 | return service.getById(id); 30 | } 31 | 32 | @PostMapping 33 | @ResponseStatus(HttpStatus.CREATED) 34 | public CreateMaintenanceResponse add(@RequestBody CreateMaintenanceRequest request) { 35 | return service.add(request); 36 | } 37 | 38 | @PutMapping("/return") 39 | public GetMaintenanceResponse returnCarFromMaintenance(@RequestParam int carId) { 40 | return service.returnCarFromMaintenance(carId); 41 | } 42 | 43 | @PutMapping("/{id}") 44 | public UpdateMaintenanceResponse update(@PathVariable int id, @RequestBody UpdateMaintenanceRequest request) { 45 | return service.update(id, request); 46 | } 47 | 48 | @DeleteMapping("/{id}") 49 | @ResponseStatus(HttpStatus.NO_CONTENT) 50 | public void delete(@PathVariable int id) { 51 | service.delete(id); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/core/configuration/exceptions/RestExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.core.configuration.exceptions; 2 | 3 | import jakarta.validation.ValidationException; 4 | import kodlama.io.rentacar.common.constants.ExceptionTypes; 5 | import kodlama.io.rentacar.core.exceptions.BusinessException; 6 | import kodlama.io.rentacar.core.utils.results.ExceptionResult; 7 | import org.springframework.dao.DataIntegrityViolationException; 8 | import org.springframework.http.HttpStatus; 9 | import org.springframework.validation.FieldError; 10 | import org.springframework.web.bind.MethodArgumentNotValidException; 11 | import org.springframework.web.bind.annotation.ExceptionHandler; 12 | import org.springframework.web.bind.annotation.ResponseStatus; 13 | import org.springframework.web.bind.annotation.RestControllerAdvice; 14 | 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | 18 | @RestControllerAdvice 19 | public class RestExceptionHandler { 20 | @ExceptionHandler 21 | @ResponseStatus(HttpStatus.BAD_REQUEST) // 400 22 | public ExceptionResult handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) { 23 | Map validationErrors = new HashMap<>(); 24 | for (FieldError fieldError : exception.getBindingResult().getFieldErrors()) { 25 | validationErrors.put(fieldError.getField(), fieldError.getDefaultMessage()); 26 | } 27 | 28 | return new ExceptionResult<>(ExceptionTypes.Exception.Validation, validationErrors); 29 | } 30 | 31 | @ExceptionHandler 32 | @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY) // 422 33 | public ExceptionResult handleValidationException(ValidationException exception) { 34 | return new ExceptionResult<>(ExceptionTypes.Exception.Validation, exception.getMessage()); 35 | } 36 | 37 | @ExceptionHandler 38 | @ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY) // 422 39 | public ExceptionResult handleBusinessException(BusinessException exception) { 40 | return new ExceptionResult<>(ExceptionTypes.Exception.Business, exception.getMessage()); 41 | } 42 | 43 | @ExceptionHandler 44 | @ResponseStatus(HttpStatus.CONFLICT) // 409 45 | public ExceptionResult handleDataIntegrityViolation(DataIntegrityViolationException exception) { 46 | return new ExceptionResult<>(ExceptionTypes.Exception.DataIntegrityViolation, exception.getMessage()); 47 | } 48 | 49 | @ExceptionHandler 50 | @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 500 51 | public ExceptionResult handleRuntimeException(RuntimeException exception) { 52 | return new ExceptionResult<>(ExceptionTypes.Exception.Runtime, exception.getMessage()); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/ModelManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.ModelService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateModelRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateModelRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateModelResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllModelsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetModelResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateModelResponse; 10 | import kodlama.io.rentacar.business.rules.ModelBusinessRules; 11 | import kodlama.io.rentacar.entities.Model; 12 | import kodlama.io.rentacar.repository.ModelRepository; 13 | import lombok.AllArgsConstructor; 14 | import org.modelmapper.ModelMapper; 15 | import org.springframework.stereotype.Service; 16 | 17 | import java.util.List; 18 | 19 | @Service 20 | @AllArgsConstructor 21 | public class ModelManager implements ModelService { 22 | private final ModelRepository repository; 23 | private final ModelMapper mapper; 24 | private final ModelBusinessRules rules; 25 | 26 | @Override 27 | public List getAll() { 28 | List models = repository.findAll(); 29 | List response = models 30 | .stream() 31 | .map(model -> mapper.map(model, GetAllModelsResponse.class)) 32 | .toList(); 33 | 34 | return response; 35 | } 36 | 37 | @Override 38 | public GetModelResponse getById(int id) { 39 | rules.checkIfModelExists(id); 40 | Model model = repository.findById(id).orElseThrow(); 41 | GetModelResponse response = mapper.map(model, GetModelResponse.class); 42 | 43 | return response; 44 | } 45 | 46 | @Override 47 | public CreateModelResponse add(CreateModelRequest request) { 48 | Model model = mapper.map(request, Model.class); 49 | model.setId(0); 50 | repository.save(model); 51 | CreateModelResponse response = mapper.map(model, CreateModelResponse.class); 52 | 53 | return response; 54 | } 55 | 56 | @Override 57 | public UpdateModelResponse update(int id, UpdateModelRequest request) { 58 | rules.checkIfModelExists(id); 59 | Model model = mapper.map(request, Model.class); 60 | model.setId(id); 61 | repository.save(model); 62 | UpdateModelResponse response = mapper.map(model, UpdateModelResponse.class); 63 | 64 | return response; 65 | } 66 | 67 | @Override 68 | public void delete(int id) { 69 | rules.checkIfModelExists(id); 70 | repository.deleteById(id); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/BrandManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.BrandService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateBrandRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateBrandRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateBrandResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllBrandsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetBrandResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateBrandResponse; 10 | import kodlama.io.rentacar.business.rules.BrandBusinessRules; 11 | import kodlama.io.rentacar.entities.Brand; 12 | import kodlama.io.rentacar.repository.BrandRepository; 13 | import lombok.AllArgsConstructor; 14 | import org.modelmapper.ModelMapper; 15 | import org.springframework.cache.annotation.CacheEvict; 16 | import org.springframework.cache.annotation.Cacheable; 17 | import org.springframework.stereotype.Service; 18 | 19 | import java.util.List; 20 | 21 | @Service 22 | @AllArgsConstructor 23 | public class BrandManager implements BrandService { 24 | private final BrandRepository repository; 25 | private final ModelMapper mapper; 26 | private final BrandBusinessRules rules; 27 | 28 | @Override 29 | @Cacheable(value = "brand_list") 30 | public List getAll() { 31 | List brands = repository.findAll(); 32 | List response = brands 33 | .stream() 34 | .map(brand -> mapper.map(brand, GetAllBrandsResponse.class)) 35 | .toList(); 36 | 37 | return response; 38 | } 39 | 40 | @Override 41 | public GetBrandResponse getById(int id) { 42 | rules.checkIfBrandExists(id); 43 | Brand brand = repository.findById(id).orElseThrow(); 44 | GetBrandResponse response = mapper.map(brand, GetBrandResponse.class); 45 | 46 | return response; 47 | } 48 | 49 | @Override 50 | @CacheEvict(value = "brand_list", allEntries = true) 51 | public CreateBrandResponse add(CreateBrandRequest request) { 52 | rules.checkIfBrandExistsByName(request.getName()); 53 | Brand brand = mapper.map(request, Brand.class); 54 | brand.setId(0); 55 | repository.save(brand); 56 | CreateBrandResponse response = mapper.map(brand, CreateBrandResponse.class); 57 | 58 | return response; 59 | } 60 | 61 | @Override 62 | public UpdateBrandResponse update(int id, UpdateBrandRequest request) { 63 | rules.checkIfBrandExists(id); 64 | Brand brand = mapper.map(request, Brand.class); 65 | brand.setId(id); 66 | repository.save(brand); 67 | UpdateBrandResponse response = mapper.map(brand, UpdateBrandResponse.class); 68 | 69 | return response; 70 | } 71 | 72 | @Override 73 | public void delete(int id) { 74 | rules.checkIfBrandExists(id); 75 | repository.deleteById(id); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/InvoiceManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.InvoiceService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateInvoiceRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateInvoiceRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateInvoiceResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllInvoicesResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetInvoiceResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateInvoiceResponse; 10 | import kodlama.io.rentacar.business.rules.InvoiceBusinessRules; 11 | import kodlama.io.rentacar.entities.Invoice; 12 | import kodlama.io.rentacar.repository.InvoiceRepository; 13 | import lombok.AllArgsConstructor; 14 | import org.modelmapper.ModelMapper; 15 | import org.springframework.stereotype.Service; 16 | 17 | import java.util.List; 18 | 19 | @Service 20 | @AllArgsConstructor 21 | public class InvoiceManager implements InvoiceService { 22 | private final InvoiceRepository repository; 23 | private final ModelMapper mapper; 24 | private final InvoiceBusinessRules rules; 25 | 26 | @Override 27 | public List getAll() { 28 | List invoices = repository.findAll(); 29 | List response = invoices 30 | .stream() 31 | .map(invoice -> mapper.map(invoice, GetAllInvoicesResponse.class)) 32 | .toList(); 33 | 34 | return response; 35 | } 36 | 37 | @Override 38 | public GetInvoiceResponse getById(int id) { 39 | rules.checkIfInvoiceExists(id); 40 | Invoice invoice = repository.findById(id).orElseThrow(); 41 | GetInvoiceResponse response = mapper.map(invoice, GetInvoiceResponse.class); 42 | 43 | return response; 44 | } 45 | 46 | @Override 47 | public CreateInvoiceResponse add(CreateInvoiceRequest request) { 48 | Invoice invoice = mapper.map(request, Invoice.class); 49 | invoice.setId(0); 50 | invoice.setTotalPrice(getTotalPrice(invoice)); 51 | repository.save(invoice); 52 | CreateInvoiceResponse response = mapper.map(invoice, CreateInvoiceResponse.class); 53 | 54 | return response; 55 | } 56 | 57 | @Override 58 | public UpdateInvoiceResponse update(int id, UpdateInvoiceRequest request) { 59 | rules.checkIfInvoiceExists(id); 60 | Invoice invoice = mapper.map(request, Invoice.class); 61 | invoice.setId(id); 62 | invoice.setTotalPrice(getTotalPrice(invoice)); 63 | repository.save(invoice); 64 | UpdateInvoiceResponse response = mapper.map(invoice, UpdateInvoiceResponse.class); 65 | 66 | return response; 67 | } 68 | 69 | @Override 70 | public void delete(int id) { 71 | rules.checkIfInvoiceExists(id); 72 | repository.deleteById(id); 73 | } 74 | 75 | private double getTotalPrice(Invoice invoice) { 76 | return invoice.getDailyPrice() * invoice.getRentedForDays(); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/CarManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.CarService; 4 | import kodlama.io.rentacar.business.dto.requests.create.CreateCarRequest; 5 | import kodlama.io.rentacar.business.dto.requests.update.UpdateCarRequest; 6 | import kodlama.io.rentacar.business.dto.responses.create.CreateCarResponse; 7 | import kodlama.io.rentacar.business.dto.responses.get.GetAllCarsResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetCarResponse; 9 | import kodlama.io.rentacar.business.dto.responses.update.UpdateCarResponse; 10 | import kodlama.io.rentacar.business.rules.CarBusinessRules; 11 | import kodlama.io.rentacar.entities.Car; 12 | import kodlama.io.rentacar.entities.enums.State; 13 | import kodlama.io.rentacar.repository.CarRepository; 14 | import lombok.AllArgsConstructor; 15 | import org.modelmapper.ModelMapper; 16 | import org.springframework.stereotype.Service; 17 | 18 | import java.util.List; 19 | 20 | @Service 21 | @AllArgsConstructor 22 | public class CarManager implements CarService { 23 | private final CarRepository repository; 24 | private final ModelMapper mapper; 25 | private final CarBusinessRules rules; 26 | 27 | @Override 28 | public List getAll(boolean includeMaintenance) { 29 | List cars = filterCarsByMaintenanceState(includeMaintenance); 30 | List response = cars 31 | .stream() 32 | .map(car -> mapper.map(car, GetAllCarsResponse.class)) 33 | .toList(); 34 | 35 | return response; 36 | } 37 | 38 | @Override 39 | public GetCarResponse getById(int id) { 40 | rules.checkIfCarExists(id); 41 | Car car = repository.findById(id).orElseThrow(); 42 | GetCarResponse response = mapper.map(car, GetCarResponse.class); 43 | 44 | return response; 45 | } 46 | 47 | @Override 48 | public CreateCarResponse add(CreateCarRequest request) { 49 | Car car = mapper.map(request, Car.class); 50 | car.setId(0); 51 | car.setState(State.AVAILABLE); 52 | repository.save(car); 53 | CreateCarResponse response = mapper.map(car, CreateCarResponse.class); 54 | 55 | return response; 56 | } 57 | 58 | @Override 59 | public UpdateCarResponse update(int id, UpdateCarRequest request) { 60 | rules.checkIfCarExists(id); 61 | Car car = mapper.map(request, Car.class); 62 | car.setId(id); 63 | repository.save(car); 64 | UpdateCarResponse response = mapper.map(car, UpdateCarResponse.class); 65 | 66 | return response; 67 | } 68 | 69 | @Override 70 | public void delete(int id) { 71 | rules.checkIfCarExists(id); 72 | repository.deleteById(id); 73 | } 74 | 75 | @Override 76 | public void changeState(int carId, State state) { 77 | Car car = repository.findById(carId).orElseThrow(); 78 | car.setState(state); 79 | repository.save(car); 80 | } 81 | 82 | private List filterCarsByMaintenanceState(boolean includeMaintenance) { 83 | if (includeMaintenance) { 84 | return repository.findAll(); 85 | } 86 | 87 | return repository.findAllByStateIsNot(State.MAINTENANCE); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 3.0.5 9 | 10 | 11 | kodlama.io 12 | rent-a-car 13 | 0.0.1-SNAPSHOT 14 | rent-a-car 15 | This is a car rental system project 16 | 17 | 17 18 | 19 | 20 | 21 | org.springframework.boot 22 | spring-boot-starter-data-jpa 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-validation 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-web 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-devtools 35 | runtime 36 | true 37 | 38 | 39 | org.postgresql 40 | postgresql 41 | runtime 42 | 43 | 44 | org.projectlombok 45 | lombok 46 | true 47 | 48 | 49 | org.springframework.boot 50 | spring-boot-starter-test 51 | test 52 | 53 | 54 | org.springdoc 55 | springdoc-openapi-starter-webmvc-ui 56 | 2.0.4 57 | 58 | 59 | org.modelmapper 60 | modelmapper 61 | 3.1.1 62 | 63 | 64 | jakarta.validation 65 | jakarta.validation-api 66 | 3.0.2 67 | 68 | 69 | 70 | 71 | 72 | 73 | org.springframework.boot 74 | spring-boot-maven-plugin 75 | 76 | 77 | 78 | org.projectlombok 79 | lombok 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/PaymentManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.PaymentService; 4 | import kodlama.io.rentacar.business.abstracts.PosService; 5 | import kodlama.io.rentacar.business.dto.requests.create.CreatePaymentRequest; 6 | import kodlama.io.rentacar.business.dto.requests.update.UpdatePaymentRequest; 7 | import kodlama.io.rentacar.business.dto.responses.create.CreatePaymentResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetAllPaymentsResponse; 9 | import kodlama.io.rentacar.business.dto.responses.get.GetPaymentResponse; 10 | import kodlama.io.rentacar.business.dto.responses.update.UpdatePaymentResponse; 11 | import kodlama.io.rentacar.business.rules.PaymentBusinessRules; 12 | import kodlama.io.rentacar.common.dto.CreateRentalPaymentRequest; 13 | import kodlama.io.rentacar.entities.Payment; 14 | import kodlama.io.rentacar.repository.PaymentRepository; 15 | import lombok.AllArgsConstructor; 16 | import org.modelmapper.ModelMapper; 17 | import org.springframework.stereotype.Service; 18 | 19 | import java.util.List; 20 | 21 | @Service 22 | @AllArgsConstructor 23 | public class PaymentManager implements PaymentService { 24 | private final PaymentRepository repository; 25 | private final ModelMapper mapper; 26 | private final PosService posService; 27 | private final PaymentBusinessRules rules; 28 | 29 | @Override 30 | public List getAll() { 31 | List payments = repository.findAll(); 32 | List response = payments 33 | .stream() 34 | .map(payment -> mapper.map(payment, GetAllPaymentsResponse.class)) 35 | .toList(); 36 | 37 | return response; 38 | } 39 | 40 | @Override 41 | public GetPaymentResponse getById(int id) { 42 | rules.checkIfPaymentExists(id); 43 | Payment payment = repository.findById(id).orElseThrow(); 44 | GetPaymentResponse response = mapper.map(payment, GetPaymentResponse.class); 45 | 46 | return response; 47 | } 48 | 49 | @Override 50 | public CreatePaymentResponse add(CreatePaymentRequest request) { 51 | rules.checkIfCardExists(request.getCardNumber()); 52 | Payment payment = mapper.map(request, Payment.class); 53 | payment.setId(0); 54 | repository.save(payment); 55 | CreatePaymentResponse response = mapper.map(payment, CreatePaymentResponse.class); 56 | 57 | return response; 58 | } 59 | 60 | @Override 61 | public UpdatePaymentResponse update(int id, UpdatePaymentRequest request) { 62 | rules.checkIfPaymentExists(id); 63 | Payment payment = mapper.map(request, Payment.class); 64 | payment.setId(id); 65 | repository.save(payment); 66 | UpdatePaymentResponse response = mapper.map(payment, UpdatePaymentResponse.class); 67 | 68 | return response; 69 | } 70 | 71 | @Override 72 | public void delete(int id) { 73 | rules.checkIfPaymentExists(id); 74 | repository.deleteById(id); 75 | } 76 | 77 | @Override 78 | public void processRentalPayment(CreateRentalPaymentRequest request) { 79 | rules.checkIfPaymentIsValid(request); 80 | Payment payment = repository.findByCardNumber(request.getCardNumber()); 81 | rules.checkIfBalanceIdEnough(payment.getBalance(), request.getPrice()); 82 | posService.pay(); // fake pos service 83 | payment.setBalance(payment.getBalance() - request.getPrice()); 84 | repository.save(payment); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/MaintenanceManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.CarService; 4 | import kodlama.io.rentacar.business.abstracts.MaintenanceService; 5 | import kodlama.io.rentacar.business.dto.requests.create.CreateMaintenanceRequest; 6 | import kodlama.io.rentacar.business.dto.requests.update.UpdateMaintenanceRequest; 7 | import kodlama.io.rentacar.business.dto.responses.create.CreateMaintenanceResponse; 8 | import kodlama.io.rentacar.business.dto.responses.get.GetAllMaintenancesResponse; 9 | import kodlama.io.rentacar.business.dto.responses.get.GetMaintenanceResponse; 10 | import kodlama.io.rentacar.business.dto.responses.update.UpdateMaintenanceResponse; 11 | import kodlama.io.rentacar.business.rules.MaintenanceBusinessRules; 12 | import kodlama.io.rentacar.entities.Maintenance; 13 | import kodlama.io.rentacar.entities.enums.State; 14 | import kodlama.io.rentacar.repository.MaintenanceRepository; 15 | import lombok.AllArgsConstructor; 16 | import org.modelmapper.ModelMapper; 17 | import org.springframework.stereotype.Service; 18 | 19 | import java.time.LocalDateTime; 20 | import java.util.List; 21 | 22 | @Service 23 | @AllArgsConstructor 24 | public class MaintenanceManager implements MaintenanceService { 25 | private final MaintenanceRepository repository; 26 | private final ModelMapper mapper; 27 | private final CarService carService; 28 | private final MaintenanceBusinessRules rules; 29 | 30 | @Override 31 | public List getAll() { 32 | List maintenances = repository.findAll(); 33 | List response = maintenances 34 | .stream() 35 | .map(maintenance -> mapper.map(maintenance, GetAllMaintenancesResponse.class)) 36 | .toList(); 37 | 38 | return response; 39 | } 40 | 41 | @Override 42 | public GetMaintenanceResponse getById(int id) { 43 | rules.checkIfMaintenanceExists(id); 44 | Maintenance maintenance = repository.findById(id).orElseThrow(); 45 | GetMaintenanceResponse response = mapper.map(maintenance, GetMaintenanceResponse.class); 46 | 47 | return response; 48 | } 49 | 50 | @Override 51 | public GetMaintenanceResponse returnCarFromMaintenance(int carId) { 52 | rules.checkIfCarIsNotUnderMaintenance(carId); 53 | Maintenance maintenance = repository.findMaintenanceByCarIdAndIsCompletedFalse(carId); 54 | maintenance.setCompleted(true); 55 | maintenance.setEndDate(LocalDateTime.now()); 56 | repository.save(maintenance); 57 | carService.changeState(carId, State.AVAILABLE); 58 | GetMaintenanceResponse response = mapper.map(maintenance, GetMaintenanceResponse.class); 59 | 60 | return response; 61 | } 62 | 63 | @Override 64 | public CreateMaintenanceResponse add(CreateMaintenanceRequest request) { 65 | rules.checkCarAvailabilityForMaintenance(carService.getById(request.getCarId()).getState()); 66 | rules.checkIfCarUnderMaintenance(request.getCarId()); 67 | Maintenance maintenance = mapper.map(request, Maintenance.class); 68 | maintenance.setId(0); 69 | maintenance.setCompleted(false); 70 | maintenance.setStartDate(LocalDateTime.now()); 71 | maintenance.setEndDate(null); 72 | carService.changeState(request.getCarId(), State.MAINTENANCE); 73 | repository.save(maintenance); 74 | 75 | CreateMaintenanceResponse response = mapper.map(maintenance, CreateMaintenanceResponse.class); 76 | 77 | return response; 78 | } 79 | 80 | @Override 81 | public UpdateMaintenanceResponse update(int id, UpdateMaintenanceRequest request) { 82 | rules.checkIfMaintenanceExists(id); 83 | Maintenance maintenance = mapper.map(request, Maintenance.class); 84 | maintenance.setId(id); 85 | repository.save(maintenance); 86 | UpdateMaintenanceResponse response = mapper.map(maintenance, UpdateMaintenanceResponse.class); 87 | 88 | return response; 89 | } 90 | 91 | @Override 92 | public void delete(int id) { 93 | rules.checkIfMaintenanceExists(id); 94 | makeCarAvailableIfIsCompletedFalse(id); 95 | repository.deleteById(id); 96 | } 97 | 98 | private void makeCarAvailableIfIsCompletedFalse(int id) { 99 | int carId = repository.findById(id).get().getCar().getId(); 100 | if (repository.existsByCarIdAndIsCompletedIsFalse(carId)) { 101 | carService.changeState(carId, State.AVAILABLE); 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/main/java/kodlama/io/rentacar/business/concretes/RentalManager.java: -------------------------------------------------------------------------------- 1 | package kodlama.io.rentacar.business.concretes; 2 | 3 | import kodlama.io.rentacar.business.abstracts.CarService; 4 | import kodlama.io.rentacar.business.abstracts.InvoiceService; 5 | import kodlama.io.rentacar.business.abstracts.PaymentService; 6 | import kodlama.io.rentacar.business.abstracts.RentalService; 7 | import kodlama.io.rentacar.business.dto.requests.create.CreateInvoiceRequest; 8 | import kodlama.io.rentacar.business.dto.requests.create.CreateRentalRequest; 9 | import kodlama.io.rentacar.business.dto.requests.update.UpdateRentalRequest; 10 | import kodlama.io.rentacar.business.dto.responses.create.CreateRentalResponse; 11 | import kodlama.io.rentacar.business.dto.responses.get.GetAllRentalsResponse; 12 | import kodlama.io.rentacar.business.dto.responses.get.GetCarResponse; 13 | import kodlama.io.rentacar.business.dto.responses.get.GetRentalResponse; 14 | import kodlama.io.rentacar.business.dto.responses.update.UpdateRentalResponse; 15 | import kodlama.io.rentacar.business.rules.RentalBusinessRules; 16 | import kodlama.io.rentacar.common.dto.CreateRentalPaymentRequest; 17 | import kodlama.io.rentacar.entities.Rental; 18 | import kodlama.io.rentacar.entities.enums.State; 19 | import kodlama.io.rentacar.repository.RentalRepository; 20 | import lombok.AllArgsConstructor; 21 | import org.modelmapper.ModelMapper; 22 | import org.springframework.stereotype.Service; 23 | 24 | import java.time.LocalDateTime; 25 | import java.util.List; 26 | 27 | @Service 28 | @AllArgsConstructor 29 | public class RentalManager implements RentalService { 30 | private final RentalRepository repository; 31 | private final ModelMapper mapper; 32 | private final CarService carService; 33 | private final PaymentService paymentService; 34 | private final InvoiceService invoiceService; 35 | private final RentalBusinessRules rules; 36 | 37 | @Override 38 | public List getAll() { 39 | List rentals = repository.findAll(); 40 | List response = rentals 41 | .stream() 42 | .map(rental -> mapper.map(rental, GetAllRentalsResponse.class)) 43 | .toList(); 44 | 45 | return response; 46 | } 47 | 48 | @Override 49 | public GetRentalResponse getById(int id) { 50 | rules.checkIfRentalExists(id); 51 | Rental rental = repository.findById(id).orElseThrow(); 52 | GetRentalResponse response = mapper.map(rental, GetRentalResponse.class); 53 | 54 | return response; 55 | } 56 | 57 | @Override 58 | public CreateRentalResponse add(CreateRentalRequest request) { 59 | rules.checkIfCarAvailable(carService.getById(request.getCarId()).getState()); 60 | Rental rental = mapper.map(request, Rental.class); 61 | rental.setId(0); 62 | rental.setTotalPrice(getTotalPrice(rental)); 63 | rental.setStartDate(LocalDateTime.now()); 64 | 65 | // Payment Create 66 | CreateRentalPaymentRequest paymentRequest = new CreateRentalPaymentRequest(); 67 | mapper.map(request.getPaymentRequest(), paymentRequest); 68 | paymentRequest.setPrice(getTotalPrice(rental)); 69 | paymentService.processRentalPayment(paymentRequest); 70 | 71 | repository.save(rental); 72 | carService.changeState(rental.getCar().getId(), State.RENTED); 73 | CreateRentalResponse response = mapper.map(rental, CreateRentalResponse.class); 74 | 75 | // Car car = mapper.map(carService.getById(request.getCarId()), Car.class); 76 | // rental.setCar(car); 77 | 78 | // Invoice Create 79 | CreateInvoiceRequest invoiceRequest = new CreateInvoiceRequest(); 80 | createInvoiceRequest(request, invoiceRequest, rental); 81 | invoiceService.add(invoiceRequest); 82 | 83 | return response; 84 | } 85 | 86 | @Override 87 | public UpdateRentalResponse update(int id, UpdateRentalRequest request) { 88 | rules.checkIfRentalExists(id); 89 | Rental rental = mapper.map(request, Rental.class); 90 | rental.setId(id); 91 | rental.setTotalPrice(getTotalPrice(rental)); 92 | repository.save(rental); 93 | UpdateRentalResponse response = mapper.map(rental, UpdateRentalResponse.class); 94 | 95 | return response; 96 | } 97 | 98 | @Override 99 | public void delete(int id) { 100 | rules.checkIfRentalExists(id); 101 | int carId = repository.findById(id).get().getCar().getId(); 102 | carService.changeState(carId, State.AVAILABLE); 103 | repository.deleteById(id); 104 | } 105 | 106 | private double getTotalPrice(Rental rental) { 107 | return rental.getDailyPrice() * rental.getRentedForDays(); 108 | } 109 | 110 | private void createInvoiceRequest(CreateRentalRequest request, CreateInvoiceRequest invoiceRequest, Rental rental) { 111 | GetCarResponse car = carService.getById(request.getCarId()); 112 | 113 | invoiceRequest.setRentedAt(rental.getStartDate()); 114 | invoiceRequest.setModelName(car.getModelName()); 115 | invoiceRequest.setBrandName(car.getModelBrandName()); 116 | invoiceRequest.setDailyPrice(request.getDailyPrice()); 117 | invoiceRequest.setRentedForDays(request.getRentedForDays()); 118 | invoiceRequest.setCardHolder(request.getPaymentRequest().getCardHolder()); 119 | invoiceRequest.setPlate(car.getPlate()); 120 | invoiceRequest.setModelYear(car.getModelYear()); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* 50 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 124 | 125 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 127 | ) 128 | 129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 131 | if exist %WRAPPER_JAR% ( 132 | if "%MVNW_VERBOSE%" == "true" ( 133 | echo Found %WRAPPER_JAR% 134 | ) 135 | ) else ( 136 | if not "%MVNW_REPOURL%" == "" ( 137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 138 | ) 139 | if "%MVNW_VERBOSE%" == "true" ( 140 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 141 | echo Downloading from: %DOWNLOAD_URL% 142 | ) 143 | 144 | powershell -Command "&{"^ 145 | "$webclient = new-object System.Net.WebClient;"^ 146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 148 | "}"^ 149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ 150 | "}" 151 | if "%MVNW_VERBOSE%" == "true" ( 152 | echo Finished downloading %WRAPPER_JAR% 153 | ) 154 | ) 155 | @REM End of extension 156 | 157 | @REM Provide a "standardized" way to retrieve the CLI args that will 158 | @REM work with both Windows and non-Windows executions. 159 | set MAVEN_CMD_LINE_ARGS=%* 160 | 161 | %MAVEN_JAVA_EXE% ^ 162 | %JVM_CONFIG_MAVEN_PROPS% ^ 163 | %MAVEN_OPTS% ^ 164 | %MAVEN_DEBUG_OPTS% ^ 165 | -classpath %WRAPPER_JAR% ^ 166 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ 167 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 168 | if ERRORLEVEL 1 goto error 169 | goto end 170 | 171 | :error 172 | set ERROR_CODE=1 173 | 174 | :end 175 | @endlocal & set ERROR_CODE=%ERROR_CODE% 176 | 177 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost 178 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 179 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" 180 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" 181 | :skipRcPost 182 | 183 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 184 | if "%MAVEN_BATCH_PAUSE%"=="on" pause 185 | 186 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% 187 | 188 | cmd /C exit /B %ERROR_CODE% 189 | -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /usr/local/etc/mavenrc ] ; then 40 | . /usr/local/etc/mavenrc 41 | fi 42 | 43 | if [ -f /etc/mavenrc ] ; then 44 | . /etc/mavenrc 45 | fi 46 | 47 | if [ -f "$HOME/.mavenrc" ] ; then 48 | . "$HOME/.mavenrc" 49 | fi 50 | 51 | fi 52 | 53 | # OS specific support. $var _must_ be set to either true or false. 54 | cygwin=false; 55 | darwin=false; 56 | mingw=false 57 | case "`uname`" in 58 | CYGWIN*) cygwin=true ;; 59 | MINGW*) mingw=true;; 60 | Darwin*) darwin=true 61 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 62 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 63 | if [ -z "$JAVA_HOME" ]; then 64 | if [ -x "/usr/libexec/java_home" ]; then 65 | export JAVA_HOME="`/usr/libexec/java_home`" 66 | else 67 | export JAVA_HOME="/Library/Java/Home" 68 | fi 69 | fi 70 | ;; 71 | esac 72 | 73 | if [ -z "$JAVA_HOME" ] ; then 74 | if [ -r /etc/gentoo-release ] ; then 75 | JAVA_HOME=`java-config --jre-home` 76 | fi 77 | fi 78 | 79 | if [ -z "$M2_HOME" ] ; then 80 | ## resolve links - $0 may be a link to maven's home 81 | PRG="$0" 82 | 83 | # need this for relative symlinks 84 | while [ -h "$PRG" ] ; do 85 | ls=`ls -ld "$PRG"` 86 | link=`expr "$ls" : '.*-> \(.*\)$'` 87 | if expr "$link" : '/.*' > /dev/null; then 88 | PRG="$link" 89 | else 90 | PRG="`dirname "$PRG"`/$link" 91 | fi 92 | done 93 | 94 | saveddir=`pwd` 95 | 96 | M2_HOME=`dirname "$PRG"`/.. 97 | 98 | # make it fully qualified 99 | M2_HOME=`cd "$M2_HOME" && pwd` 100 | 101 | cd "$saveddir" 102 | # echo Using m2 at $M2_HOME 103 | fi 104 | 105 | # For Cygwin, ensure paths are in UNIX format before anything is touched 106 | if $cygwin ; then 107 | [ -n "$M2_HOME" ] && 108 | M2_HOME=`cygpath --unix "$M2_HOME"` 109 | [ -n "$JAVA_HOME" ] && 110 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 111 | [ -n "$CLASSPATH" ] && 112 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 113 | fi 114 | 115 | # For Mingw, ensure paths are in UNIX format before anything is touched 116 | if $mingw ; then 117 | [ -n "$M2_HOME" ] && 118 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 119 | [ -n "$JAVA_HOME" ] && 120 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 121 | fi 122 | 123 | if [ -z "$JAVA_HOME" ]; then 124 | javaExecutable="`which javac`" 125 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 126 | # readlink(1) is not available as standard on Solaris 10. 127 | readLink=`which readlink` 128 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 129 | if $darwin ; then 130 | javaHome="`dirname \"$javaExecutable\"`" 131 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 132 | else 133 | javaExecutable="`readlink -f \"$javaExecutable\"`" 134 | fi 135 | javaHome="`dirname \"$javaExecutable\"`" 136 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 137 | JAVA_HOME="$javaHome" 138 | export JAVA_HOME 139 | fi 140 | fi 141 | fi 142 | 143 | if [ -z "$JAVACMD" ] ; then 144 | if [ -n "$JAVA_HOME" ] ; then 145 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 146 | # IBM's JDK on AIX uses strange locations for the executables 147 | JAVACMD="$JAVA_HOME/jre/sh/java" 148 | else 149 | JAVACMD="$JAVA_HOME/bin/java" 150 | fi 151 | else 152 | JAVACMD="`\\unset -f command; \\command -v java`" 153 | fi 154 | fi 155 | 156 | if [ ! -x "$JAVACMD" ] ; then 157 | echo "Error: JAVA_HOME is not defined correctly." >&2 158 | echo " We cannot execute $JAVACMD" >&2 159 | exit 1 160 | fi 161 | 162 | if [ -z "$JAVA_HOME" ] ; then 163 | echo "Warning: JAVA_HOME environment variable is not set." 164 | fi 165 | 166 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 167 | 168 | # traverses directory structure from process work directory to filesystem root 169 | # first directory with .mvn subdirectory is considered project base directory 170 | find_maven_basedir() { 171 | 172 | if [ -z "$1" ] 173 | then 174 | echo "Path not specified to find_maven_basedir" 175 | return 1 176 | fi 177 | 178 | basedir="$1" 179 | wdir="$1" 180 | while [ "$wdir" != '/' ] ; do 181 | if [ -d "$wdir"/.mvn ] ; then 182 | basedir=$wdir 183 | break 184 | fi 185 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 186 | if [ -d "${wdir}" ]; then 187 | wdir=`cd "$wdir/.."; pwd` 188 | fi 189 | # end of workaround 190 | done 191 | echo "${basedir}" 192 | } 193 | 194 | # concatenates all lines of a file 195 | concat_lines() { 196 | if [ -f "$1" ]; then 197 | echo "$(tr -s '\n' ' ' < "$1")" 198 | fi 199 | } 200 | 201 | BASE_DIR=`find_maven_basedir "$(pwd)"` 202 | if [ -z "$BASE_DIR" ]; then 203 | exit 1; 204 | fi 205 | 206 | ########################################################################################## 207 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 208 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 209 | ########################################################################################## 210 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Found .mvn/wrapper/maven-wrapper.jar" 213 | fi 214 | else 215 | if [ "$MVNW_VERBOSE" = true ]; then 216 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 217 | fi 218 | if [ -n "$MVNW_REPOURL" ]; then 219 | jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 220 | else 221 | jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 222 | fi 223 | while IFS="=" read key value; do 224 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 225 | esac 226 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 227 | if [ "$MVNW_VERBOSE" = true ]; then 228 | echo "Downloading from: $jarUrl" 229 | fi 230 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 231 | if $cygwin; then 232 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 233 | fi 234 | 235 | if command -v wget > /dev/null; then 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Found wget ... using wget" 238 | fi 239 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 240 | wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 241 | else 242 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 243 | fi 244 | elif command -v curl > /dev/null; then 245 | if [ "$MVNW_VERBOSE" = true ]; then 246 | echo "Found curl ... using curl" 247 | fi 248 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 249 | curl -o "$wrapperJarPath" "$jarUrl" -f 250 | else 251 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 252 | fi 253 | 254 | else 255 | if [ "$MVNW_VERBOSE" = true ]; then 256 | echo "Falling back to using Java to download" 257 | fi 258 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 259 | # For Cygwin, switch paths to Windows format before running javac 260 | if $cygwin; then 261 | javaClass=`cygpath --path --windows "$javaClass"` 262 | fi 263 | if [ -e "$javaClass" ]; then 264 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 265 | if [ "$MVNW_VERBOSE" = true ]; then 266 | echo " - Compiling MavenWrapperDownloader.java ..." 267 | fi 268 | # Compiling the Java class 269 | ("$JAVA_HOME/bin/javac" "$javaClass") 270 | fi 271 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 272 | # Running the downloader 273 | if [ "$MVNW_VERBOSE" = true ]; then 274 | echo " - Running MavenWrapperDownloader.java ..." 275 | fi 276 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 277 | fi 278 | fi 279 | fi 280 | fi 281 | ########################################################################################## 282 | # End of extension 283 | ########################################################################################## 284 | 285 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 286 | if [ "$MVNW_VERBOSE" = true ]; then 287 | echo $MAVEN_PROJECTBASEDIR 288 | fi 289 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 290 | 291 | # For Cygwin, switch paths to Windows format before running java 292 | if $cygwin; then 293 | [ -n "$M2_HOME" ] && 294 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 295 | [ -n "$JAVA_HOME" ] && 296 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 297 | [ -n "$CLASSPATH" ] && 298 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 299 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 300 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 301 | fi 302 | 303 | # Provide a "standardized" way to retrieve the CLI args that will 304 | # work with both Windows and non-Windows executions. 305 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 306 | export MAVEN_CMD_LINE_ARGS 307 | 308 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 309 | 310 | exec "$JAVACMD" \ 311 | $MAVEN_OPTS \ 312 | $MAVEN_DEBUG_OPTS \ 313 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 314 | "-Dmaven.home=${M2_HOME}" \ 315 | "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 316 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 317 | --------------------------------------------------------------------------------