diff --git a/.github/workflows/Backend-CI.yml b/.github/workflows/Backend-CI.yml index 90be3077..f3a3c1fd 100644 --- a/.github/workflows/Backend-CI.yml +++ b/.github/workflows/Backend-CI.yml @@ -28,7 +28,7 @@ jobs: - name: Remove Containers run: | docker ps -aq | xargs -r docker rm -vf - docker builder prune + docker system prune -a -f - name: Set up Test MongoDB working-directory: ./backend/pokerogue/src/main/resources/ diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/data/PokemonValidator.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/data/PokemonValidator.java index ae5f7fa1..1da817ee 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/data/PokemonValidator.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/data/PokemonValidator.java @@ -17,7 +17,7 @@ class PokemonValidator { - private static final int POKEMON_SIZE = 1446; + private static final int POKEMON_SIZE = 1453; private static final int MIN_GENERATION = 1; private static final int MAX_GENERATION = 9; private static final int MIN_TYPE_COUNT = 1; 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 index b8c990ca..b0b2f3c0 100644 --- 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 @@ -1,5 +1,6 @@ package com.pokerogue.helper.move.controller; +import com.pokerogue.helper.move.dto.MoveDetailResponse; import com.pokerogue.helper.move.dto.MoveResponse; import com.pokerogue.helper.move.service.MoveService; import com.pokerogue.helper.util.dto.ApiResponse; @@ -18,6 +19,11 @@ public class MoveController { private final MoveService moveService; + @GetMapping("/api/v1/move/dex") + public ApiResponse> moveList() { + return new ApiResponse<>("기술 리스트 불러오기에 성공했습니다.", moveService.findMoves()); + } + @GetMapping("/api/v1/moves") public ApiResponse> moveListByPokedexNumber(@RequestParam("pokedex-number") Integer pokedexNumber) { log.info( @@ -31,7 +37,7 @@ public ApiResponse> moveListByPokedexNumber(@RequestParam("po } @GetMapping("/api/v1/move/{id}") - public ApiResponse moveDetails(@PathVariable String id) { + public ApiResponse moveDetailsInBattle(@PathVariable String id) { log.info( "---- URI : {}, Param : {}, ThreadName : {}", "/api/v1/move/{id}", @@ -39,6 +45,18 @@ public ApiResponse moveDetails(@PathVariable String id) { Thread.currentThread().getName() ); - return new ApiResponse<>("포켓몬의 기술 불러오기에 성공했습니다.", moveService.findMove(id)); + return new ApiResponse<>("기술 정보 불러오기에 성공했습니다.", moveService.findMoveInBattle(id)); + } + + @GetMapping("/api/v1/move/dex/{id}") + public ApiResponse moveDetails(@PathVariable String id) { + log.info( + "---- URI : {}, Param : {}, ThreadName : {}", + "/api/v1/move/dex/{id}", + id, + Thread.currentThread().getName() + ); + + return new ApiResponse<>("기술 정보 불러오기에 성공했습니다.", moveService.findMove(id)); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveFlag.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveFlag.java index 78670be3..8ab99da7 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveFlag.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveFlag.java @@ -3,7 +3,9 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import java.util.Arrays; +import lombok.Getter; +@Getter public enum MoveFlag { NONE("none"), diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveTarget.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveTarget.java index ed098053..7c0d8801 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveTarget.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/data/MoveTarget.java @@ -3,7 +3,9 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; import java.util.Arrays; +import lombok.Getter; +@Getter public enum MoveTarget { USER("user"), diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveDetailResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveDetailResponse.java new file mode 100644 index 00000000..08e14792 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/move/dto/MoveDetailResponse.java @@ -0,0 +1,58 @@ +package com.pokerogue.helper.move.dto; + +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.type.data.Type; +import java.util.List; + +public record MoveDetailResponse( + String id, + String name, + String typeEngName, + String typeLogo, + String categoryEngName, + String categoryLogo, + String moveTarget, + Integer power, + Integer accuracy, + Integer powerPoint, + String effect, + Integer effectChance, + Integer priority, + Integer generation, + String released, + List flags, + List pokemonIdsWithLevelMove, + List pokemonIdsWithEggMove +) { + + public static MoveDetailResponse from(Move move, List levelMoveIdsContains, List eggMoveIdsContains) { + Type type = move.getType(); + MoveCategory moveCategory = move.getMoveCategory(); + List moveFlags = move.getFlags().stream() + .map(MoveFlag::getId) + .toList(); + + return new MoveDetailResponse( + move.getId(), + move.getKoName(), + type.getName(), + type.getImage(), + moveCategory.getEngName(), + moveCategory.getImage(), + move.getMoveTarget().getId(), + move.getPower(), + move.getAccuracy(), + move.getPowerPoint(), + move.getEffect(), + move.getEffectChance(), + move.getPriority(), + move.getGeneration(), + move.getReleased(), + moveFlags, + levelMoveIdsContains, + eggMoveIdsContains + ); + } +} 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 index adbea2d3..41e48abb 100644 --- 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 @@ -3,6 +3,7 @@ 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.MoveDetailResponse; import com.pokerogue.helper.move.dto.MoveResponse; import com.pokerogue.helper.move.repository.MoveRepository; import com.pokerogue.helper.pokemon.data.LevelMove; @@ -20,6 +21,12 @@ public class MoveService { private final PokemonRepository pokemonRepository; private final MoveRepository moveRepository; + public List findMoves() { + return moveRepository.findAll().stream() + .map(MoveResponse::from) + .toList(); + } + public List findMovesByPokemon(Integer pokedexNumber) { List pokemons = pokemonRepository.findByPokedexNumber(pokedexNumber); if (pokemons.isEmpty()) { @@ -51,11 +58,23 @@ private static List getAllMoveIds(Pokemon pokemon) { return allMoveIds; } - public MoveResponse findMove(String id) { + public MoveResponse findMoveInBattle(String id) { Move move = findMoveById(id); return MoveResponse.from(move); } + public MoveDetailResponse findMove(String id) { + Move move = findMoveById(id); + List eggMovePokemonIds = pokemonRepository.findByEggMoveIdsContains(move.getId()).stream() + .map(Pokemon::getId) + .toList(); + List levelMovePokemonIds = pokemonRepository.findByLevelMovesMoveId(move.getId()).stream() + .map(Pokemon::getId) + .toList(); + + return MoveDetailResponse.from(move, levelMovePokemonIds, eggMovePokemonIds); + } + 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/repository/PokemonRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonRepository.java index 05fc4d91..3bddbbc3 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 @@ -7,4 +7,8 @@ public interface PokemonRepository extends MongoRepository { List findByPokedexNumber(int pokedexNumber); + + List findByEggMoveIdsContains(String eggMoveIds); + + List findByLevelMovesMoveId(String moveId); } 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 74eeb125..16866bb5 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 @@ -25,7 +25,7 @@ void findAll_AndConvertToMove() { List moves = moveRepository.findAll(); assertAll( - () -> assertThat(moves).hasSize(920), + () -> assertThat(moves).hasSize(919), () -> assertThat(moves.stream() .allMatch(move -> move.getType() .getDeclaringClass() 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 index aeffda2f..5c870b58 100644 --- 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 @@ -7,8 +7,10 @@ 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.MoveDetailResponse; import com.pokerogue.helper.move.dto.MoveResponse; import java.util.List; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -27,9 +29,9 @@ void findMovesByPokemon() { } @Test - @DisplayName("단일 기술 정보를 불러온다") - void findMove() { - MoveResponse moveResponse = moveService.findMove("earth_power"); + @DisplayName("배틀 서비스에서 사용할 단일 기술 정보를 불러온다") + void findMoveByBattle() { + MoveResponse moveResponse = moveService.findMoveInBattle("earth_power"); assertAll( () -> assertThat(moveResponse.id()).isEqualTo("earth_power"), @@ -47,8 +49,44 @@ void findMove() { @Test @DisplayName("id에 해당하는 기술이 없는 경우 예외를 발생시킨다") void notExistMove() { - assertThatThrownBy(() -> moveService.findMove("test")) + assertThatThrownBy(() -> moveService.findMoveInBattle("test")) .isInstanceOf(GlobalCustomException.class) .hasMessage(ErrorMessage.MOVE_NOT_FOUND.getMessage()); } + + @Test + @DisplayName("전체 기술 목록을 반환한다") + void findMoves() { + List movesByPokemon = moveService.findMoves(); + + assertThat(movesByPokemon.size()).isEqualTo(919); + } + + @Disabled + @Test + @DisplayName("단일 기술 정보를 불러온다") + void findMove() { + MoveDetailResponse moveDetailResponse = moveService.findMove("earth_power"); + + assertAll( + () -> assertThat(moveDetailResponse.id()).isEqualTo("earth_power"), + () -> assertThat(moveDetailResponse.name()).isEqualTo("대지의힘"), + () -> assertThat(moveDetailResponse.typeEngName()).isEqualTo("ground"), + () -> assertThat(moveDetailResponse.typeLogo()).contains("type/ground"), + () -> assertThat(moveDetailResponse.categoryEngName()).isEqualTo("special"), + () -> assertThat(moveDetailResponse.categoryLogo()).contains("move-category/special.png"), + () -> assertThat(moveDetailResponse.moveTarget()).isEqualTo("near_other"), + () -> assertThat(moveDetailResponse.power()).isEqualTo(90), + () -> assertThat(moveDetailResponse.accuracy()).isEqualTo(100), + () -> assertThat(moveDetailResponse.powerPoint()).isEqualTo(10), + () -> assertThat(moveDetailResponse.effect()).isEqualTo("상대의 발밑에 대지의 힘을 방출한다. 상대의 특수방어를 떨어뜨릴 때가 있다."), + () -> assertThat(moveDetailResponse.effectChance()).isEqualTo(10), + () -> assertThat(moveDetailResponse.priority()).isEqualTo(0), + () -> assertThat(moveDetailResponse.generation()).isEqualTo(4), + () -> assertThat(moveDetailResponse.released()).isNull(), + () -> assertThat(moveDetailResponse.flags()).isEmpty(), + () -> assertThat(moveDetailResponse.pokemonIdsWithLevelMove()).hasSize(71), + () -> assertThat(moveDetailResponse.pokemonIdsWithEggMove()).hasSize(117) + ); + } }