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..80de83e4a69788982a29cc3c922fcc0cbe352822 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,15 @@ 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.data.model.Race; 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 +30,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; } @@ -77,4 +81,26 @@ public class RaceController { @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..7b7d9711a1dd09ec6e433ab968aca1480708a95a --- /dev/null +++ b/race/src/main/java/cz/muni/pa165/race/service/PointsUtil.java @@ -0,0 +1,24 @@ +package cz.muni.pa165.race.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class PointsUtil { + + public Map<Integer, Integer> points; + + 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..81145b65ca554891015385854f969ce7671b99ba 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,55 @@ public class RaceService { return raceRepository.findAll().stream().map(this::convertRace).toList(); } + 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)); + } + + 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)); + } + + 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 +227,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..1727f7ca1fd871735d5dbf1731808b97689b14ba --- /dev/null +++ b/race/src/main/java/cz/muni/pa165/race/service/RaceServiceI.java @@ -0,0 +1,28 @@ +package cz.muni.pa165.race.service; + +import cz.muni.pa165.common_library.dtos.Location; +import cz.muni.pa165.common_library.dtos.RaceDto; +import cz.muni.pa165.race.data.model.Race; +import java.util.List; +import java.util.Set; + +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);