From f0d47b6febf0e4b918680bb1b103d169e81945e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=AF=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=B2?= Date: Sun, 31 Mar 2024 15:19:14 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/DemoApplication.java | 15 +++- .../demo/order/api/OrderController.java | 82 +++++++++++++++++++ .../com/example/demo/order/api/OrderDto.java | 42 ++++++++++ .../example/demo/order/model/OrderEntity.java | 58 +++++++++++++ .../order/repository/OrderRepository.java | 11 +++ .../demo/order/service/OrderService.java | 57 +++++++++++++ 6 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/demo/order/api/OrderController.java create mode 100644 src/main/java/com/example/demo/order/api/OrderDto.java create mode 100644 src/main/java/com/example/demo/order/model/OrderEntity.java create mode 100644 src/main/java/com/example/demo/order/repository/OrderRepository.java create mode 100644 src/main/java/com/example/demo/order/service/OrderService.java diff --git a/src/main/java/com/example/demo/DemoApplication.java b/src/main/java/com/example/demo/DemoApplication.java index 74dae89..d7e74aa 100644 --- a/src/main/java/com/example/demo/DemoApplication.java +++ b/src/main/java/com/example/demo/DemoApplication.java @@ -13,6 +13,8 @@ import com.example.demo.games.model.GameEntity; import com.example.demo.games.service.GameService; import com.example.demo.genres.model.GenreEntity; import com.example.demo.genres.service.GenreService; +import com.example.demo.order.model.OrderEntity; +import com.example.demo.order.service.OrderService; import com.example.demo.types.model.TypeEntity; import com.example.demo.types.service.TypeService; @@ -24,11 +26,13 @@ public class DemoApplication implements CommandLineRunner { private final TypeService typeService; private final GenreService genreService; private final GameService gameService; + private final OrderService orderService; - public DemoApplication(TypeService typeService, GenreService genreService, GameService gameService){ + public DemoApplication(TypeService typeService, GenreService genreService, GameService gameService, OrderService orderService){ this.typeService = typeService; this.gameService = gameService; this.genreService = genreService; + this.orderService = orderService; } @Override @@ -46,8 +50,13 @@ public class DemoApplication implements CommandLineRunner { final List genres2 = new ArrayList(); genres2.add(genre2); - gameService.create(new GameEntity(null,type1,"Game1",2100.0,"good game", genres1)); - gameService.create(new GameEntity(null, type2, "Game2", 1200.0,"bad game", genres2)); + final var game1 = gameService.create(new GameEntity(null,type1,"Game1",2100.0,"good game", genres1)); + final var game2 = gameService.create(new GameEntity(null, type2, "Game2", 1200.0,"bad game", genres2)); + final List games = new ArrayList(); + games.add(game1); + games.add(game2); + + orderService.create(new OrderEntity(null,games)); } public static void main(String[] args) { diff --git a/src/main/java/com/example/demo/order/api/OrderController.java b/src/main/java/com/example/demo/order/api/OrderController.java new file mode 100644 index 0000000..430663a --- /dev/null +++ b/src/main/java/com/example/demo/order/api/OrderController.java @@ -0,0 +1,82 @@ +package com.example.demo.order.api; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.games.model.GameEntity; +import com.example.demo.games.service.GameService; +import com.example.demo.order.model.OrderEntity; +import com.example.demo.order.service.OrderService; + +import jakarta.validation.Valid; + +@RestController +@RequestMapping(Constants.API_URL + "/order") +public class OrderController { + private final GameService gameService; + private final ModelMapper modelMapper; + private final OrderService orderService; + + public OrderController(GameService gameService, ModelMapper modelMapper, OrderService orderService){ + this.gameService = gameService; + this.modelMapper = modelMapper; + this.orderService = orderService; + } + + private OrderDto toDto(OrderEntity entity){ + var dto = new OrderDto(); + dto.setId(entity.getId()); + double sum = 0; + for(var game : entity.getGames()){ + sum += game.getPrice(); + } + dto.setSum(sum); + dto.setGames(entity.getGames().stream().map(GameEntity::getId).toList()); + return dto; + } + + private OrderEntity toEntity(OrderDto dto){ + final OrderEntity entity = modelMapper.map(dto, OrderEntity.class); + var games = dto.getGames(); + for(var game : games){ + entity.setGames(gameService.get(game)); + } + return entity; + } + + @GetMapping + public List getAll(@RequestParam(name = "games", defaultValue = "") List games){ + return orderService.getAll(games).stream().map(this::toDto).toList(); + } + + @GetMapping("/{id}") + public OrderDto get(@PathVariable(name = "id")Long id){ + return toDto(orderService.get(id)); + } + + @PostMapping + public OrderDto create(@RequestBody @Valid OrderDto dto){ + return toDto(orderService.create(toEntity(dto))); + } + + @PutMapping("/{id}") + public OrderDto update(@PathVariable(name = "id") Long id, @RequestBody OrderDto dto){ + return toDto(orderService.update(id, toEntity(dto))); + } + + @DeleteMapping("/{id}") + public OrderDto delete(@PathVariable(name = "id") Long id){ + return toDto(orderService.delete(id)); + } +} diff --git a/src/main/java/com/example/demo/order/api/OrderDto.java b/src/main/java/com/example/demo/order/api/OrderDto.java new file mode 100644 index 0000000..4996655 --- /dev/null +++ b/src/main/java/com/example/demo/order/api/OrderDto.java @@ -0,0 +1,42 @@ +package com.example.demo.order.api; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +public class OrderDto { + private Long id; + @NotNull + @Min(1) + private double sum; + @NotNull + private final List games = new ArrayList<>(); + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public double getSum(){ + return sum; + } + public void setSum(double sum){ + this.sum = sum; + } + + public List getGames(){ + return games; + } + public void setGames(List games){ + this.games.clear(); + this.games.addAll(games); + } +} diff --git a/src/main/java/com/example/demo/order/model/OrderEntity.java b/src/main/java/com/example/demo/order/model/OrderEntity.java new file mode 100644 index 0000000..5dab932 --- /dev/null +++ b/src/main/java/com/example/demo/order/model/OrderEntity.java @@ -0,0 +1,58 @@ +package com.example.demo.order.model; + +import java.util.List; + +import java.util.Objects; + +import java.util.ArrayList; + +import com.example.demo.core.model.BaseEntity; +import com.example.demo.games.model.GameEntity; + +public class OrderEntity extends BaseEntity{ + private double sum; + private final List games = new ArrayList<>(); + + public OrderEntity(){ + super(); + } + + public OrderEntity(Long id, List games){ + super(id); + this.games.clear(); + this.games.addAll(games); + } + + public double getSum(){ + + for(var game : games){ + sum += game.getPrice(); + } + + return sum; + } + + public List getGames(){ + return games; + } + + public void setGames(GameEntity game){ + this.games.add(game); + } + + @Override + public int hashCode(){ + return Objects.hash(id, sum, games); + } + + @Override + public boolean equals(Object obj){ + if(this == obj) return true; + if(obj == null || getClass() != obj.getClass()) return false; + + final OrderEntity other = (OrderEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getSum(), sum) + && Objects.equals(other.getGames(), games); + } +} diff --git a/src/main/java/com/example/demo/order/repository/OrderRepository.java b/src/main/java/com/example/demo/order/repository/OrderRepository.java new file mode 100644 index 0000000..b3eec62 --- /dev/null +++ b/src/main/java/com/example/demo/order/repository/OrderRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.order.repository; +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.order.model.OrderEntity; + +@Repository + +public class OrderRepository extends MapRepository{ + +} diff --git a/src/main/java/com/example/demo/order/service/OrderService.java b/src/main/java/com/example/demo/order/service/OrderService.java new file mode 100644 index 0000000..25360d2 --- /dev/null +++ b/src/main/java/com/example/demo/order/service/OrderService.java @@ -0,0 +1,57 @@ +package com.example.demo.order.service; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.ArrayList; +import java.util.Objects; +import java.util.Optional; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.games.service.GameService; +import com.example.demo.order.repository.OrderRepository; +import com.example.demo.order.model.OrderEntity; + +@Service +public class OrderService { + private final OrderRepository repository; + private final GameService gameService; + + public OrderService(OrderRepository repository, GameService gameService){ + this.repository = repository; + this.gameService = gameService; + } + + public List getAll(List games){ + var gamesEnt = new ArrayList<>(); + for(var gameId : games){ + gamesEnt.add(gameService.get(gameId)); + } + if(!Objects.equals(gamesEnt.size(), 0)){ + return repository.getAll().stream().filter(game -> game.getGames().containsAll(gamesEnt)).toList(); + } + return repository.getAll(); + } + + public OrderEntity get(Long id){ + return Optional.ofNullable(repository.get(id)).orElseThrow(() -> new NotFoundException(id)); + } + + public OrderEntity create(OrderEntity entity){ + return repository.create(entity); + } + + public OrderEntity update(Long id, OrderEntity entity){ + final OrderEntity existEntity = get(id); + var games = entity.getGames(); + for(var game : games){ + existEntity.setGames(game); + } + return repository.update(existEntity); + } + + public OrderEntity delete(Long id){ + final OrderEntity exisEntity = get(id); + return repository.delete(exisEntity); + } +}