diff --git a/car/pom.xml b/car/pom.xml index 91c37dc076ca0fde137a06281d1b7a961e2b8624..108906b91dc88f29a16498d97bfb96d11cdf4082 100644 --- a/car/pom.xml +++ b/car/pom.xml @@ -70,4 +70,37 @@ <maven.compiler.target>17</maven.compiler.target> </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.2.0</version> + <configuration> + <archive> + <manifest> + <mainClass>cz.muni.pa165.car.App</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>3.2.4</version> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <createDependencyReducedPom>false</createDependencyReducedPom> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </project> \ No newline at end of file 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 8d546b5142bc6cde3c95a98f00ed947ae323e2bb..acf19d92fe628aadaa00a9cfbab48f4bcba05208 100644 --- a/car/src/main/java/cz/muni/pa165/car/App.java +++ b/car/src/main/java/cz/muni/pa165/car/App.java @@ -1,22 +1,37 @@ 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; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.client.RestTemplate; /** * Main app. */ -@SpringBootApplication(scanBasePackages = {"cz.muni.pa165.car"}) -@EnableJpaRepositories(basePackages = {"cz.muni.pa165.car"}) -@EntityScan("cz.muni.pa165.common_library") +@SpringBootApplication +@EnableJpaRepositories(basePackages = {"cz.muni.pa165.car.data.repository"}) +@EnableTransactionManagement +@EntityScan(basePackageClasses = {Car.class, Driver.class, CarComponent.class}) +//@Import({RestExceptionHandler.class, ClientConfig.class}) @Import(RestExceptionHandler.class) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + } diff --git a/car/src/main/java/cz/muni/pa165/car/data/model/Car.java b/car/src/main/java/cz/muni/pa165/car/data/model/Car.java index 1d82c7f881e541db5ef1bbb5e00bbfeb4a5fea16..75d61eed69f2b7274cb105df5fe2a7f16c852360 100644 --- a/car/src/main/java/cz/muni/pa165/car/data/model/Car.java +++ b/car/src/main/java/cz/muni/pa165/car/data/model/Car.java @@ -1,18 +1,12 @@ package cz.muni.pa165.car.data.model; -import cz.muni.pa165.component.data.model.CarComponent; -import cz.muni.pa165.driver.data.model.Driver; -import jakarta.persistence.CascadeType; +import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import jakarta.validation.Valid; import java.io.Serializable; import java.util.List; import lombok.AllArgsConstructor; @@ -35,17 +29,13 @@ public class Car implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToMany(mappedBy = "id", - fetch = FetchType.EAGER) - private List<@Valid CarComponent> components; + @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) + private List<Long> components; - @OneToMany(mappedBy = "id", - fetch = FetchType.EAGER) - private List<@Valid Driver> drivers; + @ElementCollection(targetClass = Long.class, fetch = FetchType.EAGER) + private List<Long> drivers; - @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) - @JoinColumn(name = "main_driver_id", referencedColumnName = "id") - private Driver mainDriver; + private Long mainDriverId; } diff --git a/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentRepository.java b/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentRepository.java deleted file mode 100644 index 7d8c61e4d21fc3f4bf2f66162d439f3c1a589ffa..0000000000000000000000000000000000000000 --- a/car/src/main/java/cz/muni/pa165/car/data/repository/CarComponentRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package cz.muni.pa165.car.data.repository; - -import cz.muni.pa165.component.data.model.CarComponent; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Repository for Car Component. - */ -@Repository -public interface CarComponentRepository extends JpaRepository<CarComponent, Long> {} diff --git a/car/src/main/java/cz/muni/pa165/car/data/repository/DriverRepository.java b/car/src/main/java/cz/muni/pa165/car/data/repository/DriverRepository.java deleted file mode 100644 index cb2bfe5179a78213caed2d8d2b6cdd53d6b3d06d..0000000000000000000000000000000000000000 --- a/car/src/main/java/cz/muni/pa165/car/data/repository/DriverRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package cz.muni.pa165.car.data.repository; - -import cz.muni.pa165.driver.data.model.Driver; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * Repository for driver. - */ -@Repository -public interface DriverRepository extends JpaRepository<Driver, 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 new file mode 100644 index 0000000000000000000000000000000000000000..44ea6e762f75ad7b8c9d366f46c64dc6441858e8 --- /dev/null +++ b/car/src/main/java/cz/muni/pa165/car/mapper/CarMapper.java @@ -0,0 +1,44 @@ +package cz.muni.pa165.car.mapper; + +import cz.muni.pa165.car.data.model.Car; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; + +/** + * Class for converting Car object and its Data Transfer Objects. + */ +public class CarMapper { + + /** + * Converts Dto object to Car object. + * + * @param carRequestDto Dto object of the car. + * @return Car object. + */ + public static Car carDtoConverter(CarRequestDto carRequestDto) { + + return Car.builder() + .id(null) + .components(carRequestDto.getComponentIds()) + .drivers(carRequestDto.getDriverIds()) + .mainDriverId(carRequestDto.getMainDriverId()) + .build(); + } + + /** + * Converts Car object to its Dto. + * + * @param car Car object. + * @return Dto object. + */ + public static CarResponseDto carConverterToDto(Car car) { + + return CarResponseDto.builder() + .id(car.getId()) + .componentIdsNames(car.getComponents()) + .driverIdsNames(car.getDrivers()) + .mainDriverId(car.getMainDriverId()) + .build(); + } + +} 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 a36ff9c478bd281801c6c6afc42c0fbb71c47b2a..8cbf5a412fee36051c429724beaf427698a88b8f 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,7 +2,8 @@ package cz.muni.pa165.car.rest; import cz.muni.pa165.car.service.CarComponentPairService; import cz.muni.pa165.common_library.dtos.CarComponentDto; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import io.swagger.v3.oas.annotations.Operation; import java.util.List; import org.springframework.http.MediaType; @@ -37,8 +38,8 @@ public class CarComponentPairController { @Operation(summary = "Add component to a car") @PutMapping(path = "/addcomponent", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> addComponent(@RequestParam Long componentId, - @RequestParam Long carId) { + public ResponseEntity<CarResponseDto> addComponent(@RequestParam Long componentId, + @RequestParam Long carId) { return ResponseEntity.ok(carComponentService.addComponent(componentId, carId)); } @@ -52,8 +53,8 @@ public class CarComponentPairController { @Operation(summary = "Remove component from a car") @PutMapping(path = "/removecomponent", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> removeComponent(@RequestParam Long componentId, - @RequestParam Long carId) { + public ResponseEntity<CarResponseDto> removeComponent(@RequestParam Long componentId, + @RequestParam Long carId) { return ResponseEntity.ok(carComponentService.removeComponent(componentId, carId)); } diff --git a/car/src/main/java/cz/muni/pa165/car/rest/CarController.java b/car/src/main/java/cz/muni/pa165/car/rest/CarController.java index 8dd02ec82a53c8306e3b962cea4889eb16a37001..be67e6b110a459cd961524b33e54fa758bd64d2e 100644 --- a/car/src/main/java/cz/muni/pa165/car/rest/CarController.java +++ b/car/src/main/java/cz/muni/pa165/car/rest/CarController.java @@ -1,7 +1,8 @@ package cz.muni.pa165.car.rest; import cz.muni.pa165.car.service.CarService; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import java.util.List; @@ -38,14 +39,14 @@ public class CarController { /** * Creates a new car. * - * @param carDto the DTO representing the car to be created + * @param carRequestDto the DTO representing the car to be created * @return a ResponseEntity containing the DTO of the created car */ @Operation(summary = "Create a car") @PostMapping(path = "/", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> createCar(@Valid @RequestBody CarDto carDto) { - return ResponseEntity.ok(carService.postCar(carDto)); + public ResponseEntity<CarResponseDto> createCar(@Valid @RequestBody CarRequestDto carRequestDto) { + return ResponseEntity.ok(carService.postCar(carRequestDto)); } /** @@ -55,7 +56,7 @@ public class CarController { * @return a ResponseEntity containing a message indicating whether the car was deleted or not */ @Operation(summary = "Delete a car") - @DeleteMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @DeleteMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<String> deleteCar(@RequestParam Long carId) { return ResponseEntity.ok(carService.deleteById(carId)); } @@ -67,8 +68,8 @@ public class CarController { * @return a ResponseEntity containing the DTO of the retrieved car */ @Operation(summary = "Get a car") - @GetMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> getCar(@RequestParam Long carId) { + @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<CarResponseDto> getCar(@RequestParam Long carId) { return ResponseEntity.ok(carService.getCarById(carId)); } @@ -78,8 +79,8 @@ public class CarController { * @return a ResponseEntity containing a list of DTOs representing all cars */ @Operation(summary = "Get all cars") - @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<List<CarDto>> getAllSeasons() { + @GetMapping(path = "/all", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<List<CarResponseDto>> getAllCars() { return ResponseEntity.ok(carService.getAllCars()); } diff --git a/car/src/main/java/cz/muni/pa165/car/rest/CarDriverPairController.java b/car/src/main/java/cz/muni/pa165/car/rest/CarDriverPairController.java index 88631333bdac050fb34f5f198982d3c53b91a96e..3c1344dc984b8451e4c9ecc1bb78650d03a5aacd 100644 --- a/car/src/main/java/cz/muni/pa165/car/rest/CarDriverPairController.java +++ b/car/src/main/java/cz/muni/pa165/car/rest/CarDriverPairController.java @@ -1,7 +1,8 @@ package cz.muni.pa165.car.rest; import cz.muni.pa165.car.service.CarDriverPairService; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.dtos.DriverDto; import io.swagger.v3.oas.annotations.Operation; import java.util.List; @@ -21,10 +22,10 @@ import org.springframework.web.bind.annotation.RestController; @Validated public class CarDriverPairController { - CarDriverPairService carDriverService; + CarDriverPairService carDriverPairService; public CarDriverPairController(CarDriverPairService driverManagerService) { - this.carDriverService = driverManagerService; + this.carDriverPairService = driverManagerService; } /** @@ -37,9 +38,9 @@ public class CarDriverPairController { @Operation(summary = "Assign driver to a car") @PutMapping(path = "/assign", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> assignDriverToCar(@RequestParam Long driverId, - @RequestParam Long carId) { - return ResponseEntity.ok(carDriverService.assignDriverToCar(driverId, carId)); + public ResponseEntity<CarResponseDto> assignDriverToCar(@RequestParam Long driverId, + @RequestParam Long carId) { + return ResponseEntity.ok(carDriverPairService.assignDriverToCar(driverId, carId)); } /** @@ -52,9 +53,9 @@ public class CarDriverPairController { @Operation(summary = "Unassign driver from a car") @PutMapping(path = "/unassign", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<CarDto> unassignDriverFromCar(@RequestParam Long driverId, - @RequestParam Long carId) { - return ResponseEntity.ok(carDriverService.unassignDriverFromCar(driverId, carId)); + public ResponseEntity<CarResponseDto> unassignDriverFromCar(@RequestParam Long driverId, + @RequestParam Long carId) { + return ResponseEntity.ok(carDriverPairService.unassignDriverFromCar(driverId, carId)); } /** @@ -67,6 +68,36 @@ public class CarDriverPairController { @PutMapping(path = "/alldrivers", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<List<DriverDto>> getAllDriversOfCar(@RequestParam Long carId) { - return ResponseEntity.ok(carDriverService.getAllDriversOfCar(carId)); + return ResponseEntity.ok(carDriverPairService.getAllDriversOfCar(carId)); } + + /** + * Sets the main driver of the car identified by the given ID. + * + * @param carId The ID of the car to set the main driver for. + * @param driverId The ID of the driver to set as the main driver. + * @return A ResponseEntity containing a CarDto object + * representing the updated car. + */ + @Operation(summary = "Set main driver for the car") + @PutMapping(path = "/setmain", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<CarResponseDto> setMainDriver(@RequestParam Long carId, Long driverId) { + return ResponseEntity.ok(carDriverPairService.setMainDriver(carId, driverId)); + } + + /** + * Removes the main driver from the car identified by the given ID. + * + * @param carId The ID of the car to remove the main driver from. + * @return A ResponseEntity containing a CarDto object + * representing the updated car. + */ + @Operation(summary = "Set main driver to null value") + @PutMapping(path = "/removemain", + produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity<CarResponseDto> removeMainDriver(@RequestParam Long carId) { + return ResponseEntity.ok(carDriverPairService.removeMainDriver(carId)); + } + } 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 new file mode 100644 index 0000000000000000000000000000000000000000..61a43c0bd756c1dee35f2ba555a601233821d26d --- /dev/null +++ b/car/src/main/java/cz/muni/pa165/car/restemplate/DbGetter.java @@ -0,0 +1,46 @@ +package cz.muni.pa165.car.restemplate; + +import cz.muni.pa165.component.data.model.CarComponent; +import cz.muni.pa165.driver.data.model.Driver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +/** + * Class for retrieving data from other modules using RestTemplate. + */ +@Component +public class DbGetter { + + @Autowired + private static RestTemplate client = new RestTemplate(); + + private static final String GET_DRIVER_URL = "http://localhost:8083/driver/get/id="; + private static final String GET_COMPONENT_URL = "http://localhost:8084/component?id="; + + /** + * Get a driver using RestTemplate client. + * + * @param id driver id + * @return Driver object + */ + public static Driver getDriverFromDb(Long id) { + String url = GET_DRIVER_URL + id; + ResponseEntity<Driver> response = client.getForEntity(url, Driver.class); + return response.getBody(); + } + + /** + * Get a component using RestTemplate client. + * + * @param id component id + * @return Component object + */ + public static CarComponent getComponentFromDb(Long id) { + String url = GET_COMPONENT_URL + id; + ResponseEntity<CarComponent> response = client.getForEntity(url, CarComponent.class); + return response.getBody(); + } + +} 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 5bd94c3db8f658b9be98321a7d7efb5f2a5a3750..19e2cdddc5bc605e7d33486faa56ad3b83ac7a41 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,7 +1,7 @@ package cz.muni.pa165.car.service; import cz.muni.pa165.common_library.dtos.CarComponentDto; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import java.util.List; /** @@ -15,7 +15,7 @@ public interface CarComponentPairService { * @param carId Id of the car. * @return Car with added component. */ - CarDto addComponent(Long componentId, Long carId); + CarResponseDto addComponent(Long componentId, Long carId); /** * Calls repository to remove a component from a car. @@ -24,7 +24,7 @@ public interface CarComponentPairService { * @param carId Id of the car. * @return Car with removed component. */ - CarDto removeComponent(Long componentId, Long carId); + CarResponseDto removeComponent(Long componentId, Long carId); /** * Calls repository ond returns oll components of specific car. 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 bf79e3d1d062ab71320aa6c2e90664a7f709fdb0..f0afe6ccf9ef3677214f516a2c6e32136946a6b8 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 @@ -1,10 +1,11 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.car.data.repository.CarComponentPairRepository; -import cz.muni.pa165.car.data.repository.CarComponentRepository; +import static cz.muni.pa165.car.restemplate.DbGetter.getComponentFromDb; + 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.CarDto; +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; @@ -18,51 +19,41 @@ import org.springframework.stereotype.Service; @Service public class CarComponentPairServiceImpl implements CarComponentPairService { - CarComponentPairRepository carComponentPairRepository; - CarComponentRepository carComponentRepository; CarRepository carRepository; /** * Constructor for Car - Car Component Service. * - * @param carComponentPairRepository Car - Car Component repository - * @param carComponentRepository Car Component repository * @param carRepository Car repository */ - public CarComponentPairServiceImpl(CarComponentPairRepository carComponentPairRepository, - CarComponentRepository carComponentRepository, - CarRepository carRepository) { - this.carComponentPairRepository = carComponentPairRepository; - this.carComponentRepository = carComponentRepository; + public CarComponentPairServiceImpl(CarRepository carRepository) { this.carRepository = carRepository; } @Override - public CarDto addComponent(Long componentId, Long carId) { + public CarResponseDto addComponent(Long componentId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var component = carComponentRepository.findById(componentId).orElseThrow( - () -> new DatabaseException("Component not found")); var components = car.getComponents(); - components.add(component); + components.add(componentId); car.setComponents(components); carRepository.save(car); - return CarServiceImpl.carConverterToDto(car); + return CarMapper.carConverterToDto(car); } @Override - public CarDto removeComponent(Long componentId, Long carId) { + public CarResponseDto removeComponent(Long componentId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var components = new ArrayList<CarComponent>(); - for (CarComponent d : car.getComponents()) { - if (!Objects.equals(d.getId(), componentId)) { - components.add(d); + var components = new ArrayList<Long>(); + for (Long id : car.getComponents()) { + if (!Objects.equals(id, componentId)) { + components.add(id); } } car.setComponents(components); carRepository.save(car); - return CarServiceImpl.carConverterToDto(car); + return CarMapper.carConverterToDto(car); } @Override @@ -70,14 +61,15 @@ public class CarComponentPairServiceImpl implements CarComponentPairService { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); var componentDtos = new ArrayList<CarComponentDto>(); - for (CarComponent c : car.getComponents()) { + for (Long id : car.getComponents()) { + CarComponent carComponent = getComponentFromDb(id); componentDtos.add( new CarComponentDto( - c.getId(), - c.getWeight(), - c.getPrice(), - c.getManufacturer(), - c.getName() + carComponent.getId(), + carComponent.getWeight(), + carComponent.getPrice(), + carComponent.getManufacturer(), + carComponent.getName() ) ); } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairService.java b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairService.java index edc598223d253a83c62269fa2b3a04ead082ab46..0131343725de5ed3805c64c1bfdafcea7e97b40a 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairService.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarDriverPairService.java @@ -1,6 +1,7 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import cz.muni.pa165.common_library.dtos.DriverDto; import java.util.List; @@ -15,7 +16,7 @@ public interface CarDriverPairService { * @param carId Id of the car. * @return Car object that the driver was assigned to. */ - CarDto assignDriverToCar(Long driverId, Long carId); + CarResponseDto assignDriverToCar(Long driverId, Long carId); /** * Calls repository to unassign a driver from a car, if unsuccessful, throws exception. @@ -24,7 +25,7 @@ public interface CarDriverPairService { * @param carId Id of the car. * @return Car object that the driver was unassigned from. */ - CarDto unassignDriverFromCar(Long driverId, Long carId); + CarResponseDto unassignDriverFromCar(Long driverId, Long carId); /** * Calls repository to return list of all drivers of specific car. @@ -33,4 +34,21 @@ public interface CarDriverPairService { * @return List of all drivers assigned to the car. */ List<DriverDto> getAllDriversOfCar(Long carId); + + /** + * Sets the main driver of the car identified by the given ID. + * + * @param carId The ID of the car to set the main driver for. + * @param driverId The ID of the driver to set as the main driver. + * @return A CarDto object representing the updated car. + */ + CarResponseDto setMainDriver(Long carId, Long driverId); + + /** + * Removes the main driver from the car identified by the given ID. + * + * @param carId The ID of the car to remove the main driver from. + * @return A CarDto object representing the updated car. + */ + CarResponseDto removeMainDriver(Long carId); } 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 15ef76773a8ce8a6d762777fac33d19fc8322d00..dabba4a173a72b33faefd6aed346f495597243d5 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 @@ -1,9 +1,10 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.car.data.repository.CarDriverPairRepository; +import static cz.muni.pa165.car.restemplate.DbGetter.getDriverFromDb; + import cz.muni.pa165.car.data.repository.CarRepository; -import cz.muni.pa165.car.data.repository.DriverRepository; -import cz.muni.pa165.common_library.dtos.CarDto; +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.exception.DatabaseException; import cz.muni.pa165.driver.data.model.Driver; @@ -18,51 +19,41 @@ import org.springframework.stereotype.Service; @Service public class CarDriverPairServiceImpl implements CarDriverPairService { - CarDriverPairRepository carDriverPairRepository; - DriverRepository driverRepository; CarRepository carRepository; /** * Constructor for Car - Driver Service. * - * @param carDriverPairRepository Car - Driver repository - * @param driverRepository Driver repository * @param carRepository Car repository */ - public CarDriverPairServiceImpl(CarDriverPairRepository carDriverPairRepository, - DriverRepository driverRepository, - CarRepository carRepository) { - this.carDriverPairRepository = carDriverPairRepository; - this.driverRepository = driverRepository; + public CarDriverPairServiceImpl(CarRepository carRepository) { this.carRepository = carRepository; } @Override - public CarDto assignDriverToCar(Long driverId, Long carId) { + public CarResponseDto assignDriverToCar(Long driverId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var driver = driverRepository.findById(driverId).orElseThrow( - () -> new DatabaseException("Driver not found")); var drivers = car.getDrivers(); - drivers.add(driver); + drivers.add(driverId); car.setDrivers(drivers); carRepository.save(car); - return CarServiceImpl.carConverterToDto(car); + return CarMapper.carConverterToDto(car); } @Override - public CarDto unassignDriverFromCar(Long driverId, Long carId) { + public CarResponseDto unassignDriverFromCar(Long driverId, Long carId) { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); - var drivers = new ArrayList<Driver>(); - for (Driver d : car.getDrivers()) { - if (!Objects.equals(d.getId(), driverId)) { - drivers.add(d); + var drivers = new ArrayList<Long>(); + for (Long id : car.getDrivers()) { + if (!Objects.equals(id, driverId)) { + drivers.add(id); } } car.setDrivers(drivers); carRepository.save(car); - return CarServiceImpl.carConverterToDto(car); + return CarMapper.carConverterToDto(car); } @Override @@ -70,14 +61,33 @@ public class CarDriverPairServiceImpl implements CarDriverPairService { var car = carRepository.findById(carId).orElseThrow( () -> new DatabaseException("Car not found")); var driverDtos = new ArrayList<DriverDto>(); - for (Driver d : car.getDrivers()) { + for (Long id : car.getDrivers()) { + Driver driver = getDriverFromDb(id); driverDtos.add( - new DriverDto(d.getId(), - d.getName(), - d.getSurname()) + new DriverDto(driver.getId(), + driver.getName(), + driver.getSurname()) ); } return driverDtos; } + @Override + public CarResponseDto setMainDriver(Long carId, Long driverId) { + var car = carRepository.findById(carId).orElseThrow( + () -> new DatabaseException("Car not found")); + car.setMainDriverId(driverId); + carRepository.save(car); + return CarMapper.carConverterToDto(car); + } + + @Override + public CarResponseDto removeMainDriver(Long carId) { + var car = carRepository.findById(carId).orElseThrow( + () -> new DatabaseException("Car not found")); + car.setMainDriverId(null); + carRepository.save(car); + return CarMapper.carConverterToDto(car); + } + } diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarService.java b/car/src/main/java/cz/muni/pa165/car/service/CarService.java index 7fe1dbf0aed56f0e32d8d667c36727b59721fc4f..f3b923a0ac0ff620324e657fe874c2dc7a357b45 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarService.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarService.java @@ -1,6 +1,7 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.common_library.dtos.CarRequestDto; +import cz.muni.pa165.common_library.dtos.CarResponseDto; import java.util.List; /** @@ -10,10 +11,10 @@ public interface CarService { /** * Calls repository to insert a car into the database. * - * @param carDto Dto object of the car. + * @param carRequestDto Dto object of the car. * @return Dto object of inserted car. */ - CarDto postCar(CarDto carDto); + CarResponseDto postCar(CarRequestDto carRequestDto); /** * Calls repository to get a specific car from the database. @@ -21,14 +22,14 @@ public interface CarService { * @param carId car id * @return Dto object of the car */ - CarDto getCarById(Long carId); + CarResponseDto getCarById(Long carId); /** * Calls repository to get all cars in the database. * * @return list of Dto objects */ - List<CarDto> getAllCars(); + List<CarResponseDto> getAllCars(); /** * Calls repository to delete a car in the database. diff --git a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java index 6171479b2d48ed525c241224835be03c22bc900c..874dbf4a907219b91a5d232c17e6f5dd64113cd9 100644 --- a/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java +++ b/car/src/main/java/cz/muni/pa165/car/service/CarServiceImpl.java @@ -1,16 +1,17 @@ package cz.muni.pa165.car.service; -import cz.muni.pa165.car.data.model.Car; -import cz.muni.pa165.car.data.repository.CarComponentRepository; +import static cz.muni.pa165.car.mapper.CarMapper.carConverterToDto; +import static cz.muni.pa165.car.mapper.CarMapper.carDtoConverter; + import cz.muni.pa165.car.data.repository.CarRepository; -import cz.muni.pa165.car.data.repository.DriverRepository; -import cz.muni.pa165.common_library.dtos.CarDto; +import cz.muni.pa165.car.mapper.CarMapper; +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 java.util.ArrayList; import java.util.List; -import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; + /** * Service for car management. */ @@ -18,31 +19,23 @@ import org.springframework.stereotype.Service; public class CarServiceImpl implements CarService { CarRepository carRepository; - CarComponentRepository componentRepository; - DriverRepository driverRepository; /** * Constructor for Car Service. * - * @param carRepository Car repository - * @param componentRepository Component repository - * @param driverRepository Driver repository + * @param carRepository Car repository */ - public CarServiceImpl(CarRepository carRepository, - CarComponentRepository componentRepository, - DriverRepository driverRepository) { + public CarServiceImpl(CarRepository carRepository) { this.carRepository = carRepository; - this.componentRepository = componentRepository; - this.driverRepository = driverRepository; } @Override - public CarDto postCar(CarDto carDto) { - return carConverterToDto(carRepository.save(carDtoConverter(carDto))); + public CarResponseDto postCar(CarRequestDto carRequestDto) { + return carConverterToDto(carRepository.save(carDtoConverter(carRequestDto))); } @Override - public CarDto getCarById(Long carId) { + public CarResponseDto getCarById(Long carId) { return carConverterToDto(carRepository.findById(carId).orElseThrow( () -> new DatabaseException( "Finding car with id=" + carId + " was unsuccessful" @@ -51,11 +44,11 @@ public class CarServiceImpl implements CarService { } @Override - public List<CarDto> getAllCars() { + public List<CarResponseDto> getAllCars() { return carRepository .findAll() .stream() - .map(CarServiceImpl::carConverterToDto) + .map(CarMapper::carConverterToDto) .toList(); } @@ -65,72 +58,4 @@ public class CarServiceImpl implements CarService { return "Car with id = " + carId + " deleted!"; } - /** - * Converts Dto object to Car object. - * TODO: Change to the correct version of converter. - * - * @param carDto Dto object of the car. - * @return Car object. - */ - public static Car carDtoConverter(CarDto carDto) { - - // TEST VERSION WHEN COMPONENTS AND DRIVERS DO NOT EXIST - return Car.builder() - .id(carDto.getId()) - .components(new ArrayList<>()) - .drivers(new ArrayList<>()) - .mainDriver(null) - .build(); - - // TO BE USED IN FINAL VERSION - /* - var car = Car.builder() - .id(carDto.getId()) - .build(); - - var components = new ArrayList<CarComponent>(); - for (Pair<Long, String> componentPair : carDto.getComponentIdsNames()) { - Long id = componentPair.getFirst(); - components.add(componentRepository.findById(id).orElseThrow( - () -> new DatabaseException("Component not found") - )); - } - car.setComponents(components); - var drivers = new ArrayList<Driver>(); - for (Pair<Long, String> driverPair : carDto.getDriverIdsNames()) { - Long id = driverPair.getFirst(); - drivers.add(driverRepository.findById(id).orElseThrow( - () -> new DatabaseException("Driver not found") - )); - } - car.setDrivers(drivers); - return car; - */ - } - - /** - * Converts Car object to its Dto. - * - * @param car Car object. - * @return Dto object. - */ - public static CarDto carConverterToDto(Car car) { - Long id = null; - if (car.getMainDriver() != null) { - id = car.getMainDriver().getId(); - } - return CarDto.builder() - .id(car.getId()) - .componentIdsNames(car.getComponents() - .stream() - .map(carComponent -> Pair.of(carComponent.getId(), carComponent.getName())) - .toList()) - .driverIdsNames(car.getDrivers() - .stream() - .map(driver -> Pair.of(driver.getId(), driver.getName())) - .toList()) - .mainDriverId(id) - .build(); - } - } diff --git a/common_library/pom.xml b/common_library/pom.xml index 3faccf9d86604a3d277d80682874eb190f00f2d7..c01b20c9c8ec27c1f8320d5de771b70a9b75a92b 100644 --- a/common_library/pom.xml +++ b/common_library/pom.xml @@ -57,6 +57,11 @@ <artifactId>swagger-annotations</artifactId> <version>1.6.2</version> </dependency> + <dependency> + <groupId>org.apache.httpcomponents.client5</groupId> + <artifactId>httpclient5</artifactId> + <version>5.2.1</version> + </dependency> </dependencies> </project> diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/client/ClientConfig.java b/common_library/src/main/java/cz/muni/pa165/common_library/client/ClientConfig.java index 1008f78988f6293f642dcff7a14e50e151ec8ca4..9cd037e7e21e5cbc37b002ae83095f49db5ea8ed 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/client/ClientConfig.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/client/ClientConfig.java @@ -6,6 +6,9 @@ import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; +/** + * Custom Rest Template class. + */ @Configuration public class ClientConfig { diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarRequestDto.java b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarRequestDto.java new file mode 100644 index 0000000000000000000000000000000000000000..7d4e4aa3c014b848a0aad1484f74f05ce62df19c --- /dev/null +++ b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarRequestDto.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 java.util.List; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.util.Pair; + +/** + * Data Transfer object for Car class. + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CarRequestDto { + + @NotNull + @Schema(description = "car's components ids", + example = "[]") + List<Long> componentIds; + + @NotNull + @Schema(description = "car's drivers ids", + example = "[]") + List<Long> driverIds; + + @Schema(description = "id of car's main driver", + example = "null") + Long mainDriverId; + +} diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarDto.java b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarResponseDto.java similarity index 80% rename from common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarDto.java rename to common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarResponseDto.java index 1b9ce2fa9cefca649e1f5a0afd32558746565503..93a5a8b57fdd65328ed7f3e7484b929bb6212a4a 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarDto.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/CarResponseDto.java @@ -7,7 +7,6 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import org.springframework.data.util.Pair; /** * Data Transfer object for Car class. @@ -16,22 +15,22 @@ import org.springframework.data.util.Pair; @Builder @NoArgsConstructor @AllArgsConstructor -public class CarDto { +public class CarResponseDto { @NotNull @Schema(description = "car id", - example = "1") + example = "1") Long id; @NotNull @Schema(description = "car's components ids and names", example = "[]") - List<Pair<Long, String>> componentIdsNames; + List<Long> componentIdsNames; @NotNull @Schema(description = "car's drivers ids and names", example = "[]") - List<Pair<Long, String>> driverIdsNames; + List<Long> driverIdsNames; @Schema(description = "id of car's main driver", example = "1") diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/RaceDriverCarDto.java b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/RaceDriverCarDto.java index a950fc9846908df7655d8e9d907bcc5b430eb793..0e635504e632573c917679554c2b16ccd4e31935 100644 --- a/common_library/src/main/java/cz/muni/pa165/common_library/dtos/RaceDriverCarDto.java +++ b/common_library/src/main/java/cz/muni/pa165/common_library/dtos/RaceDriverCarDto.java @@ -12,17 +12,12 @@ import lombok.Data; @Builder public class RaceDriverCarDto { - @NotNull @Schema(description = "driver id", example = "1") Long driverId; - @NotNull @Schema(description = "car id", example = "1") Long carId; - @Schema(description = "driver name", example = "Charles Leclerc") - String driverName; - @Schema(description = "drivers position in the race", example = "1") - int position; + Integer position; } diff --git a/common_library/src/main/java/cz/muni/pa165/common_library/exception/BadRequestException.java b/common_library/src/main/java/cz/muni/pa165/common_library/exception/BadRequestException.java new file mode 100644 index 0000000000000000000000000000000000000000..4fd9c87517850fa07a1b72735a1ba73a78ea4825 --- /dev/null +++ b/common_library/src/main/java/cz/muni/pa165/common_library/exception/BadRequestException.java @@ -0,0 +1,11 @@ +package cz.muni.pa165.common_library.exception; + +/** + * Exception when request is not valid. + */ +public class BadRequestException extends RuntimeException { + + public BadRequestException(String message) { + super(message); + } +} diff --git a/common_library/src/main/resources.mv.db b/common_library/src/main/resources.mv.db index ae5c95ed56afac4a5b27f94374b575c6aee30393..1182c1e131cc2956fe8d996155055527cf19a6b7 100644 Binary files a/common_library/src/main/resources.mv.db and b/common_library/src/main/resources.mv.db differ diff --git a/common_library/src/main/resources.trace.db b/common_library/src/main/resources.trace.db index c23aec91212598ef4d254120d1666357f7e0e0b2..1821ae2dbbf3854b6affcf9d2504b39511a2392a 100644 --- a/common_library/src/main/resources.trace.db +++ b/common_library/src/main/resources.trace.db @@ -489,3 +489,146 @@ org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database is already closed ( at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833) +2023-04-16 00:27:08 database: flush +org.h2.message.DbException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7]" [50000-214] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:395) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:125) + at org.h2.mvstore.MVStore.handleException(MVStore.java:3318) + at org.h2.mvstore.MVStore.panic(MVStore.java:593) + at org.h2.mvstore.MVStore.<init>(MVStore.java:469) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4082) + at org.h2.mvstore.db.Store.<init>(Store.java:136) + at org.h2.engine.Database.<init>(Database.java:324) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) + at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:330) + at org.springframework.boot.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:168) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateDefaultDdlAutoProvider.getDefaultDdlAuto(HibernateDefaultDdlAutoProvider.java:42) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.lambda$getVendorProperties$1(HibernateJpaConfiguration.java:129) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings.getDdlAuto(HibernateSettings.java:41) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineDdlAuto(HibernateProperties.java:118) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.getAdditionalProperties(HibernateProperties.java:87) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineHibernateProperties(HibernateProperties.java:80) + at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.getVendorProperties(HibernateJpaConfiguration.java:130) + at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:131) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:645) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1325) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1162) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1132) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) + at cz.muni.pa165.race.App.main(App.java:28) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7]" [50000-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:554) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) + ... 60 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) + at org.h2.mvstore.FileStore.open(FileStore.java:178) + at org.h2.mvstore.FileStore.open(FileStore.java:128) + at org.h2.mvstore.MVStore.<init>(MVStore.java:452) + ... 54 more +2023-04-16 00:27:10 database: flush +org.h2.message.DbException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7]" [50000-214] + at org.h2.message.DbException.get(DbException.java:212) + at org.h2.message.DbException.convert(DbException.java:395) + at org.h2.mvstore.db.Store.lambda$new$0(Store.java:125) + at org.h2.mvstore.MVStore.handleException(MVStore.java:3318) + at org.h2.mvstore.MVStore.panic(MVStore.java:593) + at org.h2.mvstore.MVStore.<init>(MVStore.java:469) + at org.h2.mvstore.MVStore$Builder.open(MVStore.java:4082) + at org.h2.mvstore.db.Store.<init>(Store.java:136) + at org.h2.engine.Database.<init>(Database.java:324) + at org.h2.engine.Engine.openSession(Engine.java:92) + at org.h2.engine.Engine.openSession(Engine.java:222) + at org.h2.engine.Engine.createSession(Engine.java:201) + at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) + at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) + at org.h2.Driver.connect(Driver.java:59) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) + at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:284) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:177) + at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:36) + at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:119) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:255) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:230) + at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:207) + at org.hibernate.boot.model.relational.Database.<init>(Database.java:44) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.getDatabase(InFlightMetadataCollectorImpl.java:218) + at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:191) + at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:138) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1348) + at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1419) + at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) + at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) + at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:352) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1798) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1748) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1132) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:907) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:584) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) + at cz.muni.pa165.race.App.main(App.java:28) +Caused by: org.h2.jdbc.JdbcSQLNonTransientException: General error: "org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7]" [50000-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:554) + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) + ... 59 more +Caused by: org.h2.mvstore.MVStoreException: The file is locked: C:/Users/diana/pa165/pa165-formula-one-team/common_library/src/main/resources.mv.db [2.1.214/7] + at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:1004) + at org.h2.mvstore.FileStore.open(FileStore.java:178) + at org.h2.mvstore.FileStore.open(FileStore.java:128) + at org.h2.mvstore.MVStore.<init>(MVStore.java:452) + ... 53 more diff --git a/driver/pom.xml b/driver/pom.xml index 7e77dd7ae46718f8d0e22fa66e176fd91a35c9c1..14d6cbcd6263eadbffc24a42c625dcbde3fc03b1 100644 --- a/driver/pom.xml +++ b/driver/pom.xml @@ -51,6 +51,12 @@ <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> </dependencies> <properties> diff --git a/driver/src/main/java/cz/muni/pa165/driver/App.java b/driver/src/main/java/cz/muni/pa165/driver/App.java index 07f54711f763b4f4ffe88a7f3447a3ad85fb5259..d506128e67d67d4270ed020b3d05a4edb9567a2d 100644 --- a/driver/src/main/java/cz/muni/pa165/driver/App.java +++ b/driver/src/main/java/cz/muni/pa165/driver/App.java @@ -1,8 +1,10 @@ package cz.muni.pa165.driver; +import cz.muni.pa165.common_library.exception.RestExceptionHandler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; /** @@ -11,6 +13,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories(basePackages = {"cz.muni.pa165.driver.data.repository"}) @EntityScan(basePackages = {"cz.muni.pa165.driver.data.model"}) +@Import(RestExceptionHandler.class) public class App { public static void main(String[] args) { diff --git a/driver/src/main/resources/application.yml b/driver/src/main/resources/application.yml index 421c1494b0c391b664d3c8ef1495b200c904a8ea..5506c8f217a43b34f91fbd7999c8d5bb0c2fbae6 100644 --- a/driver/src/main/resources/application.yml +++ b/driver/src/main/resources/application.yml @@ -16,7 +16,7 @@ spring: hibernate: ddl-auto: update datasource: - url: jdbc:h2:.\common_library\src\main\resources;MODE=PostgreSQL + url: jdbc:h2:mem:driver;MODE=PostgreSQL driverClassName: org.h2.Driver username: admin password: admin diff --git a/driver/src/test/java/cz/muni/pa165/driver/rest/DriverControllerItTest.java b/driver/src/test/java/cz/muni/pa165/driver/rest/DriverControllerItTest.java new file mode 100644 index 0000000000000000000000000000000000000000..13814dafebd455689e3caa59be35518bb2b68a8a --- /dev/null +++ b/driver/src/test/java/cz/muni/pa165/driver/rest/DriverControllerItTest.java @@ -0,0 +1,38 @@ +package cz.muni.pa165.driver.rest; + +import cz.muni.pa165.driver.data.model.Driver; +import cz.muni.pa165.driver.data.repository.DriverRepository; +import java.util.Map; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@DataJpaTest +class DriverControllerItTest { + + @Autowired + private TestEntityManager entityManager; + + @Autowired + private DriverRepository driverRepository; + + @Test + public void testSave() { + Driver driver = Driver.builder() + .name("name") + .surname("surname") + .nationality("nationality") + .characteristics(Map.of()).build(); + + Driver savedDriver = driverRepository.save(driver); + + Assertions.assertEquals(savedDriver, driver); + Assertions.assertEquals(entityManager.find(Driver.class, 1L).getId(), 1); + } + +} diff --git a/race/pom.xml b/race/pom.xml index 56af86d09bbf7c3e113baabccc3392e550abf1b9..724c41b9a3e206e732cc80eb0f6b20b788bab4ec 100644 --- a/race/pom.xml +++ b/race/pom.xml @@ -44,6 +44,12 @@ <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 47715a6ff43b72c5f0b5f033eee3fe96eb83834c..172899c5771f8e094eeb302d6d95f80b0fe27573 100644 --- a/race/src/main/java/cz/muni/pa165/race/App.java +++ b/race/src/main/java/cz/muni/pa165/race/App.java @@ -3,6 +3,7 @@ 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; @@ -19,7 +20,8 @@ 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}) +@EntityScan(basePackageClasses = {Race.class, Season.class, Car.class, Driver.class, + CarComponent.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 16541e30267d56edc756d70f91a0800ca53e0abb..e158c0f1934cd7d407ef4c0ad48f9f9a291e5530 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 @@ -14,6 +14,7 @@ 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; @@ -45,11 +46,11 @@ public class Race implements Serializable { private RaceInfo raceInfo; @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "driver_info_one_id") + @JoinColumn(name = "driver_one_id") private RaceDriverinfo driver1; @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "driver_info_two_id") + @JoinColumn(name = "driver_two_id") private RaceDriverinfo driver2; /** @@ -67,17 +68,13 @@ public class Race implements Serializable { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "driver_one_id") - private Driver driver; + private Long driverId; - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "car_one_id") - private Car car; + private Long carId; @Min(1) @Max(20) - private int finalPosition; + private Integer finalPosition; } /** 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 24ce9dd85f436d57519406d49c03ef366d6e422a..94b7693e2e13a22f2576440950ce28251ac2d7d6 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 @@ -42,14 +42,14 @@ public class RaceController { @Operation(summary = "Delete a race") @DeleteMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<String> deleteRace(@Valid @RequestParam long raceId) { + public ResponseEntity<String> deleteRace(@Valid @RequestParam Long raceId) { return ResponseEntity.ok(raceService.deleteRace(raceId)); } @Operation(summary = "Get a race") @GetMapping(path = "/id", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<RaceDto> getRace(@Valid @RequestParam long raceId) { + public ResponseEntity<RaceDto> getRace(@Valid @RequestParam Long raceId) { return ResponseEntity.ok(raceService.findRaceById(raceId)); } @@ -63,16 +63,18 @@ public class RaceController { @Operation(summary = "Assign driver as driver number one for a race") @PatchMapping(path = "/assignDriverOne", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<String> assignDriverOne(@RequestParam long driverOneId, - @RequestParam long raceId) { - return ResponseEntity.ok(raceService.assignDriverOne(driverOneId, raceId)); + public ResponseEntity<RaceDto> assignDriverOne(@RequestParam Long driverOneId, + @RequestParam Long raceId, + @RequestParam Long carId) { + return ResponseEntity.ok(raceService.assignDriverOne(driverOneId, raceId, carId)); } @Operation(summary = "Assign driver as a driver number two for a race") @PatchMapping(path = "/assignDriverTwo", produces = MediaType.APPLICATION_JSON_VALUE) - public ResponseEntity<String> assignDriverTwo(@RequestParam long driverTwoId, - @RequestParam long raceId) { - return ResponseEntity.ok(raceService.assignDriverTwo(driverTwoId, raceId)); + public ResponseEntity<RaceDto> assignDriverTwo(@RequestParam Long driverTwoId, + @RequestParam Long raceId, + @RequestParam Long carId) { + return ResponseEntity.ok(raceService.assignDriverTwo(driverTwoId, raceId, carId)); } } 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 fc1cae9f879e8433f8d848c5e4d9e63a61ae013f..7da921067a2552e039ce9fe188e3418c82b44f17 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 @@ -3,6 +3,7 @@ package cz.muni.pa165.race.service; import cz.muni.pa165.car.data.model.Car; 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; @@ -10,6 +11,7 @@ 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.List; +import java.util.Objects; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -59,29 +61,43 @@ public class RaceService { /** * Assigns driver one. */ - public String assignDriverOne(Long driverId, Long raceId) { - var driver = driverRepository.findById(driverId) - .orElseThrow(() -> new DatabaseException("Driver not found")); + public RaceDto assignDriverOne(Long driverId, Long raceId, Long carId) { var race = raceRepository.findById(raceId) .orElseThrow(() -> new DatabaseException("Race not found")); - race.getDriver1().setDriver(driver); - raceRepository.save(race); - return "Driver with id: " + driverId + "was succesfully assigned to race with id: " - + raceId + " as driver one"; + + var driver = getDriver(driverId); + if (race.getDriver2() != null && Objects.equals(race.getDriver2().getDriverId(), driverId)) { + throw new BadRequestException("Driver already assigned to the race as driver two"); + } + + var car = getCar(carId); + if (race.getDriver2() != null && Objects.equals(race.getDriver2().getCarId(), carId)) { + throw new BadRequestException("Car is already assigned to the race for driver two"); + } + race.getDriver1().setDriverId(driver.getId()); + race.getDriver1().setCarId(car.getId()); + return convertRace(raceRepository.save(race)); } /** * Assigns driver two. */ - public String assignDriverTwo(Long driverId, Long raceId) { - var driver = driverRepository.findById(driverId) - .orElseThrow(() -> new DatabaseException("Driver not found")); + public RaceDto assignDriverTwo(Long driverId, Long raceId, Long carId) { var race = raceRepository.findById(raceId) .orElseThrow(() -> new DatabaseException("Race not found")); - race.getDriver2().setDriver(driver); - raceRepository.save(race); - return "Driver with id: " + driverId + "was succesfully assigned to race with id: " - + raceId + " as driver two"; + + var driver = getDriver(driverId); + if (race.getDriver1() != null && Objects.equals(race.getDriver1().getDriverId(), driverId)) { + throw new BadRequestException("Driver already assigned to the race as driver one"); + } + var car = getCar(carId); + if (race.getDriver1() != null && Objects.equals(race.getDriver1().getCarId(), carId)) { + throw new BadRequestException("Car is already assigned to the race for driver two"); + } + + race.getDriver2().setDriverId(driver.getId()); + race.getDriver2().setCarId(car.getId()); + return convertRace(raceRepository.save(race)); } /** @@ -122,17 +138,21 @@ public class RaceService { if (raceDto.getDriverOne() != null) { race.setDriver1(Race.RaceDriverinfo .builder() - .driver(getDriver(raceDto.getDriverOne())) - .car(getCar(raceDto.getDriverOne())) + .driverId(raceDto.getDriverOne().getDriverId()) + .carId(raceDto.getDriverOne().getCarId()) .build()); + } else { + race.setDriver1(Race.RaceDriverinfo.builder().build()); } if (raceDto.getDriverTwo() != null) { race.setDriver2(Race.RaceDriverinfo .builder() - .driver(getDriver(raceDto.getDriverTwo())) - .car(getCar(raceDto.getDriverTwo())) + .driverId(raceDto.getDriverTwo().getDriverId()) + .carId(raceDto.getDriverTwo().getCarId()) .build()); + } else { + race.setDriver2(Race.RaceDriverinfo.builder().build()); } return race; @@ -147,35 +167,29 @@ public class RaceService { .prizePool(race.getRaceInfo().getPrizePool()) .build()) .build(); - if (race.getDriver1() != null && race.getDriver1().getCar() != null) { + if (race.getDriver1() != null) { raceDto.setDriverOne(RaceDriverCarDto.builder() - .carId(race.getDriver1().getCar().getId()) - .driverId(race.getDriver1().getId()) - .driverName(race.getDriver1().getDriver().getName() - + " " + race.getDriver1().getDriver().getSurname()) + .carId(race.getDriver1().getCarId()) + .driverId(race.getDriver1().getDriverId()) .build()); } - if (race.getDriver2() != null && race.getDriver2().getCar() != null) { + if (race.getDriver2() != null) { raceDto.setDriverTwo(RaceDriverCarDto.builder() - .carId(race.getDriver2().getCar().getId()) - .driverId(race.getDriver2().getId()) - .driverName(race.getDriver2().getDriver().getName() - + " " + race.getDriver2().getDriver().getSurname()) + .carId(race.getDriver2().getCarId()) + .driverId(race.getDriver2().getCarId()) .build()); } return raceDto; } - - private Driver getDriver(RaceDriverCarDto driverCarDto) { - return driverRepository.findById(driverCarDto.getDriverId()).orElseThrow( - () -> new DatabaseException("Something went wrong when" - + "finding the driver with id: " + driverCarDto.getDriverId() + " in the database.")); + private Driver getDriver(Long driverId) { + var response = + client.getForEntity("http://localhost:8083/driver/get/id=" + driverId, Driver.class); + return response.getBody(); } - private Car getCar(RaceDriverCarDto driverCarDto) { - return carRepository.findById(driverCarDto.getCarId()).orElseThrow( - () -> new DatabaseException("Something went wrong when" - + "finding the car with id: " + driverCarDto.getCarId() + " in the database.")); + private Car getCar(Long carId) { + var response = client.getForEntity("http://localhost:8082/car/id=" + carId, Car.class); + return response.getBody(); } }