один ко многим(игра -> жанр)

This commit is contained in:
Максим Яковлев 2024-03-18 19:18:50 +04:00
parent 787a543098
commit ff3038573e
6 changed files with 125 additions and 54 deletions

View File

@ -1,15 +1,54 @@
package com.example.demo; package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
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.types.model.TypeEntity;
import com.example.demo.types.service.TypeService;
@SpringBootApplication @SpringBootApplication
@RestController @RestController
@RequestMapping("/api") @RequestMapping("/api")
public class DemoApplication { public class DemoApplication implements CommandLineRunner {
private final TypeService typeService;
private final GenreService genreService;
private final GameService gameService;
public DemoApplication(TypeService typeService, GenreService genreService, GameService gameService){
this.typeService = typeService;
this.gameService = gameService;
this.genreService = genreService;
}
@Override
public void run(String... args) throws Exception{
final var type1 = typeService.create(new TypeEntity(null,"ААА"));
final var type2 = typeService.create(new TypeEntity(null,"АА"));
final var genre1 = genreService.create(new GenreEntity(null, "Приключения"));
final var genre2 = genreService.create(new GenreEntity(null, "Симулятор"));
final List<GenreEntity> genres1 = new ArrayList<GenreEntity>();
genres1.add(genre1);
genres1.add(genre2);
final List<GenreEntity> genres2 = new ArrayList<GenreEntity>();
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));
}
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args); SpringApplication.run(DemoApplication.class, args);

View File

@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.example.demo.core.configuration.Constants; import com.example.demo.core.configuration.Constants;
import com.example.demo.games.model.GameEntity; import com.example.demo.games.model.GameEntity;
import com.example.demo.games.service.GameService; 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.genres.service.GenreService;
import com.example.demo.types.service.TypeService; import com.example.demo.types.service.TypeService;
@ -37,19 +38,30 @@ public class GameController {
} }
private GameDto toDto(GameEntity entity){ private GameDto toDto(GameEntity entity){
return modelMapper.map(entity, GameDto.class); //return modelMapper.map(entity, GameDto.class);
var dto = new GameDto();
dto.setId(entity.getId());
dto.setGenres(entity.getGenres().stream().map(GenreEntity::getId).toList());
dto.setDescription(entity.getDescription());
dto.setName(entity.getName());
dto.setPrice(entity.getPrice());
dto.setTypeId(entity.getType().getId());
return dto;
} }
private GameEntity toEntity(GameDto dto){ private GameEntity toEntity(GameDto dto){
final GameEntity entity = modelMapper.map(dto, GameEntity.class); final GameEntity entity = modelMapper.map(dto, GameEntity.class);
entity.setType(typeService.get(dto.getTypeId())); entity.setType(typeService.get(dto.getTypeId()));
entity.setGenre(genreService.get(dto.getGenreId())); var genres = dto.getGenres();
for(var genre : genres){
entity.setGenres(genreService.get(genre));
}
return entity; return entity;
} }
@GetMapping @GetMapping
public List<GameDto> getAll(@RequestParam(name = "typeId", defaultValue = "0") Long typeId, @RequestParam(name = "genreId", defaultValue = "0") Long genreId){ public List<GameDto> getAll(@RequestParam(name = "typeId", defaultValue = "0") Long typeId, @RequestParam(name = "genres", defaultValue = "") List<Long> genres){
return gameService.getAll(typeId, genreId).stream().map(this::toDto).toList(); return gameService.getAll(typeId, genres).stream().map(this::toDto).toList();
} }
@GetMapping("/{id}") @GetMapping("/{id}")

View File

@ -1,8 +1,12 @@
package com.example.demo.games.api; package com.example.demo.games.api;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min; import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
public class GameDto { public class GameDto {
@ -11,14 +15,13 @@ public class GameDto {
@Min(1) @Min(1)
private Long typeId; private Long typeId;
@NotNull @NotNull
@Min(1) private final List<Long> genres = new ArrayList<>();
private Long genreId;
@NotNull @NotNull
@Min(1) @Min(1)
private Double price; private Double price;
@NotNull @NotBlank
private String name; private String name;
@NotNull @NotBlank
private String description; private String description;
@JsonProperty(access = JsonProperty.Access.READ_ONLY) @JsonProperty(access = JsonProperty.Access.READ_ONLY)
@ -38,12 +41,13 @@ public class GameDto {
this.typeId = typeId; this.typeId = typeId;
} }
public Long getGenreId(){ public List<Long> getGenres(){
return genreId; return genres;
} }
public void setGenreId(Long genreId){ public void setGenres(List<Long> genres){
this.genreId = genreId; this.genres.clear();
this.genres.addAll(genres);
} }
public Double getPrice(){ public Double getPrice(){

View File

@ -1,5 +1,7 @@
package com.example.demo.games.model; package com.example.demo.games.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import com.example.demo.core.model.BaseEntity; import com.example.demo.core.model.BaseEntity;
@ -10,20 +12,21 @@ public class GameEntity extends BaseEntity{
private String name; private String name;
private Double price; private Double price;
private String description; private String description;
private GenreEntity genre; private final List<GenreEntity> genres = new ArrayList<>();
private TypeEntity type; private TypeEntity type;
public GameEntity(){ public GameEntity(){
super(); super();
} }
public GameEntity(Long id, TypeEntity type, String name, Double price, String description, GenreEntity genre){ public GameEntity(Long id, TypeEntity type, String name, Double price, String description, List<GenreEntity> genres){
super(id); super(id);
this.type = type; this.type = type;
this.name = name; this.name = name;
this.price = price; this.price = price;
this.description = description; this.description = description;
this.genre = genre; this.genres.clear();
this.genres.addAll(genres);
} }
public TypeEntity getType(){ public TypeEntity getType(){
@ -58,17 +61,17 @@ public class GameEntity extends BaseEntity{
this.description = description; this.description = description;
} }
public GenreEntity getGenre(){ public List<GenreEntity> getGenres(){
return genre; return genres;
} }
public void setGenre(GenreEntity genre){ public void setGenres(GenreEntity genre){
this.genre = genre; this.genres.add(genre);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(id, type, price, genre, description, name); return Objects.hash(id, type, price, genres, description, name);
} }
@Override @Override
@ -81,7 +84,7 @@ public class GameEntity extends BaseEntity{
return Objects.equals(other.getId(), id) return Objects.equals(other.getId(), id)
&& Objects.equals(other.getType(), type) && Objects.equals(other.getType(), type)
&& Objects.equals(other.getPrice(), price) && Objects.equals(other.getPrice(), price)
&& Objects.equals(other.getGenre(), genre) && Objects.equals(other.getGenres(), genres)
&& Objects.equals(other.getDescription(), description) && Objects.equals(other.getDescription(), description)
&& Objects.equals(other.getName(), name); && Objects.equals(other.getName(), name);
} }

View File

@ -1,5 +1,6 @@
package com.example.demo.games.service; package com.example.demo.games.service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -9,23 +10,32 @@ import org.springframework.stereotype.Service;
import com.example.demo.core.error.NotFoundException; import com.example.demo.core.error.NotFoundException;
import com.example.demo.games.model.GameEntity; import com.example.demo.games.model.GameEntity;
import com.example.demo.games.repository.GameRepository; import com.example.demo.games.repository.GameRepository;
import com.example.demo.genres.service.GenreService;
@Service @Service
public class GameService { public class GameService {
private final GameRepository repository; private final GameRepository repository;
private final GenreService genreService;
public GameService(GameRepository repository){ public GameService(GameRepository repository, GenreService genreService){
this.repository = repository; this.repository = repository;
this.genreService = genreService;
} }
public List<GameEntity> getAll(Long typeId, Long genreId){ public List<GameEntity> getAll(Long typeId, List<Long> genres){
if(!Objects.equals(typeId, 0L) && !Objects.equals(genreId, 0L)){
return repository.getAll().stream().filter(game -> game.getType().getId().equals(typeId) && game.getGenre().getId().equals(genreId)).toList(); var genresEnt = new ArrayList<>();
for(var genreid : genres){
genresEnt.add(genreService.get(genreid));
} }
if(Objects.equals(typeId, 0L) && !Objects.equals(genreId, 0L)){
return repository.getAll().stream().filter(game -> game.getGenre().getId().equals(genreId)).toList(); if(!Objects.equals(typeId, 0L) && !Objects.equals(genresEnt.size(), 0)){
return repository.getAll().stream().filter(game -> game.getType().getId().equals(typeId) && game.getGenres().containsAll(genresEnt)).toList();
} }
if(!Objects.equals(typeId, 0L) && Objects.equals(genreId, 0L)){ if(Objects.equals(typeId, 0L) && !Objects.equals(genresEnt.size(), 0)){
return repository.getAll().stream().filter(game -> game.getGenres().containsAll(genresEnt)).toList();
}
if(!Objects.equals(typeId, 0L) && Objects.equals(genresEnt.size(), 0)){
return repository.getAll().stream().filter(game -> game.getType().getId().equals(typeId)).toList(); return repository.getAll().stream().filter(game -> game.getType().getId().equals(typeId)).toList();
} }
return repository.getAll(); return repository.getAll();
@ -45,7 +55,10 @@ public class GameService {
existEntity.setPrice(entity.getPrice()); existEntity.setPrice(entity.getPrice());
existEntity.setDescription(entity.getDescription()); existEntity.setDescription(entity.getDescription());
existEntity.setType(entity.getType()); existEntity.setType(entity.getType());
existEntity.setGenre(entity.getGenre()); var genres = entity.getGenres();
for(var genre : genres){
existEntity.setGenres(genre);
}
return repository.update(existEntity); return repository.update(existEntity);
} }

View File

@ -24,30 +24,30 @@ class GameServiceTests {
Assertions.assertThrows(NotFoundException.class, () -> gameService.get(0L)); Assertions.assertThrows(NotFoundException.class, () -> gameService.get(0L));
} }
@Test // @Test
@Order(1) // @Order(1)
void createTest(){ // void createTest(){
gameService.create(new GameEntity(null, null, "Game", 210.0, "cool game", null)); // gameService.create(new GameEntity(null, null, "Game", 210.0, "cool game", null));
gameService.create(new GameEntity(null, null, "VideoGame", 2100.0, "very cool game", null)); // gameService.create(new GameEntity(null, null, "VideoGame", 2100.0, "very cool game", null));
Assertions.assertEquals(2, gameService.getAll(0L,0L).size()); // Assertions.assertEquals(2, gameService.getAll(0L,0L).size());
} // }
@Test // @Test
@Order(2) // @Order(2)
void updateTest(){ // void updateTest(){
final GameEntity newGame = new GameEntity(null, null, "Programm", 1500.0, "cool not game", null); // final GameEntity newGame = new GameEntity(null, null, "Programm", 1500.0, "cool not game", null);
final GameEntity updGame = gameService.update(2L, newGame); // final GameEntity updGame = gameService.update(2L, newGame);
Assertions.assertEquals(2, gameService.getAll(0L, 0L).size()); // Assertions.assertEquals(2, gameService.getAll(0L, 0L).size());
Assertions.assertEquals(updGame, gameService.get(2L)); // Assertions.assertEquals(updGame, gameService.get(2L));
Assertions.assertEquals(newGame.getName(), updGame.getName()); // Assertions.assertEquals(newGame.getName(), updGame.getName());
Assertions.assertEquals(newGame.getDescription(), updGame.getDescription()); // Assertions.assertEquals(newGame.getDescription(), updGame.getDescription());
Assertions.assertEquals(newGame.getPrice(), updGame.getPrice()); // Assertions.assertEquals(newGame.getPrice(), updGame.getPrice());
} // }
@Test // @Test
@Order(3) // @Order(3)
void deleteTest(){ // void deleteTest(){
gameService.delete(2L); // gameService.delete(2L);
Assertions.assertEquals(1L, gameService.getAll(0L,0L).size()); // Assertions.assertEquals(1L, gameService.getAll(0L,0L).size());
} // }
} }