diff --git a/car/pom.xml b/car/pom.xml index 108906b91dc88f29a16498d97bfb96d11cdf4082..6e3de5f7b88893d896e43d56380968d13451fffc 100644 --- a/car/pom.xml +++ b/car/pom.xml @@ -47,18 +47,6 @@ <artifactId>spring-data-jpa</artifactId> <version>3.0.3</version> </dependency> - <dependency> - <groupId>fi.muni</groupId> - <artifactId>driver</artifactId> - <version>0.0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>fi.muni</groupId> - <artifactId>component</artifactId> - <version>0.0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> diff --git a/car/src/main/java/cz/muni/pa165/car/App.java b/car/src/main/java/cz/muni/pa165/car/App.java index acf19d92fe628aadaa00a9cfbab48f4bcba05208..7895bd37eb0693f14cfff02ac44f7444033a4a9e 100644 --- a/car/src/main/java/cz/muni/pa165/car/App.java +++ b/car/src/main/java/cz/muni/pa165/car/App.java @@ -1,10 +1,7 @@ package cz.muni.pa165.car; import cz.muni.pa165.car.data.model.Car; -import cz.muni.pa165.common_library.client.ClientConfig; import cz.muni.pa165.common_library.exception.RestExceptionHandler; -import cz.muni.pa165.component.data.model.CarComponent; -import cz.muni.pa165.driver.data.model.Driver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; @@ -20,7 +17,7 @@ import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableJpaRepositories(basePackages = {"cz.muni.pa165.car.data.repository"}) @EnableTransactionManagement -@EntityScan(basePackageClasses = {Car.class, Driver.class, CarComponent.class}) +@EntityScan(basePackageClasses = {Car.class}) //@Import({RestExceptionHandler.class, ClientConfig.class}) @Import(RestExceptionHandler.class) public class App { diff --git a/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentPairRepository.java b/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentPairRepository.java deleted file mode 100644 index 2a9f5a730a2a61dc484d094c25ac01a4d1dd6911..0000000000000000000000000000000000000000 --- a/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentPairRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package cz.muni.pa165.car.data.repository; - -import cz.muni.pa165.car.data.model.Car; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Repository for manipulation with car's components. - */ -@Repository -public interface CarComponentPairRepository extends JpaRepository<Car, Long> {} diff --git a/car/src/main/java/cz/muni/pa165/car/data/repository/CarDriverPairRepository.java b/car/src/main/java/cz/muni/pa165/car/data/repository/CarDriverPairRepository.java deleted file mode 100644 index 4f8aa431f3ba7bef35b04f5ac6070b30c994bc6c..0000000000000000000000000000000000000000 --- a/car/src/main/java/cz/muni/pa165/car/data/repository/CarDriverPairRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package cz.muni.pa165.car.data.repository; - -import cz.muni.pa165.car.data.model.Car; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Repository for manipulation with car's drivers. - */ -@Repository -public interface CarDriverPairRepository extends JpaRepository<Car, Long> {} diff --git a/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java b/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java index 0349e541db453f6e8d16e9d8043f8a85fb3a4a2f..dd5d13b9f72a9426f880761a81bc296abb75ea87 100644 --- a/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java +++ b/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java @@ -1,12 +1,8 @@ package cz.muni.pa165.car.mapper; -import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb; - import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.common_library.dtos.CarRequestDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; -import cz.muni.pa165.common_library.exception.DatabaseException; -import cz.muni.pa165.component.data.model.CarComponent; import java.util.ArrayList; import java.util.HashSet; diff --git a/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java b/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java index 3af0bd4ddce4ee4c59a47746684e746ecc57f364..c7c2e8fad4ddda4554bb460549e3d9213c638ad1 100644 --- a/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java +++ b/car/src/main/java/cz/muni/pa165/car/rest/CarComponentPairController.java @@ -2,8 +2,7 @@ package cz.muni.pa165.car.rest; import cz.muni.pa165.car.restemplate.DbGetter; import cz.muni.pa165.car.service.CarComponentPairService; -import cz.muni.pa165.common_library.dtos.CarComponentDto; -import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; import io.swagger.v3.oas.annotations.Operation; @@ -13,7 +12,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.Mapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -70,35 +68,38 @@ public class CarComponentPairController { * @return List of components. */ @Operation(summary = "Get all components of a car") - @PutMapping(path = "/getcomponents", + @GetMapping(path = "/getcomponents", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<List<CarComponentDto>> getAllComponentsOfCar(@RequestParam Long carId) { + public ResponseEntity<List<CarComponentResponseDto>> getAllComponentsOfCar(@RequestParam Long carId) { return ResponseEntity.ok(carComponentService.getAllComponentsOfCar(carId)); } /** - * Calls service to get all components. + * For a given car ID and a component ID of that car returns a list of components + * of the same name. * - * @return List of components. + * @param carId Id of a car. + * @param componentId Id of a component of the given car. + * @return list of all spare components of the same name. */ @Operation(summary = "Get all components from component repo") - @GetMapping(path = "/getStoredComponentsOfType", + @GetMapping(path = "/getsparecomponents", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<List<CarComponentDto>> getAllCarComponents(@RequestParam Long carId, @RequestParam Long componentId) { - List<CarComponentDto> allComponents = DbGetter.getAllComponentsFromDb(); + public ResponseEntity<List<CarComponentResponseDto>> getAllCarComponents(@RequestParam Long carId, @RequestParam Long componentId) { + List<CarComponentResponseDto> allComponents = DbGetter.getAllComponentsFromDb(); var carComponentsResponse = getAllComponentsOfCar(carId); var carComponents = carComponentsResponse.getBody(); - CarComponentDto requestedComponent = null; + CarComponentResponseDto requestedComponent = null; assert carComponents != null; - for (CarComponentDto carComponent: allComponents) { + for (CarComponentResponseDto carComponent: allComponents) { if (carComponent.getId().equals(componentId)) { requestedComponent = carComponent; break; } } assert requestedComponent != null; - List<CarComponentDto> allViableReplacements = new ArrayList<>(); - for (CarComponentDto carComponent: allComponents) { + List<CarComponentResponseDto> allViableReplacements = new ArrayList<>(); + for (CarComponentResponseDto carComponent: allComponents) { if (carComponent.getName().equals(requestedComponent.getName()) && !carComponent.getId().equals(componentId)) { allViableReplacements.add(carComponent); } diff --git a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java index 4d4c0f7115ed091733abc690264131eb38025af1..434c6a589f5af1339d0173e98629920499e1e686 100644 --- a/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java +++ b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java @@ -1,9 +1,7 @@ package cz.muni.pa165.car.restemplate; -import cz.muni.pa165.common_library.dtos.CarComponentDto; -import cz.muni.pa165.component.data.model.CarComponent; -import cz.muni.pa165.driver.data.model.Driver; -import org.springframework.beans.factory.annotation.Autowired; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; +import cz.muni.pa165.common_library.dtos.DriverInsightDto; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -29,9 +27,9 @@ public class DbGetter { * @param id driver id * @return Driver object */ - public static Driver getDriverFromDb(Long id) { + public static DriverInsightDto getDriverFromDb(Long id) { String url = GET_DRIVER_URL + id; - ResponseEntity<Driver> response = client.getForEntity(url, Driver.class); + ResponseEntity<DriverInsightDto> response = client.getForEntity(url, DriverInsightDto.class); return response.getBody(); } @@ -41,16 +39,16 @@ public class DbGetter { * @param id component id * @return Component object */ - public static CarComponent getComponentFromDb(Long id) { + public static CarComponentResponseDto getComponentFromDb(Long id) { String url = GET_COMPONENT_URL + id; - ResponseEntity<CarComponent> response = client.getForEntity(url, CarComponent.class); + ResponseEntity<CarComponentResponseDto> response = client.getForEntity(url, CarComponentResponseDto.class); return response.getBody(); } - public static List<CarComponentDto> getAllComponentsFromDb() { + public static List<CarComponentResponseDto> getAllComponentsFromDb() { String url = GET_ALL_COMPONENTS; - var response = client.getForEntity(url, CarComponentDto[].class); - CarComponentDto[] carComponents = response.getBody(); + var response = client.getForEntity(url, CarComponentResponseDto[].class); + CarComponentResponseDto[] carComponents = response.getBody(); assert carComponents != null; return Arrays.stream(carComponents).toList(); } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairService.java b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairService.java index 19e2cdddc5bc605e7d33486faa56ad3b83ac7a41..cc07096cba91a37a51a067259def6fdb5206b0f8 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairService.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairService.java @@ -1,6 +1,6 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.common_library.dtos.CarComponentDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; import java.util.List; @@ -32,5 +32,5 @@ public interface CarComponentPairService { * @param carId Id of the car. * @return Components of the cat. */ - List<CarComponentDto> getAllComponentsOfCar(Long carId); + List<CarComponentResponseDto> getAllComponentsOfCar(Long carId); } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java index b7007a67fde7f088299429a6fa32ff5fb7599b3a..6bfab5d00423c8d3d98678183195ed5aa81459c5 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarComponentPairServiceImpl.java @@ -5,10 +5,9 @@ import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb; import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.car.data.repository.CarRepository; import cz.muni.pa165.car.mapper.CarMapper; -import cz.muni.pa165.common_library.dtos.CarComponentDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.exception.DatabaseException; -import cz.muni.pa165.component.data.model.CarComponent; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -41,7 +40,7 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { throw new DatabaseException("Component with id " + componentId + " already in use"); } var components = car.getComponents(); - CarComponent carComponent = getComponentFromDb(componentId); + CarComponentResponseDto carComponent = getComponentFromDb(componentId); components.add(carComponent.getId()); car.setComponents(components); carRepository.save(car); @@ -64,14 +63,14 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { } @Override - public List<CarComponentDto> getAllComponentsOfCar(Long carId) { + public List<CarComponentResponseDto> getAllComponentsOfCar(Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var componentDtos = new ArrayList<CarComponentDto>(); + var componentDtos = new ArrayList<CarComponentResponseDto>(); for (Long id : car.getComponents()) { - CarComponent carComponent = getComponentFromDb(id); + CarComponentResponseDto carComponent = getComponentFromDb(id); componentDtos.add( - new CarComponentDto( + new CarComponentResponseDto( carComponent.getId(), carComponent.getWeight(), carComponent.getPrice(), diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java index 013c4eeceae1d2d5cc1041a4bcd3da364f3118a8..543d9dc41a8f8c0e2c5809ae530ba7bdaaaceb5c 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairServiceImpl.java @@ -6,8 +6,8 @@ import cz.muni.pa165.car.data.repository.CarRepository; import cz.muni.pa165.car.mapper.CarMapper; import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.dtos.DriverDto; +import cz.muni.pa165.common_library.dtos.DriverInsightDto; import cz.muni.pa165.common_library.exception.DatabaseException; -import cz.muni.pa165.driver.data.model.Driver; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -38,7 +38,7 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { var drivers = car.getDrivers(); var savedDriver = getDriverFromDb(driverId); - drivers.add(savedDriver.getId()); + drivers.add(savedDriver.id()); car.setDrivers(drivers); carRepository.save(car); @@ -66,11 +66,11 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { () -> new DatabaseException("Car not found")); var driverDtos = new ArrayList<DriverDto>(); for (Long id : car.getDrivers()) { - Driver driver = getDriverFromDb(id); + DriverInsightDto driver = getDriverFromDb(id); driverDtos.add( - new DriverDto(driver.getId(), - driver.getName(), - driver.getSurname()) + new DriverDto(driver.id(), + driver.name(), + driver.surname()) ); } return driverDtos; @@ -82,7 +82,11 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { () -> new DatabaseException("Car not found")); var savedDriver = getDriverFromDb(driverId); - car.setMainDriverId(savedDriver.getId()); + car.setMainDriverId(savedDriver.id()); + + var drivers = car.getDrivers(); + drivers.add(savedDriver.id()); + car.setDrivers(drivers); carRepository.save(car); return CarMapper.carConverterToDto(car); } diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentRequestDto.java b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentRequestDto.java new file mode 100644 index 0000000000000000000000000000000000000000..9b2adc19781214befc641794397495e296b45319 --- /dev/null +++ b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentRequestDto.java @@ -0,0 +1,35 @@ +package cz.muni.pa165.common_library.dtos; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * Data Transfer object for CarComponent class. + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CarComponentRequestDto { + @NotNull + @Schema(description = "component weight", example = "50") + BigDecimal weight; + + @NotNull + @Schema(description = "component price", example = "24000") + BigDecimal price; + + @NotNull + @Schema(description = "name of the manufacturer", example = "Michellin") + String manufacturer; + + @NotNull + @Schema(description = "component name", example = "Default engine") + String name; +} diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentDto.java b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentResponseDto.java similarity index 95% rename from common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentDto.java rename to common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentResponseDto.java index f34f23030a25f4e365386384f09ceddaa031a978..3d8c5a12c7aab3a4b4b45d8309f28890aac81c00 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentDto.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarComponentResponseDto.java @@ -15,7 +15,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class CarComponentDto { +public class CarComponentResponseDto { @NotNull @Schema(description = "component id", example = "1") diff --git a/component/src/main/java/cz/muni/pa165/component/rest/ComponentController.java b/component/src/main/java/cz/muni/pa165/component/rest/ComponentController.java index d4d15522bb67540e27ac43cfbff78cffff2c34d6..ac335cd0acff5042aa83c274c4cb76c8f17320ef 100644 --- a/component/src/main/java/cz/muni/pa165/component/rest/ComponentController.java +++ b/component/src/main/java/cz/muni/pa165/component/rest/ComponentController.java @@ -1,6 +1,7 @@ package cz.muni.pa165.component.rest; -import cz.muni.pa165.common_library.dtos.CarComponentDto; +import cz.muni.pa165.common_library.dtos.CarComponentRequestDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import cz.muni.pa165.component.service.ComponentServiceInterface; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; @@ -33,8 +34,8 @@ public class ComponentController { @Operation(summary = "Create new component") @PostMapping(path = "/", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarComponentDto> createComponent( - @Valid @RequestBody CarComponentDto carComponent) { + public ResponseEntity<CarComponentResponseDto> createComponent( + @Valid @RequestBody CarComponentRequestDto carComponent) { return ResponseEntity.ok(componentService.postCarComponent(carComponent)); } @@ -48,14 +49,14 @@ public class ComponentController { @Operation(summary = "Get a car component") @GetMapping(path = "/id", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarComponentDto> getComponent(@Valid @RequestParam long componentId) { + public ResponseEntity<CarComponentResponseDto> getComponent(@Valid @RequestParam long componentId) { return ResponseEntity.ok(componentService.getCarComponentById(componentId)); } @Operation(summary = "Get all car components") @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<List<CarComponentDto>> getComponents() { + public ResponseEntity<List<CarComponentResponseDto>> getComponents() { return ResponseEntity.ok(componentService.getAllCarComponents()); } } diff --git a/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java b/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java index 67fbb02d068d48abe0c2728616177187f06d5137..c5628c6f3d90f9e56f6c0a9eaadaa6ec6f66a125 100644 --- a/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java +++ b/component/src/main/java/cz/muni/pa165/component/service/ComponentService.java @@ -1,6 +1,7 @@ package cz.muni.pa165.component.service; -import cz.muni.pa165.common_library.dtos.CarComponentDto; +import cz.muni.pa165.common_library.dtos.CarComponentRequestDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import cz.muni.pa165.common_library.exception.DatabaseException; import cz.muni.pa165.component.data.model.CarComponent; import cz.muni.pa165.component.data.repository.ComponentRepositoryInterface; @@ -22,9 +23,9 @@ public class ComponentService implements ComponentServiceInterface { this.componentRepository = componentRepository; } - public CarComponentDto postCarComponent(CarComponentDto carComponentDto) { + public CarComponentResponseDto postCarComponent(CarComponentRequestDto carComponentDto) { return carComponentConverter(componentRepository.save( - carComponentDtoConverter(carComponentDto))); + carComponentDtoConverterWithoutID(carComponentDto))); } /** @@ -33,7 +34,7 @@ public class ComponentService implements ComponentServiceInterface { * @param carComponentId id of the component. * @return found car component. */ - public CarComponentDto getCarComponentById(Long carComponentId) { + public CarComponentResponseDto getCarComponentById(Long carComponentId) { return carComponentConverter(componentRepository.findById(carComponentId).orElseThrow( () -> new DatabaseException("Something went wrong when finding car component with id: " + carComponentId + " in the database."))); @@ -44,7 +45,7 @@ public class ComponentService implements ComponentServiceInterface { * * @return list of stored car components. */ - public List<CarComponentDto> getAllCarComponents() { + public List<CarComponentResponseDto> getAllCarComponents() { return componentRepository.findAll() .stream() .map(this::carComponentConverter) @@ -61,7 +62,17 @@ public class ComponentService implements ComponentServiceInterface { return "Car component with id: " + carComponentId + "was successfully deleted"; } - CarComponent carComponentDtoConverter(CarComponentDto carComponentDto) { + CarComponent carComponentDtoConverterWithoutID(CarComponentRequestDto carComponentDto) { + return CarComponent.builder() + .id(null) + .weight(carComponentDto.getWeight()) + .price(carComponentDto.getPrice()) + .manufacturer(carComponentDto.getManufacturer()) + .name(carComponentDto.getName()) + .build(); + } + + CarComponent carComponentDtoConverter(CarComponentResponseDto carComponentDto) { return CarComponent.builder() .id(carComponentDto.getId()) .weight(carComponentDto.getWeight()) @@ -71,8 +82,8 @@ public class ComponentService implements ComponentServiceInterface { .build(); } - CarComponentDto carComponentConverter(CarComponent carComponent) { - return CarComponentDto.builder() + CarComponentResponseDto carComponentConverter(CarComponent carComponent) { + return CarComponentResponseDto.builder() .id(carComponent.getId()) .weight(carComponent.getWeight()) .price(carComponent.getPrice()) diff --git a/component/src/main/java/cz/muni/pa165/component/service/ComponentServiceInterface.java b/component/src/main/java/cz/muni/pa165/component/service/ComponentServiceInterface.java index 4ce60cfef740497e72bff9a7b9025491c74d45c5..3cb71c2fa7e8a4dde9cc15388b63d643d9a0f869 100644 --- a/component/src/main/java/cz/muni/pa165/component/service/ComponentServiceInterface.java +++ b/component/src/main/java/cz/muni/pa165/component/service/ComponentServiceInterface.java @@ -1,6 +1,7 @@ package cz.muni.pa165.component.service; -import cz.muni.pa165.common_library.dtos.CarComponentDto; +import cz.muni.pa165.common_library.dtos.CarComponentRequestDto; +import cz.muni.pa165.common_library.dtos.CarComponentResponseDto; import java.util.List; @@ -9,11 +10,11 @@ import java.util.List; */ public interface ComponentServiceInterface { - public CarComponentDto postCarComponent(CarComponentDto carComponentDto); + public CarComponentResponseDto postCarComponent(CarComponentRequestDto carComponentDto); - public CarComponentDto getCarComponentById(Long carComponentId); + public CarComponentResponseDto getCarComponentById(Long carComponentId); - public List<CarComponentDto> getAllCarComponents(); + public List<CarComponentResponseDto> getAllCarComponents(); public String deleteById(Long carComponentId); diff --git a/race/pom.xml b/race/pom.xml index 724c41b9a3e206e732cc80eb0f6b20b788bab4ec..266c650e014f8a1ddca70c7dbf43f2ba0338defa 100644 --- a/race/pom.xml +++ b/race/pom.xml @@ -32,24 +32,6 @@ <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> - <dependency> - <groupId>fi.muni</groupId> - <artifactId>car</artifactId> - <version>0.0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>fi.muni</groupId> - <artifactId>driver</artifactId> - <version>0.0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>fi.muni</groupId> - <artifactId>component</artifactId> - <version>0.0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> diff --git a/race/src/main/java/cz/muni/pa165/race/App.java b/race/src/main/java/cz/muni/pa165/race/App.java index 172899c5771f8e094eeb302d6d95f80b0fe27573..874755e90d6b2d58231719d80c9f79ee6e25937f 100644 --- a/race/src/main/java/cz/muni/pa165/race/App.java +++ b/race/src/main/java/cz/muni/pa165/race/App.java @@ -1,10 +1,8 @@ package cz.muni.pa165.race; -import cz.muni.pa165.car.data.model.Car; + import cz.muni.pa165.common_library.client.ClientConfig; import cz.muni.pa165.common_library.exception.RestExceptionHandler; -import cz.muni.pa165.component.data.model.CarComponent; -import cz.muni.pa165.driver.data.model.Driver; import cz.muni.pa165.race.data.model.Race; import cz.muni.pa165.race.data.model.Season; import org.springframework.boot.SpringApplication; @@ -20,8 +18,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication @EnableJpaRepositories(basePackages = "cz.muni.pa165.race.data.repository") @EnableTransactionManagement -@EntityScan(basePackageClasses = {Race.class, Season.class, Car.class, Driver.class, - CarComponent.class}) +@EntityScan(basePackageClasses = {Race.class, Season.class}) @Import({RestExceptionHandler.class, ClientConfig.class}) public class App { diff --git a/race/src/main/java/cz/muni/pa165/race/data/model/Race.java b/race/src/main/java/cz/muni/pa165/race/data/model/Race.java index e158c0f1934cd7d407ef4c0ad48f9f9a291e5530..dba10990acb1741bf1f97e1432d46d74bac7c17e 100644 --- a/race/src/main/java/cz/muni/pa165/race/data/model/Race.java +++ b/race/src/main/java/cz/muni/pa165/race/data/model/Race.java @@ -1,20 +1,15 @@ package cz.muni.pa165.race.data.model; -import cz.muni.pa165.car.data.model.Car; import cz.muni.pa165.common_library.dtos.Location; -import cz.muni.pa165.driver.data.model.Driver; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import jakarta.validation.constraints.Max; diff --git a/race/src/main/java/cz/muni/pa165/race/data/repository/CarRepository.java b/race/src/main/java/cz/muni/pa165/race/data/repository/CarRepository.java deleted file mode 100644 index b0f8e24736e5d946c712c7caa9a2ee8fcf763c03..0000000000000000000000000000000000000000 --- a/race/src/main/java/cz/muni/pa165/race/data/repository/CarRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package cz.muni.pa165.race.data.repository; - -import cz.muni.pa165.car.data.model.Car; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Repository for car. - */ -@Repository -public interface CarRepository extends JpaRepository<Car, Long> { - -} diff --git a/race/src/main/java/cz/muni/pa165/race/data/repository/DriverRepository.java b/race/src/main/java/cz/muni/pa165/race/data/repository/DriverRepository.java deleted file mode 100644 index c5738d33a2066923df8aed853f8efb0ed2504c03..0000000000000000000000000000000000000000 --- a/race/src/main/java/cz/muni/pa165/race/data/repository/DriverRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package cz.muni.pa165.race.data.repository; - - -import cz.muni.pa165.driver.data.model.Driver; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Driver repository. - */ -@Repository -public interface DriverRepository extends JpaRepository<Driver, Long> { -} diff --git a/race/src/main/java/cz/muni/pa165/race/data/repository/RaceRepository.java b/race/src/main/java/cz/muni/pa165/race/data/repository/RaceRepository.java index 6c9f7ce68d5a82f47cbea4cc8750a87508bb973f..b1bdd7be9675172e847cfbbfd19ab69e1fb066e5 100644 --- a/race/src/main/java/cz/muni/pa165/race/data/repository/RaceRepository.java +++ b/race/src/main/java/cz/muni/pa165/race/data/repository/RaceRepository.java @@ -21,4 +21,9 @@ public interface RaceRepository extends JpaRepository<Race, Long> { + "WHERE ri.location = :location AND (do.id = :driverId OR dt.id = :driverId)") List<Race> findAllRacesOfDriverInLocation(@Param("location") Location raceLocation, @Param("driverId") long driverId); + + @Query("SELECT r FROM Race r" + + " JOIN r.raceInfo ri " + + "WHERE ri.location = :location") + List<Race> findRacesByLocation(@Param("location") Location raceLocation); } diff --git a/race/src/main/java/cz/muni/pa165/race/rest/RaceController.java b/race/src/main/java/cz/muni/pa165/race/rest/RaceController.java index 94b7693e2e13a22f2576440950ce28251ac2d7d6..907c1066bfcde52f66c95b7c435817bd4d882bde 100644 --- a/race/src/main/java/cz/muni/pa165/race/rest/RaceController.java +++ b/race/src/main/java/cz/muni/pa165/race/rest/RaceController.java @@ -1,11 +1,13 @@ package cz.muni.pa165.race.rest; +import cz.muni.pa165.common_library.dtos.Location; import cz.muni.pa165.common_library.dtos.RaceDto; -import cz.muni.pa165.race.service.RaceService; +import cz.muni.pa165.race.service.RaceServiceI; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import java.util.List; +import java.util.Set; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -26,9 +28,9 @@ import org.springframework.web.bind.annotation.RestController; @Validated public class RaceController { - RaceService raceService; + RaceServiceI raceService; - public RaceController(RaceService raceService) { + public RaceController(RaceServiceI raceService) { this.raceService = raceService; } @@ -64,8 +66,8 @@ public class RaceController { @PatchMapping(path = "/assignDriverOne", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<RaceDto> assignDriverOne(@RequestParam Long driverOneId, - @RequestParam Long raceId, - @RequestParam Long carId) { + @RequestParam Long raceId, + @RequestParam Long carId) { return ResponseEntity.ok(raceService.assignDriverOne(driverOneId, raceId, carId)); } @@ -73,8 +75,31 @@ public class RaceController { @PatchMapping(path = "/assignDriverTwo", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<RaceDto> assignDriverTwo(@RequestParam Long driverTwoId, - @RequestParam Long raceId, - @RequestParam Long carId) { + @RequestParam Long raceId, + @RequestParam Long carId) { return ResponseEntity.ok(raceService.assignDriverTwo(driverTwoId, raceId, carId)); } + + @Operation(summary = "Assign position for driver two") + @PatchMapping(path = "/assignPointsDriverTwo", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<RaceDto> assignPositionDriverTwo(@RequestParam Long raceId, + @RequestParam Integer position) { + return ResponseEntity.ok(raceService.assignPositionForDriverTwo(raceId, position)); + } + + @Operation(summary = "Assign position for driver two") + @PatchMapping(path = "/assignPointsDriverOne", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<RaceDto> assignPositionDriverOne(@RequestParam Long raceId, + @RequestParam Integer position) { + return ResponseEntity.ok(raceService.assignPositionForDriverOne(raceId, position)); + } + + @Operation(summary = "get races") + @GetMapping(path = "/findMostSuitableDriversForLocation") + public ResponseEntity<Set<Long>> getMostSuitableDriversForLocation( + @RequestParam Location location) { + return ResponseEntity.ok(raceService.findMostSuitableDriver(location)); + } } diff --git a/race/src/main/java/cz/muni/pa165/race/rest/SeasonController.java b/race/src/main/java/cz/muni/pa165/race/rest/SeasonController.java index b3ced6adf195628df009699e0e7459d7358c65ea..18526b60120d6ef8529b817dddfa6fabafe8a25a 100644 --- a/race/src/main/java/cz/muni/pa165/race/rest/SeasonController.java +++ b/race/src/main/java/cz/muni/pa165/race/rest/SeasonController.java @@ -1,7 +1,7 @@ package cz.muni.pa165.race.rest; import cz.muni.pa165.common_library.dtos.SeasonDto; -import cz.muni.pa165.race.service.SeasonServiceInterface; +import cz.muni.pa165.race.service.SeasonServiceI; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import java.util.List; @@ -25,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController; @Validated public class SeasonController { - SeasonServiceInterface seasonService; + SeasonServiceI seasonService; - public SeasonController(SeasonServiceInterface seasonService) { + public SeasonController(SeasonServiceI seasonService) { this.seasonService = seasonService; } diff --git a/race/src/main/java/cz/muni/pa165/race/service/PointsUtil.java b/race/src/main/java/cz/muni/pa165/race/service/PointsUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..22e9f8dd19feed47eb2395281fe3db6aa23c0381 --- /dev/null +++ b/race/src/main/java/cz/muni/pa165/race/service/PointsUtil.java @@ -0,0 +1,32 @@ +package cz.muni.pa165.race.service; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility for points per position. + */ +public class PointsUtil { + + /** + * Map with position and corresponding points. + */ + public Map<Integer, Integer> points; + + /** + * Constructor. + */ + public PointsUtil() { + points = new HashMap<>(); + points.put(1, 25); + points.put(2, 18); + points.put(3, 15); + points.put(4, 12); + points.put(5, 10); + points.put(6, 8); + points.put(7, 6); + points.put(8, 4); + points.put(9, 2); + points.put(10, 1); + } +} diff --git a/race/src/main/java/cz/muni/pa165/race/service/RaceService.java b/race/src/main/java/cz/muni/pa165/race/service/RaceService.java index 7da921067a2552e039ce9fe188e3418c82b44f17..48797427e5a4ea415d066893b00fbc75636b3fbc 100644 --- a/race/src/main/java/cz/muni/pa165/race/service/RaceService.java +++ b/race/src/main/java/cz/muni/pa165/race/service/RaceService.java @@ -1,17 +1,21 @@ package cz.muni.pa165.race.service; -import cz.muni.pa165.car.data.model.Car; +import cz.muni.pa165.common_library.dtos.CarResponseDto; +import cz.muni.pa165.common_library.dtos.DriverDto; +import cz.muni.pa165.common_library.dtos.Location; import cz.muni.pa165.common_library.dtos.RaceDriverCarDto; import cz.muni.pa165.common_library.dtos.RaceDto; import cz.muni.pa165.common_library.exception.BadRequestException; import cz.muni.pa165.common_library.exception.DatabaseException; -import cz.muni.pa165.driver.data.model.Driver; import cz.muni.pa165.race.data.model.Race; -import cz.muni.pa165.race.data.repository.CarRepository; -import cz.muni.pa165.race.data.repository.DriverRepository; import cz.muni.pa165.race.data.repository.RaceRepository; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -21,20 +25,17 @@ import org.springframework.web.client.RestTemplate; */ // TODO chybnú hlášku spraviť konštantu @Service -public class RaceService { +public class RaceService implements RaceServiceI { + + PointsUtil pointsUtil = new PointsUtil(); RaceRepository raceRepository; - CarRepository carRepository; - DriverRepository driverRepository; @Autowired RestTemplate client; - RaceService(RaceRepository raceRepository, CarRepository carRepository, - DriverRepository driverRepository) { + RaceService(RaceRepository raceRepository) { this.raceRepository = raceRepository; - this.carRepository = carRepository; - this.driverRepository = driverRepository; } /** @@ -97,7 +98,8 @@ public class RaceService { race.getDriver2().setDriverId(driver.getId()); race.getDriver2().setCarId(car.getId()); - return convertRace(raceRepository.save(race)); + var a = convertRace(raceRepository.save(race)); + return a; } /** @@ -121,6 +123,75 @@ public class RaceService { return raceRepository.findAll().stream().map(this::convertRace).toList(); } + /** + * Assigns positions for driver number two. + * + * @param raceId race id. + * @param position position of driver two. + * @return updated race. + */ + public RaceDto assignPositionForDriverTwo(Long raceId, Integer position) { + var race = + raceRepository.findById(raceId).orElseThrow(() -> new DatabaseException("Race not found")); + race.getDriver2().setFinalPosition(position); + return convertRace(raceRepository.save(race)); + } + + /** + * Assigns positions for driver number one. + * + * @param raceId race id. + * @param position position of driver one. + * @return updated race. + */ + public RaceDto assignPositionForDriverOne(Long raceId, Integer position) { + var race = + raceRepository.findById(raceId).orElseThrow(() -> new DatabaseException("Race not found")); + race.getDriver2().setFinalPosition(position); + return convertRace(raceRepository.save(race)); + } + + /** + * Finds most suitable drivers for given location. + * + * @param location location of the race. + * @return set if ids of most suitable drivers for given location. + */ + public Set<Long> findMostSuitableDriver(Location location) { + var races = raceRepository.findRacesByLocation(location); + Map<Long, Integer> driverWithPoints = new HashMap<>(); + + for (Race race : races) { + updatePointsForDriver(race.getDriver1(), driverWithPoints); + updatePointsForDriver(race.getDriver2(), driverWithPoints); + } + + var max = Collections.max(driverWithPoints.values()); + Set<Long> drivers = new HashSet<>(); + for (Map.Entry<Long, Integer> entry : driverWithPoints.entrySet()) { + if (Objects.equals(entry.getValue(), max)) { + drivers.add(entry.getKey()); + } + } + return drivers; + } + + private void updatePointsForDriver(Race.RaceDriverinfo driverinfo, + Map<Long, Integer> driverWithPoints) { + if (driverinfo == null || driverinfo.getDriverId() == null) { + return; + } + + Integer points; + if (driverinfo.getFinalPosition() != null) { + points = pointsUtil.points.get(driverinfo.getFinalPosition()); + } else { + points = 0; + } + + driverWithPoints.merge(driverinfo.getDriverId(), points, Integer::sum); + } + private Race convertRaceDto(RaceDto raceDto) { var race = Race.builder() .id(raceDto.getId()) @@ -176,20 +247,21 @@ public class RaceService { if (race.getDriver2() != null) { raceDto.setDriverTwo(RaceDriverCarDto.builder() .carId(race.getDriver2().getCarId()) - .driverId(race.getDriver2().getCarId()) + .driverId(race.getDriver2().getDriverId()) .build()); } return raceDto; } - private Driver getDriver(Long driverId) { + private DriverDto getDriver(Long driverId) { var response = - client.getForEntity("http://localhost:8083/driver/get/id=" + driverId, Driver.class); + client.getForEntity("http://localhost:8083/driver/get/id=" + driverId, DriverDto.class); return response.getBody(); } - private Car getCar(Long carId) { - var response = client.getForEntity("http://localhost:8082/car/id=" + carId, Car.class); + private CarResponseDto getCar(Long carId) { + var response = + client.getForEntity("http://localhost:8082/car/?carId=" + carId, CarResponseDto.class); return response.getBody(); } } diff --git a/race/src/main/java/cz/muni/pa165/race/service/RaceServiceI.java b/race/src/main/java/cz/muni/pa165/race/service/RaceServiceI.java new file mode 100644 index 0000000000000000000000000000000000000000..55e92823da8ac08e19eae21e20581b8374a23bb0 --- /dev/null +++ b/race/src/main/java/cz/muni/pa165/race/service/RaceServiceI.java @@ -0,0 +1,30 @@ +package cz.muni.pa165.race.service; + +import cz.muni.pa165.common_library.dtos.Location; +import cz.muni.pa165.common_library.dtos.RaceDto; +import java.util.List; +import java.util.Set; + +/** + * Race service interface. + */ +public interface RaceServiceI { + + RaceDto postRace(RaceDto raceDto); + + RaceDto findRaceById(Long raceId); + + List<RaceDto> findRaces(); + + String deleteRace(Long raceId); + + RaceDto assignDriverOne(Long driverId, Long raceId, Long carId); + + RaceDto assignDriverTwo(Long driverId, Long raceId, Long carId); + + Set<Long> findMostSuitableDriver(Location location); + + RaceDto assignPositionForDriverTwo(Long raceId, Integer position); + + RaceDto assignPositionForDriverOne(Long raceId, Integer position); +} diff --git a/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java b/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java index a625082e7da5bc751f85052ff2c79fa6bf1b9c45..78670308be1f9f75ec5a07814ebf7bb58841bf21 100644 --- a/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java +++ b/race/src/main/java/cz/muni/pa165/race/service/SeasonService.java @@ -15,7 +15,7 @@ import org.springframework.stereotype.Service; * Season service. */ @Service -public class SeasonService implements SeasonServiceInterface { +public class SeasonService implements SeasonServiceI { @Autowired SeasonRepository seasonRepository; diff --git a/race/src/main/java/cz/muni/pa165/race/service/SeasonServiceInterface.java b/race/src/main/java/cz/muni/pa165/race/service/SeasonServiceI.java similarity index 89% rename from race/src/main/java/cz/muni/pa165/race/service/SeasonServiceInterface.java rename to race/src/main/java/cz/muni/pa165/race/service/SeasonServiceI.java index 80da12d7a9743d1a060d9e1a1ea92d1514c14eff..004dc30a05f931574772f302c4081bf80cfac28f 100644 --- a/race/src/main/java/cz/muni/pa165/race/service/SeasonServiceInterface.java +++ b/race/src/main/java/cz/muni/pa165/race/service/SeasonServiceI.java @@ -6,7 +6,7 @@ import java.util.List; /** * Interface for season service. */ -public interface SeasonServiceInterface { +public interface SeasonServiceI { SeasonDto postSeason(SeasonDto seasonDto);