diff --git a/.github/workflows/Backend-CI.yml b/.github/workflows/Backend-CI.yml index 582bb0275..90be30774 100644 --- a/.github/workflows/Backend-CI.yml +++ b/.github/workflows/Backend-CI.yml @@ -28,6 +28,7 @@ jobs: - name: Remove Containers run: | docker ps -aq | xargs -r docker rm -vf + docker builder prune - name: Set up Test MongoDB working-directory: ./backend/pokerogue/src/main/resources/ diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java index 43ea7a5c7..bcee2229a 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleController.java @@ -20,11 +20,6 @@ public ApiResponse> weatherList() { return new ApiResponse<>("날씨 리스트 불러오기에 성공했습니다.", battleService.findWeathers()); } - @GetMapping("/api/v1/moves") - public ApiResponse> moveByPokemonList(@RequestParam("pokedex-number") Integer pokedexNumber) { - return new ApiResponse<>("포켓몬의 기술 리스트 불러오기에 성공했습니다.", battleService.findMovesByPokemon(pokedexNumber)); - } - @GetMapping("/api/v1/battle") public ApiResponse battleResult(@RequestParam("weather-id") String weatherId, @RequestParam("my-pokemon-id") String myPokemonId, diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java index 5018c03df..d63de9aba 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleMove.java @@ -1,5 +1,6 @@ package com.pokerogue.helper.battle; +import com.pokerogue.helper.move.data.MoveCategory; import com.pokerogue.helper.type.data.Type; public record BattleMove( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java index 30452520f..389629914 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattleService.java @@ -2,14 +2,13 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.data.MoveCategory; import com.pokerogue.helper.pokemon.data.InMemoryPokemon; import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; import com.pokerogue.helper.type.data.Type; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -17,85 +16,16 @@ @RequiredArgsConstructor public class BattleService { - private final BattleMoveRepository battleMoveRepository; + private final BattleMoveRepository moveRepository; private final InMemoryPokemonRepository inMemoryPokemonRepository; private final InMemoryTypeMatchingRepository typeMatchingRepository; - private Map> findByDexnumberCache = new HashMap<>(); - public List findWeathers() { return Arrays.stream(Weather.values()) .map(WeatherResponse::from) .toList(); } - public List findMovesByPokemon(String pokemonId) { - List allMoveIds = new ArrayList<>(); - InMemoryPokemon inMemoryPokemon = inMemoryPokemonRepository.findById(pokemonId) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - - List moves = new ArrayList<>(); - for (int i = 0; i < inMemoryPokemon.moves().size(); i++) { - if (i % 2 == 0) { - moves.add(inMemoryPokemon.moves().get(i)); - } - } - allMoveIds.addAll(moves); - allMoveIds.addAll(inMemoryPokemon.technicalMachineMoves()); - allMoveIds.addAll(inMemoryPokemon.eggMoves()); - List battleMoves = allMoveIds.stream() - .distinct() - .map(this::findMoveById) - .toList(); - - return battleMoves.stream() - .map(MoveResponse::from) - .toList(); - } - - public List findMovesByPokemon(Integer pokedexNumber) { - if (findByDexnumberCache.isEmpty()) { - initFindByDexnumberCache(); - } - - return findByDexnumberCache.get(pokedexNumber); - } - - private void initFindByDexnumberCache() { - for (InMemoryPokemon inMemoryPokemon : inMemoryPokemonRepository.findAll().values()) { - int pokemonId = Integer.parseInt(inMemoryPokemon.speciesId()); - if (!findByDexnumberCache.containsKey(pokemonId)) { - findByDexnumberCache.put(pokemonId, makeMoveResponse(inMemoryPokemon)); - } - } - } - - private List makeMoveResponse(InMemoryPokemon inMemoryPokemon) { - List allMoveIds = new ArrayList<>(); - List moves = new ArrayList<>(); - for (int i = 0; i < inMemoryPokemon.moves().size(); i++) { - if (i % 2 == 0) { - moves.add(inMemoryPokemon.moves().get(i)); - } - } - allMoveIds.addAll(moves); - allMoveIds.addAll(inMemoryPokemon.technicalMachineMoves()); - allMoveIds.addAll(inMemoryPokemon.eggMoves()); - List battleMoves = allMoveIds.stream() - .distinct() - .map(this::findMoveById) - .toList(); - - return battleMoves.stream() - .map(MoveResponse::from) - .toList(); - } - - private BattleMove findMoveById(String id) { - return battleMoveRepository.findById(id) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)); - } - public BattleResultResponse calculateBattleResult( String weatherId, String myPokemonId, @@ -107,13 +37,15 @@ public BattleResultResponse calculateBattleResult( .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); InMemoryPokemon rivalInMemoryPokemon = inMemoryPokemonRepository.findById(rivalPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - BattleMove move = battleMoveRepository.findById(myMoveId) + BattleMove move = moveRepository.findById(myMoveId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); Type moveType = move.type(); double finalAccuracy = calculateAccuracy(move, weather); double totalMultiplier = getTotalMultiplier(move, weather, rivalInMemoryPokemon, myInMemoryPokemon); + MoveCategory moveCategory = move.category(); + return new BattleResultResponse( move.power(), totalMultiplier, @@ -121,7 +53,7 @@ public BattleResultResponse calculateBattleResult( move.name(), move.effect(), moveType.getKoName(), - move.category().getName() + moveCategory.getName() ); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java index 5129c77f7..4a16a3cb4 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/DataInitializer.java @@ -2,6 +2,7 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.data.MoveCategory; import com.pokerogue.helper.type.data.Type; import java.io.BufferedReader; import java.io.IOException; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializer.java index 70dc0feb3..e69de29bb 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializer.java @@ -1,194 +0,0 @@ -package com.pokerogue.helper.biome.config; - -import com.pokerogue.external.s3.service.S3Service; -import com.pokerogue.helper.biome.data.Biome; -import com.pokerogue.helper.biome.data.BiomeLink; -import com.pokerogue.helper.biome.data.BiomePokemon; -import com.pokerogue.helper.biome.data.BiomePokemonType; -import com.pokerogue.helper.biome.data.BiomeTypeAndTrainer; -import com.pokerogue.helper.biome.data.NextBiome; -import com.pokerogue.helper.biome.data.Tier; -import com.pokerogue.helper.biome.data.Trainer; -import com.pokerogue.helper.biome.data.TrainerPokemon; -import com.pokerogue.helper.biome.data.TrainerType; -import com.pokerogue.helper.biome.repository.BiomePokemonTypeImageRepository; -import com.pokerogue.helper.biome.repository.InMemoryBiomeRepository; -import com.pokerogue.helper.global.exception.ErrorMessage; -import com.pokerogue.helper.global.exception.GlobalCustomException; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class BiomeDatabaseInitializer implements ApplicationRunner { - - private final S3Service s3Service; - private final BiomePokemonTypeImageRepository biomePokemonTypeImageRepository; - private final InMemoryBiomeRepository inMemoryBiomeRepository; - - @Override - public void run(ApplicationArguments args) { - List biomePokemons = new ArrayList<>(); - List biomeLinks = new ArrayList<>(); - List biomeTypesAndTrainers = new ArrayList<>(); - List trainerTypes = new ArrayList<>(); - List trainerPokemons = new ArrayList<>(); - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/biome-pokemons.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String biomePokemon = bufferedReader.readLine(); - if (biomePokemon == null) { - break; - } - biomePokemons.add(new BiomePokemon(biomePokemon)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/biome-links.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String biomeLink = bufferedReader.readLine(); - if (biomeLink == null) { - break; - } - biomeLinks.add(new BiomeLink(biomeLink)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream( - "data/biome/biome-types-trainers.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String biomeTypeAndTrainer = bufferedReader.readLine(); - if (biomeTypeAndTrainer == null) { - break; - } - biomeTypesAndTrainers.add(new BiomeTypeAndTrainer(biomeTypeAndTrainer)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/trainer-types.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String trainerType = bufferedReader.readLine(); - if (trainerType == null) { - break; - } - trainerTypes.add(new TrainerType(trainerType)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream( - "data/biome/trainer-pokemons.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String trainerPokemon = bufferedReader.readLine(); - if (trainerPokemon == null) { - break; - } - trainerPokemons.add(new TrainerPokemon(trainerPokemon)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - List trainers = trainerPokemons.stream() - .filter(trainerPokemon -> existsByTrainerName(trainerTypes, trainerPokemon.getTrainerName())) - .map(trainerPokemon -> new Trainer( - trainerPokemon.getId(), - trainerPokemon.getTrainerName(), - s3Service.getTrainerImageFromS3(trainerPokemon.getId()), - new ArrayList<>(), - trainerPokemon.getTrainerPokemons()) - ).toList(); - - biomeTypesAndTrainers.stream() - .map(biomeTypeAndTrainer -> new Biome( - biomeTypeAndTrainer.getId(), - biomeTypeAndTrainer.getBiomeName(), - s3Service.getBiomeImageFromS3(biomeTypeAndTrainer.getId()), - getBiomePokemons(biomePokemons, biomeTypeAndTrainer.getBiomeName()), - biomeTypeAndTrainer.getBiomeTypes(), - getBiomeTrainers(trainers, biomeTypeAndTrainer.getTrainerNames()), - getNextBiomes(biomeLinks, biomeTypeAndTrainer.getId())) - ) - .forEach(inMemoryBiomeRepository::save); - - Arrays.stream(BiomePokemonType.values()) - .forEach(biomePokemonType -> biomePokemonTypeImageRepository.save( - biomePokemonType.name(), - s3Service.getPokerogueTypeImageFromS3(biomePokemonType.name().toLowerCase())) - ); - } - - private boolean existsByTrainerName(List trainerTypes, String trainerName) { - return trainerTypes.stream() - .anyMatch(trainerType -> trainerType.getTrainerName().equals(trainerName)); - } - - private List getTrainerTypes(List trainerTypes, String trainerName) { - return trainerTypes.stream() - .filter(trainerType -> trainerType.getTrainerName().equals(trainerName)) - .map(TrainerType::getTrainerTypes) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TRAINER_NOT_FOUND)); - } - - private Map> getBiomePokemons(List biomePokemons, String biomeName) { - List allBiomePokemons = biomePokemons.stream() - .filter(biomePokemon -> biomePokemon.getBiomeName().equals(biomeName)) - .filter(biomePokemon -> !biomePokemon.getPokemons().contains("없음")) - .toList(); - - Map> ret = new HashMap<>(); - for (BiomePokemon biomePokemon : allBiomePokemons) { - if (biomePokemon.getPokemons().contains("없음")) { - continue; - } - if (ret.containsKey(biomePokemon.getPokemonTier())) { - List pokemons = ret.get(biomePokemon.getPokemonTier()); - pokemons.addAll(biomePokemon.getPokemons()); - } else { - ret.put(biomePokemon.getPokemonTier(), new ArrayList<>(biomePokemon.getPokemons())); - } - } - - return ret; - } - - private List getBiomeTrainers(List trainers, List trainerNames) { - return trainers.stream() - .filter(trainer -> trainerNames.contains(trainer.getName())) - .toList(); - } - - private List getNextBiomes(List biomeLinks, String biomeId) { - return biomeLinks.stream() - .filter(biomeLink -> biomeLink.getId().equals(biomeId)) - .map(BiomeLink::getNextBiomes) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/controller/BiomeController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/controller/BiomeController.java index f07d3c635..11ebd3006 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/controller/BiomeController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/controller/BiomeController.java @@ -25,7 +25,12 @@ public ApiResponse> biomeList() { @GetMapping("/api/v1/biome/{id}") public ApiResponse biomeDetails(@PathVariable("id") String id) { - log.info("---- URI : {}, Param : {}", "/api/v1/biome/{id}", id); + log.info( + "---- URI : {}, Param : {}, ThreadName : {}", + "/api/v1/biome/{id}", + id, + Thread.currentThread().getName() + ); return new ApiResponse<>("바이옴 정보 불러오기에 성공했습니다.", biomeService.findBiome(id)); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Biome.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Biome.java index 1d794ee85..3ea0d6e50 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Biome.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Biome.java @@ -1,17 +1,17 @@ package com.pokerogue.helper.biome.data; import com.pokerogue.helper.type.data.Type; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Set; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Getter @Document(collection = "biome") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Biome { @Id @@ -34,31 +34,4 @@ public class Biome { @Field("trainers") private List trainers; - - private String image; // Todo: 지우기 - - private Map> pokemons; // Todo: 지우기 - - private List mainTypes; // Todo: 지우기 - - public Biome(String id, String name, String image, Map> pokemons, List mainTypes, - List trainers, List nextBiomes) { - this.id = id; - this.name = name; - this.image = image; - this.pokemons = pokemons; - this.mainTypes = mainTypes; - this.trainers = trainers; - this.nextBiomes = nextBiomes; - } - - public List getTrainerTypes() { - Set trainerTypes = new HashSet<>(); - trainers.stream() - .filter(trainer -> !trainer.getName().equals("없음")) - .forEach(trainer -> trainerTypes.addAll(null)); - - return trainerTypes.stream() - .toList(); - } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeLink.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeLink.java deleted file mode 100644 index f5541895a..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeLink.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import java.util.Arrays; -import java.util.List; -import lombok.Getter; - -@Getter -public class BiomeLink { - - private final String id; - private final String currentBiome; - private final List nextBiomes; - - public BiomeLink(String biomeLink) { - String[] biomeLinkInforms = biomeLink.split(" / "); - this.id = biomeLinkInforms[0]; - this.currentBiome = biomeLinkInforms[1]; - this.nextBiomes = Arrays.stream(biomeLinkInforms[2].split(",")) - .map(s -> new NextBiome(s.split("~")[0], s.split("~")[1])) - .toList(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemon.java deleted file mode 100644 index fad1a492e..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemon.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import java.util.List; -import lombok.Getter; - -@Getter -public class BiomePokemon { - - private final String biomeName; - private final Tier pokemonTier; - private final List pokemons; - - public BiomePokemon(String biomePokemon) { - String[] biomePokemonInforms = biomePokemon.split(" / "); - this.biomeName = biomePokemonInforms[0]; - this.pokemonTier = Tier.getTierByName(biomePokemonInforms[2]); - this.pokemons = List.of(biomePokemonInforms[3].split(",")); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonType.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonType.java deleted file mode 100644 index 642aca646..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonType.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import com.pokerogue.helper.global.exception.ErrorMessage; -import com.pokerogue.helper.global.exception.GlobalCustomException; -import java.util.Arrays; -import lombok.Getter; - -@Getter -public enum BiomePokemonType { - - GRASS("풀", "grass"), - POISON("독", "poison"), - FIRE("불꽃", "fire"), - WATER("물", "water"), - ELECTRIC("전기", "electric"), - NORMAL("노말", "normal"), - FAIRY("페어리", "fairy"), - BUG("벌레", "bug"), - DARK("악", "dark"), - DRAGON("드래곤", "dragon"), - FIGHTING("격투", "fighting"), - FLYING("비행", "flying"), - GHOST("고스트", "ghost"), - GROUND("땅", "ground"), - ICE("얼음", "ice"), - ROCK("바위", "rock"), - PSYCHIC("에스퍼", "psychic"), - STEEL("강철", "steel"), - STELLAR("스텔라", "stellar"), - UNKNOWN("없음", "unknown"); - - private final String name; - private final String id; - - BiomePokemonType(String name, String id) { - this.name = name; - this.id = id; - } - - public static BiomePokemonType getBiomePokemonTypeByName(String name) { - return Arrays.stream(values()) - .filter(biomePokemonType -> biomePokemonType.name.equals(name)) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - } - - public static BiomePokemonType getBiomePokemonTypeById(String id) { - return Arrays.stream(values()) - .filter(biomePokemonType -> biomePokemonType.id.equals(id)) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeTypeAndTrainer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeTypeAndTrainer.java deleted file mode 100644 index 9cc8acb96..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomeTypeAndTrainer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import java.util.List; -import lombok.Getter; - -@Getter -public class BiomeTypeAndTrainer { - - private final String id; - private final String biomeName; - private final List biomeTypes; - private final List trainerNames; - - public BiomeTypeAndTrainer(String biomeTypeAndTrainer) { - String[] biomeTypeAndTrainerInforms = biomeTypeAndTrainer.split(" / "); - this.id = biomeTypeAndTrainerInforms[0]; - this.biomeName = biomeTypeAndTrainerInforms[1]; - this.biomeTypes = List.of(biomeTypeAndTrainerInforms[2].split(",")); - this.trainerNames = List.of(biomeTypeAndTrainerInforms[3].split(",")); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NativePokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NativePokemon.java index 20074ce9c..d65afa012 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NativePokemon.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NativePokemon.java @@ -1,13 +1,28 @@ package com.pokerogue.helper.biome.data; import java.util.List; +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.data.mongodb.core.mapping.Field; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class NativePokemon { + private static final String BOSS = "보스"; + + @Field("tier") private Tier tier; + + @Field("pokemonIds") private List pokemonIds; + + public boolean isWild() { + return tier.isWild(); + } + + public boolean isBoss() { + return tier.isBoss(); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NextBiome.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NextBiome.java index ed692caab..f4fc468c2 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NextBiome.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/NextBiome.java @@ -1,21 +1,17 @@ package com.pokerogue.helper.biome.data; +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.data.mongodb.core.mapping.Field; @Getter -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class NextBiome { + @Field("name") private String name; - private int percentage; - - public NextBiome(String name, String percentage) { - this.name = name; - this.percentage = Integer.parseInt(percentage); - } - public String getPercent() { - return String.valueOf(percentage); - } + @Field("percentage") + private int percentage; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Tier.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Tier.java index 055d22fad..142746347 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Tier.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Tier.java @@ -25,22 +25,22 @@ public enum Tier { this.name = name; } - public static Tier getTierByName(String name) { - return Arrays.stream(values()) - .filter(tier -> tier.name.equals(name)) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TIER_NOT_FOUND)); - } - - public boolean isWildPokemon() { - return !this.name.contains("보스"); + public boolean isWild() { + return !name.contains("보스"); } - public boolean isBossPokemon() { - return this.name.contains("보스"); + public boolean isBoss() { + return name.contains("보스"); } public static Tier convertFrom(String tierData) { return getTierByName(tierData); } + + private static Tier getTierByName(String name) { + return Arrays.stream(values()) + .filter(tier -> tier.name.equals(name)) + .findFirst() + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.TIER_NOT_FOUND)); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Trainer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Trainer.java index 589004d3b..7bc427922 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Trainer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/Trainer.java @@ -2,16 +2,24 @@ import com.pokerogue.helper.type.data.Type; import java.util.List; +import lombok.AccessLevel; import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.NoArgsConstructor; +import org.springframework.data.mongodb.core.mapping.Field; @Getter -@RequiredArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Trainer { - private final String id; // Todo: 지우기 - private final String name; - private final String image; // Todo: 지우기 - private final List types; - private final List pokemonIds; + @Field("name") + private String name; + + @Field("koName") + private String koName; + + @Field("types") + private List types; + + @Field("pokemonIds") + private List pokemonIds; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerPokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerPokemon.java deleted file mode 100644 index f58e488fe..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerPokemon.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import java.util.List; -import lombok.Getter; - -@Getter -public class TrainerPokemon { - - private final String id; - private final String trainerName; - private final List trainerPokemons; - - public TrainerPokemon(String trainerPokemon) { - String[] trainerPokemonInforms = trainerPokemon.split(" / "); - this.id = trainerPokemonInforms[0]; - this.trainerName = trainerPokemonInforms[1]; - this.trainerPokemons = List.of(trainerPokemonInforms[2].split(",")); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerType.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerType.java deleted file mode 100644 index 6917a2f6b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/TrainerType.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import java.util.List; -import lombok.Getter; - -@Getter -public class TrainerType { - - private final String trainerName; - private final List trainerTypes; - - public TrainerType(String trainerType) { - String[] trainerTypeInforms = trainerType.split(" / "); - this.trainerName = trainerTypeInforms[0]; - this.trainerTypes = List.of(trainerTypeInforms[1].split(",")); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeAllPokemonResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeAllPokemonResponse.java index 0f7c3d883..7de4a41f1 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeAllPokemonResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeAllPokemonResponse.java @@ -1,11 +1,11 @@ package com.pokerogue.helper.biome.dto; -import com.pokerogue.helper.biome.data.Tier; +import com.pokerogue.helper.biome.data.NativePokemon; import java.util.List; public record BiomeAllPokemonResponse(String tier, List pokemons) { - public static BiomeAllPokemonResponse of(Tier tier, List pokemons) { - return new BiomeAllPokemonResponse(tier.getName(), pokemons); + public static BiomeAllPokemonResponse of(NativePokemon nativePokemon, List pokemons) { + return new BiomeAllPokemonResponse(nativePokemon.getTier().getName(), pokemons); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeDetailResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeDetailResponse.java index 3fb0a0913..300459469 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeDetailResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeDetailResponse.java @@ -14,6 +14,7 @@ public record BiomeDetailResponse( ) { public static BiomeDetailResponse of( Biome biome, + String biomeImage, List wildPokemons, List bossPokemons, List trainerPokemons, @@ -21,8 +22,8 @@ public static BiomeDetailResponse of( ) { return new BiomeDetailResponse( biome.getId(), - biome.getName(), - biome.getImage(), + biome.getKoName(), + biomeImage, wildPokemons, bossPokemons, trainerPokemons, diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeResponse.java index 5ef53c0ff..2aca68c01 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/BiomeResponse.java @@ -11,11 +11,11 @@ public record BiomeResponse( List trainerTypeResponses ) { - public static BiomeResponse of(Biome biome, List pokemonTypeLogos, List trainerTypeLogos) { + public static BiomeResponse of(Biome biome, String biomeImage, List pokemonTypeLogos, List trainerTypeLogos) { return new BiomeResponse( biome.getId(), - biome.getName(), - biome.getImage(), + biome.getKoName(), + biomeImage, pokemonTypeLogos, trainerTypeLogos ); diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/NextBiomeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/NextBiomeResponse.java index 0f02ecab4..036af8eaf 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/NextBiomeResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/NextBiomeResponse.java @@ -14,14 +14,15 @@ public record NextBiomeResponse( public static NextBiomeResponse of( Biome biome, + String biomeImage, String percent, List pokemonTypeResponses, List trainerTypeResponses ) { return new NextBiomeResponse( biome.getId(), - biome.getName(), - biome.getImage(), + biome.getKoName(), + biomeImage, percent, pokemonTypeResponses, trainerTypeResponses diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/TrainerPokemonResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/TrainerPokemonResponse.java index 166b1c4a7..fb78a78f1 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/TrainerPokemonResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/dto/TrainerPokemonResponse.java @@ -12,11 +12,12 @@ public record TrainerPokemonResponse( public static TrainerPokemonResponse from( Trainer trainer, + String trainerImage, List trainerTypes, List trainerPokemons) { return new TrainerPokemonResponse( - trainer.getName(), - trainer.getImage(), + trainer.getKoName(), + trainerImage, trainerTypes, trainerPokemons ); diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonTypeImageRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonTypeImageRepository.java deleted file mode 100644 index db00e33fc..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonTypeImageRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pokerogue.helper.biome.repository; - -import java.util.HashMap; -import java.util.Map; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class BiomePokemonTypeImageRepository { - - private final Map biomePokemonTypeImages; - - public BiomePokemonTypeImageRepository() { - this.biomePokemonTypeImages = new HashMap<>(); - } - - public void save(String typeName, String typeImageUrl) { - biomePokemonTypeImages.put(typeName, typeImageUrl); - } - - public String findPokemonTypeImageUrl(String typeName) { - return biomePokemonTypeImages.get(typeName); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/InMemoryBiomeRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/InMemoryBiomeRepository.java deleted file mode 100644 index dc39f961a..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/InMemoryBiomeRepository.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pokerogue.helper.biome.repository; - -import com.pokerogue.helper.biome.data.Biome; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class InMemoryBiomeRepository { - - private final Map biomes; - - public InMemoryBiomeRepository() { - this.biomes = new HashMap<>(); - } - - public void save(Biome biome) { - biomes.put(biome.getId(), biome); - } - - public List findAll() { - return biomes.values().stream() - .toList(); - } - - public Optional findById(String id) { - return Optional.ofNullable(biomes.get(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/service/BiomeService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/service/BiomeService.java index 47e01c934..dd5741b91 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/service/BiomeService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/service/BiomeService.java @@ -2,8 +2,7 @@ import com.pokerogue.external.s3.service.S3Service; import com.pokerogue.helper.biome.data.Biome; -import com.pokerogue.helper.biome.data.BiomePokemonType; -import com.pokerogue.helper.biome.data.Tier; +import com.pokerogue.helper.biome.data.NativePokemon; import com.pokerogue.helper.biome.data.Trainer; import com.pokerogue.helper.biome.dto.BiomeAllPokemonResponse; import com.pokerogue.helper.biome.dto.BiomeDetailResponse; @@ -12,15 +11,12 @@ import com.pokerogue.helper.biome.dto.BiomeTypeResponse; import com.pokerogue.helper.biome.dto.NextBiomeResponse; import com.pokerogue.helper.biome.dto.TrainerPokemonResponse; -import com.pokerogue.helper.biome.repository.BiomePokemonTypeImageRepository; -import com.pokerogue.helper.biome.repository.InMemoryBiomeRepository; +import com.pokerogue.helper.biome.repository.BiomeRepository; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; -import com.pokerogue.helper.pokemon.data.Type; -import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; -import java.util.ArrayList; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; +import com.pokerogue.helper.type.data.Type; import java.util.List; -import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -29,132 +25,114 @@ public class BiomeService { private final S3Service s3Service; - private final InMemoryBiomeRepository inMemoryBiomeRepository; - private final InMemoryPokemonRepository inMemoryPokemonRepository; - private final BiomePokemonTypeImageRepository biomePokemonTypeImageRepository; + private final BiomeRepository biomeRepository; + private final PokemonRepository pokemonRepository; public List findBiomes() { - return inMemoryBiomeRepository.findAll().stream() + return biomeRepository.findAll().stream() .map(biome -> BiomeResponse.of( biome, - getTypesResponses(biome.getMainTypes()), - getTypesResponses(new ArrayList<>())) + s3Service.getBiomeImageFromS3(biome.getId()), + getTypesResponses(biome.getTypes()), + getTrainerTypesResponses(biome.getTrainers())) ) .toList(); } public BiomeDetailResponse findBiome(String id) { - Biome biome = inMemoryBiomeRepository.findById(id) + Biome biome = biomeRepository.findById(id) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); return BiomeDetailResponse.of( biome, - getWildPokemons(biome), - getBossPokemons(biome), + s3Service.getBiomeImageFromS3(biome.getId()), + getWildPokemons(biome.getNativePokemons()), + getBossPokemons(biome.getNativePokemons()), getTrainerPokemons(biome), getNextBiomes(biome) ); } - private List getWildPokemons(Biome biome) { - Map> biomePokemons = biome.getPokemons(); - - return biomePokemons.keySet().stream() - .filter(Tier::isWildPokemon) - .map(tier -> BiomeAllPokemonResponse.of(tier, getBiomePokemons(biomePokemons.get(tier)))) - .distinct() + private List getWildPokemons(List nativePokemons) { + return nativePokemons.stream() + .filter(NativePokemon::isWild) + .map(nativePokemon -> BiomeAllPokemonResponse.of( + nativePokemon, + getBiomePokemons(nativePokemon.getPokemonIds()))) .toList(); } - private List getBossPokemons(Biome biome) { - Map> biomePokemons = biome.getPokemons(); - - return biomePokemons.keySet().stream() - .filter(Tier::isBossPokemon) - .map(tier -> BiomeAllPokemonResponse.of(tier, getBiomePokemons(biomePokemons.get(tier)))) - .distinct() + private List getBossPokemons(List nativePokemons) { + return nativePokemons.stream() + .filter(NativePokemon::isBoss) + .map(nativePokemon -> BiomeAllPokemonResponse.of( + nativePokemon, + getBiomePokemons(nativePokemon.getPokemonIds()))) .toList(); } - private List getBiomePokemons(List biomePokemons) { - return biomePokemons.stream() - .map(biomePokemon -> inMemoryPokemonRepository.findById(biomePokemon) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)) - ) - .map(biomePokemonInfo -> new BiomePokemonResponse( - biomePokemonInfo.id(), - biomePokemonInfo.koName(), - s3Service.getPokemonImageFromS3(biomePokemonInfo.id()), - getBiomePokemonTypeResponses( - Type.findById(biomePokemonInfo.firstType()), - Type.findById(biomePokemonInfo.secondType())) - )) - .distinct() - .toList(); - } - - private List getBiomePokemonTypeResponses( - Type firstType, - Type secondType - ) { - List biomeTypeRespons = new ArrayList<>(); - if (!firstType.equals(Type.EMPTY) && !firstType.equals(Type.UNKNOWN)) { - biomeTypeRespons.add(new BiomeTypeResponse( - biomePokemonTypeImageRepository.findPokemonTypeImageUrl(firstType.name()), - firstType.getName()) - ); - } - if (!secondType.equals(Type.EMPTY) && !secondType.equals(Type.UNKNOWN)) { - biomeTypeRespons.add(new BiomeTypeResponse( - biomePokemonTypeImageRepository.findPokemonTypeImageUrl(secondType.name()), - secondType.getName()) - ); - } - - return biomeTypeRespons; - } - private List getTrainerPokemons(Biome biome) { - List trainerNames = biome.getTrainers().stream() - .map(Trainer::getName) - .toList(); - if (trainerNames.contains("없음")) { - return List.of(); - } - return biome.getTrainers().stream() .map(trainer -> TrainerPokemonResponse.from( trainer, - getTypesResponses(null), + s3Service.getTrainerImageFromS3(trainer.getName()), + getTypesResponses(trainer.getTypes()), getBiomePokemons(trainer.getPokemonIds())) ) .toList(); } - private List getTypesResponses(List types) { - return types.stream() - .map(type -> new BiomeTypeResponse(biomePokemonTypeImageRepository.findPokemonTypeImageUrl( - BiomePokemonType.getBiomePokemonTypeByName(type).name()), type) - ) - .toList(); - } - private List getNextBiomes(Biome biome) { - if (biome.getId().equals("end")) { - return List.of(); - } - return biome.getNextBiomes().stream() .map(nextBiomeInfo -> { - Biome nextBiome = inMemoryBiomeRepository.findById(nextBiomeInfo.getName()) + Biome nextBiome = biomeRepository.findById(nextBiomeInfo.getName()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); + return NextBiomeResponse.of( nextBiome, - nextBiomeInfo.getPercent(), - getTypesResponses(nextBiome.getMainTypes()), - getTypesResponses(new ArrayList<>()) + s3Service.getBiomeImageFromS3(nextBiome.getId()), + String.valueOf(nextBiomeInfo.getPercentage()), + getTypesResponses(nextBiome.getTypes()), + getTrainerTypesResponses(nextBiome.getTrainers()) ); }) .toList(); } + + private List getBiomePokemons(List biomePokemons) { + List biomePokemonResponses = pokemonRepository.findAllById(biomePokemons).stream() + .map(pokemon -> new BiomePokemonResponse( + pokemon.getId(), + pokemon.getKoName(), + s3Service.getPokemonImageFromS3(pokemon.getImageId()), + getTypesResponses(pokemon.getTypes())) + ) + .distinct() + .toList(); + if (biomePokemons.size() == biomePokemonResponses.size()) { + return biomePokemonResponses; + } + + throw new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND); + } + + private List getTypesResponses(List types) { + return types.stream() + .map(type -> new BiomeTypeResponse( + type.getImage(), + type.getKoName()) + ) + .toList(); + } + + private List getTrainerTypesResponses(List trainers) { + return trainers.stream() + .map(Trainer::getTypes) + .flatMap(List::stream) + .map(type -> new BiomeTypeResponse( + type.getImage(), + type.getKoName()) + ) + .toList(); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/global/exception/ErrorMessage.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/global/exception/ErrorMessage.java index da5e4f839..e38f26935 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/global/exception/ErrorMessage.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/global/exception/ErrorMessage.java @@ -12,19 +12,15 @@ public enum ErrorMessage { POKEMON_ABILITY_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 특성을 찾지 못했습니다."), POKEMON_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 타입을 찾지 못했습니다."), ARTICLE_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 꿀팁을 찾지 못했습니다."), - TIER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 티어를 찾지 못했습니다."), - TRAINER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 트레이너를 찾지 못했습니다."), - BIOME_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 바이옴을 찾지 못했습니다."), - MOVE_BY_MACHINE_NOT_FOUND(HttpStatus.NOT_FOUND, "도감 번호에 해당하는 머신으로 배울 수 있는 기술을 찾지 못했습니다."), - MOVE_BY_EGG_NOT_FOUND(HttpStatus.NOT_FOUND, "도감 번호에 해당하는 알 기술을 찾지 못했습니다."), - MOVE_BY_SELF_NOT_FOUND(HttpStatus.NOT_FOUND, "도감 번호에 해당하는 자력 기술을 찾지 못했습니다."), - MOVE_NOT_FOUND(HttpStatus.NOT_FOUND, "id에 해당하는 기술을 찾지 못했습니다."), - MOVE_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "기술 카테고리를 찾지 못했습니다."), MOVE_TARGET_NOT_FOUND(HttpStatus.NOT_FOUND, "기술 타켓을 찾지 못했습니다."), MOVE_FLAG_NOT_FOUND(HttpStatus.NOT_FOUND, "기술 플래그를 찾지 못했습니다."), WEATHER_NOT_FOUND(HttpStatus.NOT_FOUND, "id에 해당하는 날씨를 찾지 못했습니다."), EVOLUTION_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 진화 정보를 찾지 못했습니다."), + TIER_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, "해당하는 티어를 찾지 못했습니다."), + BIOME_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, "해당하는 바이옴을 찾지 못했습니다."), + MOVE_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, "id에 해당하는 기술을 찾지 못했습니다."), + MOVE_CATEGORY_NOT_FOUND(HttpStatus.INTERNAL_SERVER_ERROR, "기술 카테고리를 찾지 못했습니다."), PARSE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "파싱에 실패했습니다."), TYPE_MATCHING_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "타입 상성 찾기에 실패했습니다."), diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/controller/MoveController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/controller/MoveController.java new file mode 100644 index 000000000..b8c990ca5 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/controller/MoveController.java @@ -0,0 +1,44 @@ +package com.pokerogue.helper.move.controller; + +import com.pokerogue.helper.move.dto.MoveResponse; +import com.pokerogue.helper.move.service.MoveService; +import com.pokerogue.helper.util.dto.ApiResponse; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@RequiredArgsConstructor +public class MoveController { + + private final MoveService moveService; + + @GetMapping("/api/v1/moves") + public ApiResponse> moveListByPokedexNumber(@RequestParam("pokedex-number") Integer pokedexNumber) { + log.info( + "---- URI : {}, Param : {}, ThreadName : {}", + "/api/v1/moves?pokedex-number=", + pokedexNumber, + Thread.currentThread().getName() + ); + + return new ApiResponse<>("포켓몬의 기술 리스트 불러오기에 성공했습니다.", moveService.findMovesByPokemon(pokedexNumber)); + } + + @GetMapping("/api/v1/move/{id}") + public ApiResponse moveDetails(@PathVariable String id) { + log.info( + "---- URI : {}, Param : {}, ThreadName : {}", + "/api/v1/move/{id}", + id, + Thread.currentThread().getName() + ); + + return new ApiResponse<>("포켓몬의 기술 불러오기에 성공했습니다.", moveService.findMove(id)); + } +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/converter/MoveCategoryConverter.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/converter/MoveCategoryConverter.java index 9d83ce18c..24d831aaf 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/converter/MoveCategoryConverter.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/converter/MoveCategoryConverter.java @@ -1,6 +1,6 @@ package com.pokerogue.helper.move.converter; -import com.pokerogue.helper.battle.MoveCategory; +import com.pokerogue.helper.move.data.MoveCategory; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java index bae9f135f..a96850ba8 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/Move.java @@ -1,15 +1,17 @@ package com.pokerogue.helper.move.data; -import com.pokerogue.helper.battle.MoveCategory; import com.pokerogue.helper.type.data.Type; import java.util.List; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; @Getter @Document(collection = "move") +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Move { @Id diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveCategory.java similarity index 97% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveCategory.java index 80f1c7e81..d5a15022c 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveCategory.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveCategory.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.move.data; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java similarity index 53% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java index faf209ffb..fff97254f 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/MoveResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveResponse.java @@ -1,5 +1,7 @@ -package com.pokerogue.helper.battle; +package com.pokerogue.helper.move.dto; +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.data.MoveCategory; import com.pokerogue.helper.type.data.Type; public record MoveResponse( @@ -14,20 +16,20 @@ public record MoveResponse( String effect ) { - public static MoveResponse from(BattleMove battleMove) { - Type type = battleMove.type(); - MoveCategory moveCategory = battleMove.category(); + public static MoveResponse from(Move move) { + Type type = move.getType(); + MoveCategory moveCategory = move.getMoveCategory(); return new MoveResponse( - battleMove.id(), - battleMove.name(), + move.getId(), + move.getKoName(), type.getName(), type.getImage(), moveCategory.getEngName(), moveCategory.getImage(), - battleMove.power(), - battleMove.accuracy(), - battleMove.effect() + move.getPower(), + move.getAccuracy(), + move.getEffect() ); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/MoveRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java similarity index 80% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/move/MoveRepository.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java index ae45333b7..53564ad90 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/MoveRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/repository/MoveRepository.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.move; +package com.pokerogue.helper.move.repository; import com.pokerogue.helper.move.data.Move; import org.springframework.data.mongodb.repository.MongoRepository; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/service/MoveService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/service/MoveService.java new file mode 100644 index 000000000..adbea2d32 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/service/MoveService.java @@ -0,0 +1,63 @@ +package com.pokerogue.helper.move.service; + +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.dto.MoveResponse; +import com.pokerogue.helper.move.repository.MoveRepository; +import com.pokerogue.helper.pokemon.data.LevelMove; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MoveService { + + private final PokemonRepository pokemonRepository; + private final MoveRepository moveRepository; + + public List findMovesByPokemon(Integer pokedexNumber) { + List pokemons = pokemonRepository.findByPokedexNumber(pokedexNumber); + if (pokemons.isEmpty()) { + throw new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND); + } + return makeMoveResponse(pokemons.get(0)); + } + + private List makeMoveResponse(Pokemon pokemon) { + List allMoveIds = getAllMoveIds(pokemon); + List moves = allMoveIds.stream() + .distinct() + .map(this::findMoveById) + .toList(); + + return moves.stream() + .map(MoveResponse::from) + .toList(); + } + + private static List getAllMoveIds(Pokemon pokemon) { + List allMoveIds = new ArrayList<>(); + List levelMoves = pokemon.getLevelMoves().stream() + .map(LevelMove::getMoveId) + .toList(); + allMoveIds.addAll(levelMoves); + allMoveIds.addAll(pokemon.getTechnicalMachineMoveIds()); + allMoveIds.addAll(pokemon.getEggMoveIds()); + return allMoveIds; + } + + public MoveResponse findMove(String id) { + Move move = findMoveById(id); + return MoveResponse.from(move); + } + + private Move findMoveById(String id) { + return moveRepository.findById(id) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)); + } +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java deleted file mode 100644 index 9dc59e100..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.pokerogue.helper.pokemon.dto; - -import com.pokerogue.helper.battle.BattleMove; -import com.pokerogue.helper.battle.MoveCategory; -import com.pokerogue.helper.pokemon.data.Type; - -public record MoveResponse( - String id, - String name, - Integer level, - Integer power, - Integer accuracy, - String type, - String typeLogo, - String category, - String categoryLogo -) { - - public static MoveResponse from(BattleMove battleMove, Integer level, String typeImageFromS3) { - MoveCategory moveCategory = battleMove.category(); - Type firstType = Type.findById(battleMove.type().getKoName()); - - return new MoveResponse( - battleMove.id(), - battleMove.name(), - level, - battleMove.power(), - battleMove.accuracy(), - firstType.getName(), - typeImageFromS3, - moveCategory.getName(), - moveCategory.getImage() - ); - } - -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java index 33f53ff97..b551b19fd 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java @@ -24,8 +24,8 @@ public record PokemonDetailResponse( Double weight, Double height, EvolutionResponses evolutions, - List moves, - List eggMoveResponses, + List moves, + List eggPokemonMoveResponses, List biomes ) { } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonMoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonMoveResponse.java new file mode 100644 index 000000000..8014614ba --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonMoveResponse.java @@ -0,0 +1,36 @@ +package com.pokerogue.helper.pokemon.dto; + +import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.data.MoveCategory; +import com.pokerogue.helper.type.data.Type; + +public record PokemonMoveResponse( + String id, + String name, + Integer level, + Integer power, + Integer accuracy, + String type, + String typeLogo, + String category, + String categoryLogo +) { + + public static PokemonMoveResponse from(Move move, Integer level, String typeImageFromS3) { + MoveCategory moveCategory = move.getMoveCategory(); + Type moveType = move.getType(); + + return new PokemonMoveResponse( + move.getId(), + move.getKoName(), + level, + move.getPower(), + move.getAccuracy(), + moveType.getName(), + typeImageFromS3, + moveCategory.getName(), + moveCategory.getImage() + ); + } + +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonRepository.java index e8a0baba5..05fc4d910 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonRepository.java @@ -1,7 +1,10 @@ package com.pokerogue.helper.pokemon.repository; import com.pokerogue.helper.pokemon.data.Pokemon; +import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; public interface PokemonRepository extends MongoRepository { + + List findByPokedexNumber(int pokedexNumber); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/service/PokemonService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/service/PokemonService.java index 94e7080dd..172e14a47 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/service/PokemonService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/service/PokemonService.java @@ -4,11 +4,11 @@ import com.pokerogue.external.s3.service.S3Service; import com.pokerogue.helper.ability.data.Ability; import com.pokerogue.helper.ability.repository.InMemoryAbilityRepository; -import com.pokerogue.helper.battle.BattleMoveRepository; import com.pokerogue.helper.biome.data.Biome; -import com.pokerogue.helper.biome.repository.InMemoryBiomeRepository; +import com.pokerogue.helper.biome.repository.BiomeRepository; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.repository.MoveRepository; import com.pokerogue.helper.pokemon.data.Evolution; import com.pokerogue.helper.pokemon.data.EvolutionChain; import com.pokerogue.helper.pokemon.data.EvolutionItem; @@ -16,10 +16,10 @@ import com.pokerogue.helper.pokemon.data.Type; import com.pokerogue.helper.pokemon.dto.EvolutionResponse; import com.pokerogue.helper.pokemon.dto.EvolutionResponses; -import com.pokerogue.helper.pokemon.dto.MoveResponse; import com.pokerogue.helper.pokemon.dto.PokemonAbilityResponse; import com.pokerogue.helper.pokemon.dto.PokemonBiomeResponse; import com.pokerogue.helper.pokemon.dto.PokemonDetailResponse; +import com.pokerogue.helper.pokemon.dto.PokemonMoveResponse; import com.pokerogue.helper.pokemon.dto.PokemonResponse; import com.pokerogue.helper.pokemon.repository.EvolutionRepository; import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; @@ -42,9 +42,9 @@ public class PokemonService { private final S3Service s3Service; private final InMemoryPokemonRepository inMemoryPokemonRepository; - private final BattleMoveRepository battleMoveRepository; + private final MoveRepository moveRepository; private final EvolutionRepository evolutionRepository; - private final InMemoryBiomeRepository inMemoryBiomeRepository; + private final BiomeRepository biomeRepository; private final InMemoryAbilityRepository inMemoryAbilityRepository; private List findAllCache = List.of(); @@ -93,8 +93,8 @@ private PokemonDetailResponse toPokemon2DetailResponse(InMemoryPokemon inMemoryP List pokemonTypeResponses = createTypeResponse(inMemoryPokemon); List pokemonAbilityResponses = createAbilityResponse(inMemoryPokemon); EvolutionResponses evolutionResponses = createEvolutionResponse(inMemoryPokemon); - List moveResponse = createMoveResponse(inMemoryPokemon.moves()); - List eggMoveResponse = createEggMoveResponse(inMemoryPokemon.eggMoves()); + List pokemonMoveResponse = createMoveResponse(inMemoryPokemon.moves()); + List eggPokemonMoveResponse = createEggMoveResponse(inMemoryPokemon.eggMoves()); List biomeResponse = createBiomeResponse(inMemoryPokemon.biomes()); return new PokemonDetailResponse( @@ -118,8 +118,8 @@ private PokemonDetailResponse toPokemon2DetailResponse(InMemoryPokemon inMemoryP inMemoryPokemon.weight(), inMemoryPokemon.height(), evolutionResponses, - moveResponse, - eggMoveResponse, + pokemonMoveResponse, + eggPokemonMoveResponse, biomeResponse ); } @@ -244,7 +244,7 @@ private List createBiomeResponse(List biomes) { if (id.isEmpty()) { return new PokemonBiomeResponse("", "", ""); } - Biome biome = inMemoryBiomeRepository.findById(id).orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); + Biome biome = biomeRepository.findById(id).orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); return new PokemonBiomeResponse( id, biome.getName(), @@ -255,26 +255,25 @@ private List createBiomeResponse(List biomes) { .toList(); } - private List createEggMoveResponse(List moves) { + private List createEggMoveResponse(List moves) { return moves.stream() - .map(r -> battleMoveRepository.findById(r).orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND))) - .map(move -> MoveResponse.from(move, 1, - s3Service.getPokerogueTypeImageFromS3(battleMoveRepository.findById(move.id()) + .map(r -> moveRepository.findById(r).orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND))) + .map(move -> PokemonMoveResponse.from(move, 1, + moveRepository.findById(move.getId()) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)) - .type().getName()))) + .getType().getImage())) .toList(); } - private List createMoveResponse(List moves) { + private List createMoveResponse(List moves) { return IntStream.iterate(0, index -> index + 2) .limit(moves.size() / 2) - .mapToObj(index -> MoveResponse.from( - battleMoveRepository.findById(moves.get(index)).orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)), + .mapToObj(index -> PokemonMoveResponse.from( + moveRepository.findById(moves.get(index)).orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)), Integer.parseInt(moves.get(index + 1)), - s3Service.getPokerogueTypeImageFromS3( - battleMoveRepository.findById(moves.get(index)) + moveRepository.findById(moves.get(index)) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)) - .type().getName()) + .getType().getImage() )) .toList(); } diff --git a/backend/pokerogue/src/main/resources b/backend/pokerogue/src/main/resources index 985453eef..93fd3dfa2 160000 --- a/backend/pokerogue/src/main/resources +++ b/backend/pokerogue/src/main/resources @@ -1 +1 @@ -Subproject commit 985453eefb017232bc289886acea1f0eb756d80f +Subproject commit 93fd3dfa20e6c1713afc37b159b6941c67821dc4 diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java index 36f982a19..885c92037 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/BattleServiceTest.java @@ -4,9 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.pokerogue.environment.service.ServiceTest; -import com.pokerogue.helper.pokemon.data.InMemoryPokemon; -import com.pokerogue.helper.pokemon.repository.InMemoryPokemonRepository; -import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -16,23 +13,6 @@ class BattleServiceTest extends ServiceTest { @Autowired private BattleService battleService; - @Autowired - private InMemoryPokemonRepository inMemoryPokemonRepository; - - @Test - @DisplayName("포켓몬의 기술(자력 기술, 머신 기술, 알 기술) 리스트를 조회한다.") - void findMovesByPokemon() { - List pokemonIds = inMemoryPokemonRepository.findAll().values() - .stream() - .map(InMemoryPokemon::id) - .toList(); - - pokemonIds.forEach(pokemonId -> { - List moveResponses = battleService.findMovesByPokemon(pokemonId); - assertThat(moveResponses).isNotEmpty(); - }); - } - @Test @DisplayName("배틀 예상 결과를 계산한다.") void calculateBattleResult() { diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/MoveCategoryTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/MoveCategoryTest.java index 45753243a..eaa0807d3 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/MoveCategoryTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/MoveCategoryTest.java @@ -5,6 +5,7 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.data.MoveCategory; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializerTest.java deleted file mode 100644 index 8ddad3891..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/config/BiomeDatabaseInitializerTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pokerogue.helper.biome.config; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pokerogue.environment.service.ServiceTest; -import com.pokerogue.helper.biome.repository.InMemoryBiomeRepository; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.DefaultApplicationArguments; - -class BiomeDatabaseInitializerTest extends ServiceTest { - - @Autowired - private BiomeDatabaseInitializer biomeDatabaseInitializer; - - @Autowired - private InMemoryBiomeRepository inMemoryBiomeRepository; - - @Test - @DisplayName("바이옴 데이터를 세팅한다.") - void setBiomesData() { - biomeDatabaseInitializer.run(new DefaultApplicationArguments()); - - assertThat(inMemoryBiomeRepository.findAll()).hasSize(35); - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/service/BiomeServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/service/BiomeServiceTest.java new file mode 100644 index 000000000..bed2ec008 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/biome/service/BiomeServiceTest.java @@ -0,0 +1,52 @@ +package com.pokerogue.helper.biome.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.biome.dto.BiomeDetailResponse; +import com.pokerogue.helper.biome.dto.BiomeResponse; +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class BiomeServiceTest extends ServiceTest { + + @Autowired + private BiomeService biomeService; + + @Test + @DisplayName("전체 바이옴 리스트를 불러온다") + void findBoimes() { + List biomes = biomeService.findBiomes(); + + assertThat(biomes.size()).isEqualTo(35); + } + + @Test + @DisplayName("단일 바이옴 정보를 불러온다") + void findBiome() { + BiomeDetailResponse biomeDetailResponse = biomeService.findBiome("fairy_cave"); + + assertAll( + () -> assertThat(biomeDetailResponse.id()).isEqualTo("fairy_cave"), + () -> assertThat(biomeDetailResponse.name()).isEqualTo("페어리 동굴"), + () -> assertThat(biomeDetailResponse.wildPokemons()).hasSize(5), + () -> assertThat(biomeDetailResponse.bossPokemons()).hasSize(4), + () -> assertThat(biomeDetailResponse.trainerPokemons()).hasSize(3), + () -> assertThat(biomeDetailResponse.nextBiomes()).hasSize(2) + ); + } + + @Test + @DisplayName("해당 id의 바이옴이 없는 경우 예외를 발생시킨다") + void notExistBiome() { + assertThatThrownBy(() -> biomeService.findBiome("test")) + .isInstanceOf(GlobalCustomException.class) + .hasMessage(ErrorMessage.BIOME_NOT_FOUND.getMessage()); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/move/converter/MoveCategoryConverterTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/converter/MoveCategoryConverterTest.java index 23bc0313b..36ae52c5c 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/move/converter/MoveCategoryConverterTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/converter/MoveCategoryConverterTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.pokerogue.helper.battle.MoveCategory; +import com.pokerogue.helper.move.data.MoveCategory; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/move/repository/MoveRepositoryTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/repository/MoveRepositoryTest.java index 38a30f85f..74eeb1251 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/move/repository/MoveRepositoryTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/repository/MoveRepositoryTest.java @@ -4,9 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.pokerogue.environment.repository.MongoRepositoryTest; -import com.pokerogue.helper.battle.MoveCategory; -import com.pokerogue.helper.move.MoveRepository; import com.pokerogue.helper.move.data.Move; +import com.pokerogue.helper.move.data.MoveCategory; import com.pokerogue.helper.move.data.MoveFlag; import com.pokerogue.helper.move.data.MoveTarget; import com.pokerogue.helper.type.data.Type; diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/move/service/MoveServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/service/MoveServiceTest.java new file mode 100644 index 000000000..aeffda2f4 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/move/service/MoveServiceTest.java @@ -0,0 +1,54 @@ +package com.pokerogue.helper.move.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.move.dto.MoveResponse; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class MoveServiceTest extends ServiceTest { + + @Autowired + private MoveService moveService; + + @Test + @DisplayName("해당 포켓몬의 전체 기술 목록을 반환한다") + void findMovesByPokemon() { + List movesByPokemon = moveService.findMovesByPokemon(1); + + assertThat(movesByPokemon.size()).isEqualTo(72); + } + + @Test + @DisplayName("단일 기술 정보를 불러온다") + void findMove() { + MoveResponse moveResponse = moveService.findMove("earth_power"); + + assertAll( + () -> assertThat(moveResponse.id()).isEqualTo("earth_power"), + () -> assertThat(moveResponse.name()).isEqualTo("대지의힘"), + () -> assertThat(moveResponse.typeEngName()).isEqualTo("ground"), + () -> assertThat(moveResponse.typeLogo()).contains("type/ground"), + () -> assertThat(moveResponse.categoryEngName()).isEqualTo("special"), + () -> assertThat(moveResponse.categoryLogo()).contains("move-category/special.png"), + () -> assertThat(moveResponse.power()).isEqualTo(90), + () -> assertThat(moveResponse.accuracy()).isEqualTo(100), + () -> assertThat(moveResponse.effect()).isEqualTo("상대의 발밑에 대지의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다.") + ); + } + + @Test + @DisplayName("id에 해당하는 기술이 없는 경우 예외를 발생시킨다") + void notExistMove() { + assertThatThrownBy(() -> moveService.findMove("test")) + .isInstanceOf(GlobalCustomException.class) + .hasMessage(ErrorMessage.MOVE_NOT_FOUND.getMessage()); + } +}