diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeClient.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeClient.java deleted file mode 100644 index 34da4d076..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeClient.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.pokerogue.external.pokemon.client; - -import com.pokerogue.external.pokemon.dto.CountResponse; -import com.pokerogue.external.pokemon.dto.DataUrls; -import com.pokerogue.external.pokemon.dto.ability.AbilityResponse; -import com.pokerogue.external.pokemon.dto.pokemon.PokemonSaveResponse; -import com.pokerogue.external.pokemon.dto.pokemon.species.PokemonSpeciesResponse; -import com.pokerogue.external.pokemon.dto.type.TypeMatchingResponse; -import com.pokerogue.external.pokemon.dto.type.TypeResponse; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestClient; - -@Component -public class PokeClient { - - private static final String BASE_IMAGE_URL = "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon"; - - private final RestClient restClient; - - public PokeClient(RestClient restClient) { - this.restClient = restClient; - } - - public CountResponse getAbilityResponsesCount() { - return restClient.get() - .uri("/ability") - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(CountResponse.class); - } - - public DataUrls getAbilityResponses(int limit) { - return restClient.get() - .uri("/ability/?offset=0&limit={limit}", limit) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(DataUrls.class); - } - - public AbilityResponse getAbilityResponse(String id) { - return restClient.get() - .uri("/ability/{id}", id) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(AbilityResponse.class); - } - - public CountResponse getTypeResponsesCount() { - return restClient.get() - .uri("/type") - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(CountResponse.class); - } - - public DataUrls getTypeResponses(int limit) { - return restClient.get() - .uri("/type/?offset=0&limit={limit}", limit) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(DataUrls.class); - } - - public TypeResponse getTypeResponse(String id) { - return restClient.get() - .uri("/type/{id}", id) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(TypeResponse.class); - } - - public CountResponse getPokemonResponsesCount() { - return restClient.get() - .uri("/pokemon") - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(CountResponse.class); - } - - public DataUrls getPokemonResponses(int offset, int limit) { - return restClient.get() - .uri("/pokemon/?offset={offset}&limit={limit}", offset, limit) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(DataUrls.class); - } - - public PokemonSaveResponse getPokemonSaveResponse(String id) { - return restClient.get() - .uri("/pokemon/{id}", id) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(PokemonSaveResponse.class); - } - - public PokemonSpeciesResponse getPokemonSpeciesResponse(String id) { - return restClient.get() - .uri("/pokemon-species/{id}", id) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(PokemonSpeciesResponse.class); - } - - public TypeMatchingResponse getTypeMatchingResponse(String id) { - return restClient.get() - .uri("/type/{id}", id) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .body(TypeMatchingResponse.class); - } - - public byte[] getPixelImage(String id) { - return restClient.get() - .uri(BASE_IMAGE_URL + "/{id}.png", id) - .accept(MediaType.IMAGE_PNG) - .retrieve() - .body(byte[].class); - } - - public byte[] getArtImage(String id) { - return restClient.get() - .uri(BASE_IMAGE_URL + "/other/official-artwork/{id}.png", id) - .accept(MediaType.IMAGE_PNG) - .retrieve() - .body(byte[].class); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeRestClientConfig.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeRestClientConfig.java deleted file mode 100644 index 0f2753520..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/client/PokeRestClientConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pokerogue.external.pokemon.client; - -import org.springframework.boot.web.client.ClientHttpRequestFactories; -import org.springframework.boot.web.client.ClientHttpRequestFactorySettings; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.JdkClientHttpRequestFactory; -import org.springframework.web.client.RestClient; - -import java.time.Duration; - -@Configuration -public class PokeRestClientConfig { - - private static final String BASE_URL = "https://pokeapi.co/api/v2"; - private static final int CONNECT_TIME_OUT_DURATION = 3; - private static final int READ_TIME_OUT_DURATION = 30; - - @Bean - public RestClient restClient() { - return RestClient.builder() - .requestFactory(clientHttpRequestFactory()) - .baseUrl(BASE_URL) - .build(); - } - - private ClientHttpRequestFactory clientHttpRequestFactory() { - ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.DEFAULTS - .withConnectTimeout(Duration.ofSeconds(CONNECT_TIME_OUT_DURATION)) - .withReadTimeout(Duration.ofSeconds(READ_TIME_OUT_DURATION)); - - return ClientHttpRequestFactories.get(JdkClientHttpRequestFactory.class, settings); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/CountResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/CountResponse.java deleted file mode 100644 index 7a698599a..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/CountResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.external.pokemon.dto; - -// https://pokeapi.co/api/v2/{type, ability, pokemon} -// 해당 항목의 갯수를 받아오는 Dto -public record CountResponse(int count) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrl.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrl.java deleted file mode 100644 index f85e9f8c6..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrl.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pokerogue.external.pokemon.dto; - -public record DataUrl(String name, String url) { - - public String getUrlId() { - String[] tokens = url().split("/"); - return tokens[tokens.length - 1]; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrls.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrls.java deleted file mode 100644 index ab380a072..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/DataUrls.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pokerogue.external.pokemon.dto; - -import java.util.List; - -// https://pokeapi.co/api/v2/{type, ability, pokemon}/?offset=0&limit={count} -// 해당 항목의 전체 리스트를 받아오는 Dto -public record DataUrls(List results) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Language.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Language.java deleted file mode 100644 index 549c9e667..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Language.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pokerogue.external.pokemon.dto; - -public record Language(String name) { - - public boolean isKorean() { - return name.equals("ko"); - } - - public boolean isEnglish() { - return name.equals("en"); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Name.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Name.java deleted file mode 100644 index 3eede8fba..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/Name.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pokerogue.external.pokemon.dto; - -public record Name(Language language, String name) { - - public boolean isKorean() { - return language.isKorean(); - } - - public boolean isEnglish() { - return language.isEnglish(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/AbilityResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/AbilityResponse.java deleted file mode 100644 index c1b2f2d79..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/AbilityResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pokerogue.external.pokemon.dto.ability; - -import com.pokerogue.external.pokemon.dto.Name; -import java.util.List; - -// https://pokeapi.co/api/v2/ability/{id} -// 해당 id의 특성을 받아오는 Dto -public record AbilityResponse( - List flavor_text_entries, - String name, - List names, - List pokemon -) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/FlavorTextEntry.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/FlavorTextEntry.java deleted file mode 100644 index 183731ae1..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/FlavorTextEntry.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.external.pokemon.dto.ability; - -import com.pokerogue.external.pokemon.dto.Language; - -public record FlavorTextEntry(String flavor_text, Language language) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/PokemonSummary.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/PokemonSummary.java deleted file mode 100644 index f929b12e7..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/ability/PokemonSummary.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.external.pokemon.dto.ability; - -import com.pokerogue.external.pokemon.dto.DataUrl; - -public record PokemonSummary(DataUrl pokemon) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/AbilityDataUrl.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/AbilityDataUrl.java deleted file mode 100644 index 16fc0566b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/AbilityDataUrl.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon; - -import com.pokerogue.external.pokemon.dto.DataUrl; - -public record AbilityDataUrl(DataUrl ability) { - - public String getName() { - return ability.name(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonDetail.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonDetail.java deleted file mode 100644 index 678271ebb..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonDetail.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon; - -import com.pokerogue.external.pokemon.dto.DataUrl; - -public record PokemonDetail( - String name, - double weight, - double height, - DataUrl species, - int hp, - int attack, - int defense, - int speed, - int specialAttack, - int specialDefense, - int totalStats -) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonSaveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonSaveResponse.java deleted file mode 100644 index b8b77c555..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/PokemonSaveResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon; - -import com.pokerogue.external.pokemon.dto.DataUrl; -import java.util.List; - -// https://pokeapi.co/api/v2/pokemon/{id} -// 해당 id의 포켓몬을 받아오는 Dto -public record PokemonSaveResponse( - int height, - int weight, - String name, - List abilities, - List types, - List stats, - DataUrl species -) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/StatDetail.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/StatDetail.java deleted file mode 100644 index 37867a9e9..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/StatDetail.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon; - -import com.pokerogue.external.pokemon.dto.DataUrl; - -public record StatDetail(int base_stat, DataUrl stat) { - - public String getStatName() { - return stat.name(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/TypeDataUrl.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/TypeDataUrl.java deleted file mode 100644 index 3292a9eaa..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/TypeDataUrl.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon; - -import com.pokerogue.external.pokemon.dto.DataUrl; - -public record TypeDataUrl(DataUrl type) { - - public String getName() { - return type.name(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonNameAndDexNumber.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonNameAndDexNumber.java deleted file mode 100644 index 0172d4a0b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonNameAndDexNumber.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon.species; - -public record PokemonNameAndDexNumber(Long pokedexNumber, String koName) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonSpeciesResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonSpeciesResponse.java deleted file mode 100644 index eb2965786..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/pokemon/species/PokemonSpeciesResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pokerogue.external.pokemon.dto.pokemon.species; - -import com.pokerogue.external.pokemon.dto.Name; -import java.util.List; - -// https://pokeapi.co/api/v2/pokemon-species/{id} -// 해당 id의 포켓몬 종 특성을 받아오는 Dto -public record PokemonSpeciesResponse(String name, List names, Long id) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/DamageRelations.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/DamageRelations.java deleted file mode 100644 index 60a27937a..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/DamageRelations.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pokerogue.external.pokemon.dto.type; - -import com.pokerogue.external.pokemon.dto.DataUrl; -import java.util.List; - -public record DamageRelations( - List double_damage_to, - List half_damage_to, - List no_damage_to -) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeMatchingResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeMatchingResponse.java deleted file mode 100644 index b2790b2d0..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeMatchingResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pokerogue.external.pokemon.dto.type; - -import com.pokerogue.external.pokemon.dto.DataUrl; -import java.util.List; - -public record TypeMatchingResponse(DamageRelations damage_relations) { - - public List getDoubleDamageTo() { - return damage_relations.double_damage_to(); - } - - public List getHalfDamageTo() { - return damage_relations.half_damage_to(); - } - - public List getNoDamageTo() { - return damage_relations.no_damage_to(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeResponse.java deleted file mode 100644 index 59b271ef1..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/dto/type/TypeResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pokerogue.external.pokemon.dto.type; - -import com.pokerogue.external.pokemon.dto.Name; -import java.util.List; - -// https://pokeapi.co/api/v2/type/{id} -// 해당 id의 타입을 받아오는 Dto -public record TypeResponse(String name, List names) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/parser/DtoParser.java b/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/parser/DtoParser.java deleted file mode 100644 index b0d735dd3..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/external/pokemon/parser/DtoParser.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.pokerogue.external.pokemon.parser; - -import com.pokerogue.external.pokemon.dto.DataUrl; -import com.pokerogue.external.pokemon.dto.Name; -import com.pokerogue.external.pokemon.dto.ability.AbilityResponse; -import com.pokerogue.external.pokemon.dto.ability.FlavorTextEntry; -import com.pokerogue.external.pokemon.dto.pokemon.PokemonDetail; -import com.pokerogue.external.pokemon.dto.pokemon.PokemonSaveResponse; -import com.pokerogue.external.pokemon.dto.pokemon.StatDetail; -import com.pokerogue.external.pokemon.dto.pokemon.species.PokemonNameAndDexNumber; -import com.pokerogue.external.pokemon.dto.pokemon.species.PokemonSpeciesResponse; -import com.pokerogue.external.pokemon.dto.type.TypeResponse; -import com.pokerogue.helper.ability.domain.PokemonAbility; -import com.pokerogue.helper.type.domain.PokemonType; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.springframework.stereotype.Component; - -@Component -public class DtoParser { - - private static final String NOT_EXIST_IN_API_RESPONSE = "존재하지 않습니다"; - - public PokemonAbility getPokemonAbility(AbilityResponse abilityResponse) { - String koName = getPossibleName(abilityResponse.names()); - - List flavorTextEntries = abilityResponse.flavor_text_entries(); - String description = getPossibleDescription(flavorTextEntries).replace("\n", " "); - - return new PokemonAbility(abilityResponse.name(), koName, description, "자세한 설명입니다."); - } - - private String getPossibleDescription(List flavorTextEntries) { - return flavorTextEntries.stream() - .sorted(Comparator.comparingInt(flavorTextEntries::indexOf).reversed()) - .filter(entry -> entry.language().isKorean()) - .map(FlavorTextEntry::flavor_text) - .findFirst() - .orElseGet(() -> getEnDescription(flavorTextEntries)); - } - - private String getEnDescription(List flavorTextEntries) { - return flavorTextEntries.stream() - .sorted(Comparator.comparingInt(flavorTextEntries::indexOf).reversed()) - .filter(entry -> entry.language().isEnglish()) - .map(FlavorTextEntry::flavor_text) - .findFirst() - .orElse(NOT_EXIST_IN_API_RESPONSE); - } - - public PokemonType getPokemonType(TypeResponse typeResponse, String typeImage) { - String koName = getPossibleName(typeResponse.names()); - - return new PokemonType(typeResponse.name(), koName, typeImage); - } - - public PokemonDetail getPokemonDetails(PokemonSaveResponse pokemonSaveResponse) { - double height = pokemonSaveResponse.height() * 1.0 / 10; - double weight = pokemonSaveResponse.weight() * 1.0 / 10; - DataUrl species = pokemonSaveResponse.species(); - List statDetails = pokemonSaveResponse.stats(); - Map stat = getStat(statDetails); - - return new PokemonDetail(pokemonSaveResponse.name(), weight, height, species, stat.get("hp"), - stat.get("attack"), stat.get("defense"), stat.get("speed"), stat.get("special-attack"), - stat.get("special-defense"), stat.get("total-stats")); - } - - private Map getStat(List statDetails) { - Map stats = statDetails.stream() - .collect(Collectors.toMap(StatDetail::getStatName, StatDetail::base_stat)); - - int totalStats = stats.values().stream() - .mapToInt(Integer::intValue) - .sum(); - stats.put("total-stats", totalStats); - - return stats; - } - - public PokemonNameAndDexNumber getPokemonNameAndDexNumber(PokemonSpeciesResponse pokemonSpeciesResponse) { - String koName = getPossibleName(pokemonSpeciesResponse.names()); - - return new PokemonNameAndDexNumber(pokemonSpeciesResponse.id(), koName); - } - - private String getPossibleName(List names) { - return names.stream() - .filter(Name::isKorean) - .map(Name::name) - .findFirst() - .orElseGet(() -> getEnName(names)); - } - - private String getEnName(List names) { - return names.stream() - .filter(Name::isEnglish) - .map(Name::name) - .findFirst() - .orElse(NOT_EXIST_IN_API_RESPONSE); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/controller/AbilityController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/AbilityController.java similarity index 76% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/controller/AbilityController.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/AbilityController.java index 82d68bacd..bab16c4a8 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/controller/AbilityController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/AbilityController.java @@ -1,8 +1,8 @@ -package com.pokerogue.helper.ability2.controller; +package com.pokerogue.helper.ability.controller; -import com.pokerogue.helper.ability2.dto.AbilityDetailResponse; -import com.pokerogue.helper.ability2.dto.AbilityResponse2; -import com.pokerogue.helper.ability2.service.AbilityService; +import com.pokerogue.helper.ability.dto.AbilityDetailResponse; +import com.pokerogue.helper.ability.dto.AbilityResponse; +import com.pokerogue.helper.ability.service.AbilityService; import com.pokerogue.helper.util.dto.ApiResponse; import java.util.List; import lombok.RequiredArgsConstructor; @@ -19,7 +19,7 @@ public class AbilityController { private final AbilityService abilityService; @GetMapping("/api/v1/abilities2") - public ApiResponse> abilityList() { + public ApiResponse> abilityList() { return new ApiResponse<>("특성 리스트 불러오기에 성공했습니다.", abilityService.findAbilities()); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/PokemonAbilityController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/PokemonAbilityController.java deleted file mode 100644 index 5c63c0ed5..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/controller/PokemonAbilityController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pokerogue.helper.ability.controller; - -import com.pokerogue.helper.ability.dto.PokemonAbilityResponse; -import com.pokerogue.helper.ability.dto.PokemonAbilityWithPokemonsResponse; -import com.pokerogue.helper.ability.service.PokemonAbilityService; -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.RestController; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class PokemonAbilityController { - - private final PokemonAbilityService pokemonAbilityService; - - @GetMapping("/api/v1/abilities") - public ApiResponse> abilityList() { - return new ApiResponse<>("특성 리스트 불러오기에 성공했습니다.", pokemonAbilityService.findAbilities()); - } - - @GetMapping("/api/v1/ability/{id}") - public ApiResponse abilityDetails(@PathVariable("id") Long id) { - log.info("---- URI : {}, Param : {}", "/api/v1/ability/{id}", id); - - return new ApiResponse<>("특성 정보 불러오기에 성공했습니다.", pokemonAbilityService.findAbilityDetails(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/Ability.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/Ability.java similarity index 64% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/Ability.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/Ability.java index 1d740c73f..f1406984f 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/Ability.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/Ability.java @@ -1,5 +1,6 @@ -package com.pokerogue.helper.ability2.data; +package com.pokerogue.helper.ability.data; +import com.pokerogue.helper.pokemon.data.Pokemon; import java.util.List; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -11,5 +12,5 @@ public class Ability { private final String id; private final String name; private final String description; - private final List pokemons; + private final List pokemons; } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityInfo.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/AbilityInfo.java similarity index 88% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityInfo.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/AbilityInfo.java index 35bbc0cf8..9041aa682 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityInfo.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/data/AbilityInfo.java @@ -1,8 +1,7 @@ -package com.pokerogue.helper.ability2.data; +package com.pokerogue.helper.ability.data; import java.util.List; import lombok.Getter; -import lombok.RequiredArgsConstructor; @Getter public class AbilityInfo { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/domain/PokemonAbility.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/domain/PokemonAbility.java deleted file mode 100644 index ed07367cb..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/domain/PokemonAbility.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pokerogue.helper.ability.domain; - -import com.pokerogue.helper.pokemon.domain.PokemonAbilityMapping; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import java.util.Set; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "pokemon_ability") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PokemonAbility { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "name", nullable = false, unique = true) - private String name; - - @Column(name = "ko_name", nullable = false) - private String koName; - - @Column(name = "description", nullable = false) - private String description; - - @Column(name = "detail_description", nullable = false) - private String detailDescription; - - @OneToMany(mappedBy = "pokemonAbility", fetch = FetchType.LAZY) - private Set pokemonAbilityMappings; - - public PokemonAbility(String name, String koName, String description, String detailDescription) { - this.name = name; - this.koName = koName; - this.description = description; - this.detailDescription = detailDescription; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityDetailResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityDetailResponse.java similarity index 79% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityDetailResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityDetailResponse.java index 69dbdef2e..2e7f88771 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityDetailResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityDetailResponse.java @@ -1,6 +1,6 @@ -package com.pokerogue.helper.ability2.dto; +package com.pokerogue.helper.ability.dto; -import com.pokerogue.helper.ability2.data.Ability; +import com.pokerogue.helper.ability.data.Ability; import java.util.List; public record AbilityDetailResponse( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityPokemonResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityPokemonResponse.java similarity index 83% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityPokemonResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityPokemonResponse.java index ac27e3f59..81e85c435 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityPokemonResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityPokemonResponse.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.ability2.dto; +package com.pokerogue.helper.ability.dto; import java.util.List; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityResponse.java new file mode 100644 index 000000000..97e2ca9c5 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityResponse.java @@ -0,0 +1,10 @@ +package com.pokerogue.helper.ability.dto; + +import com.pokerogue.helper.ability.data.Ability; + +public record AbilityResponse(String id, String koName, String description) { + + public static AbilityResponse from(Ability ability) { + return new AbilityResponse(ability.getId(), ability.getName(), ability.getDescription()); + } +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityTypeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityTypeResponse.java similarity index 62% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityTypeResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityTypeResponse.java index 3375f7c97..cb9c8657e 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityTypeResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/AbilityTypeResponse.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.ability2.dto; +package com.pokerogue.helper.ability.dto; public record AbilityTypeResponse(String typeLogo, String typeName) { } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityResponse.java deleted file mode 100644 index 162c962a6..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pokerogue.helper.ability.dto; - -import com.pokerogue.helper.ability.domain.PokemonAbility; - -public record PokemonAbilityResponse(Long id, String koName, String description) { - - public static PokemonAbilityResponse from(PokemonAbility pokemonAbility) { - return new PokemonAbilityResponse(pokemonAbility.getId(), pokemonAbility.getKoName(), - pokemonAbility.getDescription()); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityWithPokemonsResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityWithPokemonsResponse.java deleted file mode 100644 index 15abaf7b6..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/PokemonAbilityWithPokemonsResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.helper.ability.dto; - -import java.util.List; - -public record PokemonAbilityWithPokemonsResponse(String koName, String description, List pokemons) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/SameAbilityPokemonResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/SameAbilityPokemonResponse.java deleted file mode 100644 index 03b06c4d9..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/dto/SameAbilityPokemonResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pokerogue.helper.ability.dto; - -import com.pokerogue.helper.pokemon.domain.Pokemon; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import java.util.List; - -public record SameAbilityPokemonResponse( - Long id, - Long pokedexNumber, - String koName, - String image, - List pokemonTypeResponses -) { - public static SameAbilityPokemonResponse from(Pokemon pokemon, List pokemonTypeResponses) { - Long id = pokemon.getId(); - Long pokedexNumber = pokemon.getPokedexNumber(); - String koName = pokemon.getKoName(); - String image = pokemon.getImage(); - - return new SameAbilityPokemonResponse(id, pokedexNumber, koName, image, pokemonTypeResponses); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/repository/AbilityRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/AbilityRepository.java similarity index 77% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/repository/AbilityRepository.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/AbilityRepository.java index a9d94c89b..8d240bb3a 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/repository/AbilityRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/AbilityRepository.java @@ -1,13 +1,11 @@ -package com.pokerogue.helper.ability2.repository; +package com.pokerogue.helper.ability.repository; -import com.pokerogue.helper.ability2.data.Ability; -import com.pokerogue.helper.biome.data.Biome; +import com.pokerogue.helper.ability.data.Ability; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.springframework.aop.target.LazyInitTargetSource; import org.springframework.stereotype.Repository; @Repository diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/PokemonAbilityRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/PokemonAbilityRepository.java deleted file mode 100644 index 1fa862358..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/repository/PokemonAbilityRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pokerogue.helper.ability.repository; - -import com.pokerogue.helper.ability.domain.PokemonAbility; -import io.micrometer.common.lang.NonNull; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -public interface PokemonAbilityRepository extends JpaRepository { - - @NonNull - @Query(""" - select pa from PokemonAbility pa - left join fetch pa.pokemonAbilityMappings pam - left join fetch pam.pokemon p - left join fetch p.pokemonTypeMappings ptm - left join fetch ptm.pokemonType pt - where pa.id = :id - """) - Optional findByIdWithPokemonAndPokemonTypes(@NonNull @Param("id") Long id); -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/service/AbilityService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/AbilityService.java similarity index 61% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/service/AbilityService.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/AbilityService.java index ec4c838b1..ba7ec3ac2 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/service/AbilityService.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/AbilityService.java @@ -1,12 +1,12 @@ -package com.pokerogue.helper.ability2.service; +package com.pokerogue.helper.ability.service; import com.pokerogue.external.s3.service.S3Service; -import com.pokerogue.helper.ability2.data.Ability; -import com.pokerogue.helper.ability2.dto.AbilityDetailResponse; -import com.pokerogue.helper.ability2.dto.AbilityPokemonResponse; -import com.pokerogue.helper.ability2.dto.AbilityResponse2; -import com.pokerogue.helper.ability2.dto.AbilityTypeResponse; -import com.pokerogue.helper.ability2.repository.AbilityRepository; +import com.pokerogue.helper.ability.data.Ability; +import com.pokerogue.helper.ability.dto.AbilityDetailResponse; +import com.pokerogue.helper.ability.dto.AbilityPokemonResponse; +import com.pokerogue.helper.ability.dto.AbilityResponse; +import com.pokerogue.helper.ability.dto.AbilityTypeResponse; +import com.pokerogue.helper.ability.repository.AbilityRepository; import com.pokerogue.helper.battle.Type; import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; @@ -22,9 +22,9 @@ public class AbilityService { private final S3Service s3Service; private final AbilityRepository abilityRepository; - public List findAbilities() { + public List findAbilities() { return abilityRepository.findAll().stream() - .map(AbilityResponse2::from) + .map(AbilityResponse::from) .toList(); } @@ -33,28 +33,28 @@ public AbilityDetailResponse findAbilityDetails(String id) { .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); List abilityPokemonResponses = ability.getPokemons().stream() .map(abilityPokemon -> new AbilityPokemonResponse( - abilityPokemon.getId(), - abilityPokemon.getPokedexNumber(), - abilityPokemon.getName(), - s3Service.getPokemonImageFromS3(abilityPokemon.getId()), - getAbilityTypeResponses(abilityPokemon.getType1(), abilityPokemon.getType2()) + abilityPokemon.id(), + Long.parseLong(abilityPokemon.speciesId()), + abilityPokemon.koName(), + s3Service.getPokemonImageFromS3(abilityPokemon.id()), + getAbilityTypeResponses(abilityPokemon.firstType(), abilityPokemon.secondType()) )) .toList(); return AbilityDetailResponse.of(ability, abilityPokemonResponses); } - private List getAbilityTypeResponses(String type1, String type2) { + private List getAbilityTypeResponses(String firstType, String secondType) { List abilityTypeResponses = new ArrayList<>(); - if (!type1.equals("Type.undefined")) { - abilityTypeResponses.add(new AbilityTypeResponse(Type.findByName(type1) + if (!firstType.equals("Type.undefined") && !firstType.isEmpty()) { + abilityTypeResponses.add(new AbilityTypeResponse(Type.findByEngName(firstType) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)).getImage(), - type1)); + firstType)); } - if (!type2.equals("Type.undefined")) { - abilityTypeResponses.add(new AbilityTypeResponse(Type.findByName(type2) + if (!secondType.equals("Type.undefined") && !secondType.isEmpty()) { + abilityTypeResponses.add(new AbilityTypeResponse(Type.findByEngName(secondType) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)).getImage(), - type2)); + secondType)); } return abilityTypeResponses; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/PokemonAbilityService.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/PokemonAbilityService.java deleted file mode 100644 index ece595a8e..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability/service/PokemonAbilityService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.pokerogue.helper.ability.service; - -import com.pokerogue.helper.ability.domain.PokemonAbility; -import com.pokerogue.helper.ability.dto.PokemonAbilityResponse; -import com.pokerogue.helper.ability.dto.PokemonAbilityWithPokemonsResponse; -import com.pokerogue.helper.ability.dto.SameAbilityPokemonResponse; -import com.pokerogue.helper.ability.repository.PokemonAbilityRepository; -import com.pokerogue.helper.global.exception.ErrorMessage; -import com.pokerogue.helper.global.exception.GlobalCustomException; -import com.pokerogue.helper.pokemon.domain.Pokemon; -import com.pokerogue.helper.pokemon.domain.PokemonAbilityMapping; -import com.pokerogue.helper.type.domain.PokemonType; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class PokemonAbilityService { - - private final PokemonAbilityRepository pokemonAbilityRepository; - - public List findAbilities() { - List pokemonAbilities = pokemonAbilityRepository.findAll(); - - return pokemonAbilities.stream() - .map(PokemonAbilityResponse::from) - .toList(); - } - - public PokemonAbilityWithPokemonsResponse findAbilityDetails(Long id) { - PokemonAbility ability = pokemonAbilityRepository.findByIdWithPokemonAndPokemonTypes(id) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); - - List pokemons = ability.getPokemonAbilityMappings().stream() - .map(PokemonAbilityMapping::getPokemon) - .distinct() - .sorted(Comparator.comparingLong(Pokemon::getId)) - .toList(); - List pokemonResponses = toSameAbilityPokemonResponses(pokemons); - - return new PokemonAbilityWithPokemonsResponse(ability.getKoName(), ability.getDescription(), pokemonResponses); - } - - private List toSameAbilityPokemonResponses(List pokemons) { - Map> pokemonTypeMappings = mapTypeWithPokemons(pokemons); - - return pokemons.stream() - .map(pokemon -> SameAbilityPokemonResponse.from(pokemon, - toPokemonTypeResponse(pokemonTypeMappings.get(pokemon)))) - .toList(); - } - - private Map> mapTypeWithPokemons(List pokemons) { - return pokemons.stream() - .collect(Collectors.toMap(Function.identity(), Pokemon::getSortedPokemonTypes)); - } - - private List toPokemonTypeResponse(List pokemonTypes) { - return pokemonTypes.stream() - .map(PokemonTypeResponse::from) - .toList(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/config/AbilityDatabaseInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/config/AbilityDatabaseInitializer.java deleted file mode 100644 index 6d5ad129f..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/config/AbilityDatabaseInitializer.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.pokerogue.helper.ability2.config; - -import com.pokerogue.helper.ability2.data.Ability; -import com.pokerogue.helper.ability2.data.AbilityInfo; -import com.pokerogue.helper.ability2.data.AbilityPokemon; -import com.pokerogue.helper.ability2.data.AbilityPokemonInfo; -import com.pokerogue.helper.ability2.repository.AbilityRepository; -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.List; -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 AbilityDatabaseInitializer implements ApplicationRunner { - - private final AbilityRepository abilityRepository; - - @Override - public void run(ApplicationArguments args) { - List abilityInfos = new ArrayList<>(); - List abilityPokemonInfos = new ArrayList<>(); - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("ability.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String abilityInfo = bufferedReader.readLine(); - if (abilityInfo == null) { - break; - } - abilityInfos.add(new AbilityInfo(abilityInfo)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("ability-pokemon.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String abilityPokemonInfo = bufferedReader.readLine(); - if (abilityPokemonInfo == null) { - break; - } - abilityPokemonInfos.add(new AbilityPokemonInfo(abilityPokemonInfo)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - - abilityInfos.stream() - .map(abilityInfo -> new Ability( - abilityInfo.getId(), - abilityInfo.getName(), - abilityInfo.getDescription(), - getAbilityPokemon(abilityPokemonInfos, abilityInfo.getPokemons(), abilityInfo.getPokedexNumbers())) - ).forEach(abilityRepository::save); - } - - private List getAbilityPokemon(List abilityPokemonInfos, List pokemons, List pokedexNumbers) { - List abilityPokemons = new ArrayList<>(); - for (int i = 0; i < pokemons.size(); i++) { - String pokemonId = pokemons.get(i); - - AbilityPokemonInfo abilityPokemon = abilityPokemonInfos.stream() - .filter(abilityPokemonInfo -> abilityPokemonInfo.getId().equals(pokemonId)) - .findFirst() - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - - abilityPokemons.add(new AbilityPokemon( - pokemons.get(i), - Long.parseLong(pokedexNumbers.get(i)), - abilityPokemon.getName(), - abilityPokemon.getType1(), - abilityPokemon.getType2()) - ); - } - - return abilityPokemons; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemon.java deleted file mode 100644 index bb1dcd349..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemon.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pokerogue.helper.ability2.data; - -import com.pokerogue.helper.biome.data.BiomePokemonType; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class AbilityPokemon { - - private final String id; - private final Long pokedexNumber; - private final String name; - private final String type1; - private final String type2; -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemonInfo.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemonInfo.java deleted file mode 100644 index 6a0746c75..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/data/AbilityPokemonInfo.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pokerogue.helper.ability2.data; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -public class AbilityPokemonInfo { - - private final String id; - private final String type1; - private final String type2; - private final String name; - - public AbilityPokemonInfo(String abilityPokemonInfo) { - String[] abilityPokemonInfos = abilityPokemonInfo.split(" / "); - this.id = abilityPokemonInfos[0]; - this.type1 = abilityPokemonInfos[1]; - this.type2 = abilityPokemonInfos[2]; - this.name = abilityPokemonInfos[3]; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityResponse2.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityResponse2.java deleted file mode 100644 index f486ebff5..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/ability2/dto/AbilityResponse2.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pokerogue.helper.ability2.dto; - -import com.pokerogue.helper.ability2.data.Ability; - -public record AbilityResponse2(String id, String koName, String description) { - - public static AbilityResponse2 from(Ability ability) { - return new AbilityResponse2(ability.getId(), ability.getName(), ability.getDescription()); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemon.java deleted file mode 100644 index b3cd52532..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemon.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.List; - -public record BattlePokemon(String id, List pokemonTypes) { - - public boolean hasSameType(Type type) { - return this.pokemonTypes.stream() - .anyMatch(pokemonType -> pokemonType.equals(type)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemonRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemonRepository.java deleted file mode 100644 index 5950af987..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/BattlePokemonRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class BattlePokemonRepository { - - private final Map battlePokemons = new HashMap<>(); - - public void save(BattlePokemon battlePokemon) { - battlePokemons.put(battlePokemon.id(), battlePokemon); - } - - public List findAll() { - return battlePokemons.values() - .stream() - .toList(); - } - - public Optional findById(String id) { - return Optional.ofNullable(battlePokemons.get(id)); - } -} 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 93f645220..11720e642 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,9 +2,13 @@ import com.pokerogue.helper.global.exception.ErrorMessage; import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; 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; @@ -13,31 +17,71 @@ public class BattleService { private final BattleMoveRepository battleMoveRepository; - private final PokemonMovesByEggRepository pokemonMovesByEggRepository; - private final PokemonMovesBySelfRepository pokemonMovesBySelfRepository; - private final PokemonMovesByMachineRepository pokemonMovesByMachineRepository; - private final BattlePokemonRepository battlePokemonRepository; + private final PokemonRepository pokemonRepository; private final TypeMatchingRepository 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<>(); + Pokemon pokemon = pokemonRepository.findById(pokemonId) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); + + List moves = new ArrayList<>(); + for (int i = 0; i < pokemon.moves().size(); i++) { + if (i % 2 == 0) { + moves.add(pokemon.moves().get(i)); + } + } + allMoveIds.addAll(moves); + allMoveIds.addAll(pokemon.technicalMachineMoves()); + allMoveIds.addAll(pokemon.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 (Pokemon pokemon : pokemonRepository.findAll().values()) { + int pokemonId = Integer.parseInt(pokemon.speciesId()); + if (!findByDexnumberCache.containsKey(pokemonId)) { + findByDexnumberCache.put(pokemonId, makeMoveResponse(pokemon)); + } + } + } + + private List makeMoveResponse(Pokemon pokemon) { List allMoveIds = new ArrayList<>(); - PokemonMovesBySelf pokemonMovesBySelf = pokemonMovesBySelfRepository.findByPokedexNumber(pokedexNumber) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_BY_SELF_NOT_FOUND)); - PokemonMovesByMachine pokemonMovesByMachine = pokemonMovesByMachineRepository.findByPokedexNumber(pokedexNumber) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_BY_MACHINE_NOT_FOUND)); - PokemonMovesByEgg pokemonMovesByEgg = pokemonMovesByEggRepository.findByPokedexNumber(pokedexNumber) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_BY_EGG_NOT_FOUND)); - - allMoveIds.addAll(pokemonMovesBySelf.moveIds()); - allMoveIds.addAll(pokemonMovesByMachine.moveIds()); - allMoveIds.addAll(pokemonMovesByEgg.moveIds()); + List moves = new ArrayList<>(); + for (int i = 0; i < pokemon.moves().size(); i++) { + if (i % 2 == 0) { + moves.add(pokemon.moves().get(i)); + } + } + allMoveIds.addAll(moves); + allMoveIds.addAll(pokemon.technicalMachineMoves()); + allMoveIds.addAll(pokemon.eggMoves()); List battleMoves = allMoveIds.stream() + .distinct() .map(this::findMoveById) .toList(); @@ -58,9 +102,9 @@ public BattleResultResponse calculateBattleResult( String myMoveId) { Weather weather = Weather.findById(weatherId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.WEATHER_NOT_FOUND)); - BattlePokemon myPokemon = battlePokemonRepository.findById(myPokemonId) + Pokemon myPokemon = pokemonRepository.findById(myPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - BattlePokemon rivalPokemon = battlePokemonRepository.findById(rivalPokemonId) + Pokemon rivalPokemon = pokemonRepository.findById(rivalPokemonId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); BattleMove move = battleMoveRepository.findById(myMoveId) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_CATEGORY_NOT_FOUND)); @@ -91,16 +135,25 @@ private double calculateAccuracy(BattleMove move, Weather weather) { private double getTotalMultiplier( BattleMove move, Weather weather, - BattlePokemon rivalPokemon, - BattlePokemon myPokemon) { + Pokemon rivalPokemon, + Pokemon myPokemon) { if (!move.isAttackMove()) { return 1; } Type moveType = move.type(); double weatherMultiplier = getWeatherMultiplier(moveType, weather); - double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, rivalPokemon.pokemonTypes()); + List types = new ArrayList<>(); + if (!rivalPokemon.firstType().isEmpty()) { + types.add(Type.findByEngName(rivalPokemon.firstType()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND))); + } + if (!rivalPokemon.secondType().isEmpty()) { + types.add(Type.findByEngName(rivalPokemon.secondType()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND))); + } + double typeMatchingMultiplier = getTypeMatchingMultiplier(moveType, types); double sameTypeBonusMultiplier = getSameTypeAttackBonusMultiplier(moveType, myPokemon); - double stringWindMultiplier = getStringWindMultiplier(moveType, rivalPokemon.pokemonTypes(), weather); + double stringWindMultiplier = getStringWindMultiplier(moveType, types, weather); return weatherMultiplier * typeMatchingMultiplier * sameTypeBonusMultiplier * stringWindMultiplier; } @@ -140,7 +193,7 @@ private double getTypeMatchingMultiplier(Type moveType, List rivalPokemonT .reduce(1d, (a, b) -> a * b); } - private double getSameTypeAttackBonusMultiplier(Type moveType, BattlePokemon rivalPokemon) { + private double getSameTypeAttackBonusMultiplier(Type moveType, Pokemon rivalPokemon) { if (rivalPokemon.hasSameType(moveType)) { return 1.5; } 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 b79bdc60a..e6da24a76 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 @@ -6,7 +6,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; @@ -26,31 +25,15 @@ public class DataInitializer implements ApplicationRunner { private static final String LIST_DELIMITER = ","; private final BattleMoveRepository battleMoveRepository; - private final PokemonMovesByMachineRepository pokemonMovesByMachineRepository; - private final PokemonMovesBySelfRepository pokemonMovesBySelfRepository; - private final PokemonMovesByEggRepository pokemonMovesByEggRepository; - private final BattlePokemonRepository battlePokemonRepository; private final TypeMatchingRepository typeMatchingRepository; @Override public void run(ApplicationArguments args) { - saveData("battle-move.txt", fields -> { + saveData("data/battle/battle-move.txt", fields -> { BattleMove battleMove = createMove(fields); battleMoveRepository.save(battleMove); }); - saveData("tms.txt", fields -> { - PokemonMovesByMachine pokemonMovesByMachine = createPokemonMovesByMachine(fields); - pokemonMovesByMachineRepository.save(pokemonMovesByMachine); - }); - saveData("battle-pokemon.txt", fields -> { - PokemonMovesBySelf pokemonMovesBySelf = createPokemonMovesBySelf(fields); - pokemonMovesBySelfRepository.save(pokemonMovesBySelf); - PokemonMovesByEgg pokemonMovesByEgg = createPokemonMovesByEgg(fields); - pokemonMovesByEggRepository.save(pokemonMovesByEgg); - BattlePokemon battlePokemon = createBattlePokemon(fields); - battlePokemonRepository.save(battlePokemon); - }); - saveData("type-matching.txt", fields -> { + saveData("data/battle/type-matching.txt", fields -> { TypeMatching typeMatching = createTypeMatching(fields); typeMatchingRepository.save(typeMatching); }); @@ -113,53 +96,6 @@ private BattleMove createMove(List fields) { ); } - private PokemonMovesByMachine createPokemonMovesByMachine(List fields) { - Integer pokedexNumber = convertToInteger(fields.get(0)); - List moveIds = Arrays.stream(fields.get(2).split(LIST_DELIMITER)) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .toList(); - - return new PokemonMovesByMachine(pokedexNumber, moveIds); - } - - private PokemonMovesBySelf createPokemonMovesBySelf(List fields) { - Integer pokedexNumber = convertToInteger(fields.get(0)); - List moveIds = Arrays.stream(fields.get(5).split(LIST_DELIMITER)) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .toList(); - - return new PokemonMovesBySelf(pokedexNumber, moveIds); - } - - private PokemonMovesByEgg createPokemonMovesByEgg(List fields) { - Integer pokedexNumber = convertToInteger(fields.get(0)); - List moveIds = Arrays.stream(fields.get(4).split(LIST_DELIMITER)) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .toList(); - - return new PokemonMovesByEgg(pokedexNumber, moveIds); - } - - private BattlePokemon createBattlePokemon(List fields) { - String id = fields.get(1); - List types = new ArrayList<>(); - if (existTypeName(fields.get(2))) { - Type type = Type.findByName(fields.get(2)) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - types.add(type); - } - if (existTypeName(fields.get(3))) { - Type type = Type.findByName(fields.get(3)) - .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); - types.add(type); - } - - return new BattlePokemon(id, types); - } - private TypeMatching createTypeMatching(List fields) { Type fromType = Type.findByEngName(fields.get(0)) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_TYPE_NOT_FOUND)); @@ -170,10 +106,6 @@ private TypeMatching createTypeMatching(List fields) { return new TypeMatching(fromType, toType, result); } - private boolean existTypeName(String data) { - return !data.equals("Type.undefined"); - } - private double convertToDouble(String data) { try { return Double.parseDouble(data); diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEgg.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEgg.java deleted file mode 100644 index f62d2aaa7..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEgg.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.List; - -public record PokemonMovesByEgg(Integer pokedexNumber, List moveIds) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEggRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEggRepository.java deleted file mode 100644 index 1a1aacd5e..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByEggRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class PokemonMovesByEggRepository { - - private final Map pokemonsMovesByEgg = new HashMap<>(); - - public void save(PokemonMovesByEgg pokemonMovesByEgg) { - pokemonsMovesByEgg.put(pokemonMovesByEgg.pokedexNumber(), pokemonMovesByEgg); - } - - public List findAll() { - return pokemonsMovesByEgg.values() - .stream() - .toList(); - } - - public Optional findByPokedexNumber(Integer pokedexNumber) { - return Optional.ofNullable(pokemonsMovesByEgg.get(pokedexNumber)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachine.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachine.java deleted file mode 100644 index 550219984..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachine.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.List; - -public record PokemonMovesByMachine(Integer pokedexNumber, List moveIds) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachineRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachineRepository.java deleted file mode 100644 index ae6cfdfd0..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesByMachineRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class PokemonMovesByMachineRepository { - - private final Map pokemonsMovesByMachine = new HashMap<>(); - - public void save(PokemonMovesByMachine pokemonMovesByMachine) { - pokemonsMovesByMachine.put(pokemonMovesByMachine.pokedexNumber(), pokemonMovesByMachine); - } - - public List findAll() { - return pokemonsMovesByMachine.values() - .stream() - .toList(); - } - - public Optional findByPokedexNumber(Integer pokedexNumber) { - return Optional.ofNullable(pokemonsMovesByMachine.get(pokedexNumber)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelf.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelf.java deleted file mode 100644 index 3def5dcaf..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelf.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.List; - -public record PokemonMovesBySelf(Integer pokedexNumber, List moveIds) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelfRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelfRepository.java deleted file mode 100644 index ff06be3a1..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/battle/PokemonMovesBySelfRepository.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pokerogue.helper.battle; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import org.springframework.stereotype.Repository; - -@Repository -public class PokemonMovesBySelfRepository { - - private final Map pokemonsMovesBySelf = new HashMap<>(); - - public void save(PokemonMovesBySelf pokemonMovesBySelf) { - pokemonsMovesBySelf.put(pokemonMovesBySelf.pokedexNumber(), pokemonMovesBySelf); - } - - public List findAll() { - return pokemonsMovesBySelf.values() - .stream() - .toList(); - } - - public Optional findByPokedexNumber(Integer pokedexNumber) { - return Optional.ofNullable(pokemonsMovesBySelf.get(pokedexNumber)); - } -} 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 f83eb8936..4a9d20982 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 @@ -4,16 +4,13 @@ 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.BiomePokemonInfo; 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.PokemonByBiome; 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.BiomePokemonInfoRepository; import com.pokerogue.helper.biome.repository.BiomePokemonTypeImageRepository; import com.pokerogue.helper.biome.repository.BiomeRepository; import com.pokerogue.helper.global.exception.ErrorMessage; @@ -41,7 +38,6 @@ public class BiomeDatabaseInitializer implements ApplicationRunner { private final S3Service s3Service; private final BiomePokemonTypeImageRepository biomePokemonTypeImageRepository; private final BiomeRepository biomeRepository; - private final BiomePokemonInfoRepository biomePokemonInfoRepository; @Override public void run(ApplicationArguments args) { @@ -50,9 +46,8 @@ public void run(ApplicationArguments args) { List biomeTypesAndTrainers = new ArrayList<>(); List trainerTypes = new ArrayList<>(); List trainerPokemons = new ArrayList<>(); - List pokemonByBiomes = new ArrayList<>(); - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("biome-pokemons.txt"); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/biome-pokemons.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { while (true) { String biomePokemon = bufferedReader.readLine(); @@ -65,7 +60,7 @@ public void run(ApplicationArguments args) { log.error("error message : {}", e.getStackTrace()[0]); } - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("biome-links.txt"); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/biome-links.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { while (true) { String biomeLink = bufferedReader.readLine(); @@ -78,7 +73,8 @@ public void run(ApplicationArguments args) { log.error("error message : {}", e.getStackTrace()[0]); } - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("biome-types-trainers.txt"); + 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(); @@ -91,7 +87,7 @@ public void run(ApplicationArguments args) { log.error("error message : {}", e.getStackTrace()[0]); } - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("trainer-types.txt"); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/biome/trainer-types.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { while (true) { String trainerType = bufferedReader.readLine(); @@ -104,7 +100,8 @@ public void run(ApplicationArguments args) { log.error("error message : {}", e.getStackTrace()[0]); } - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("trainer-pokemons.txt"); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream( + "data/biome/trainer-pokemons.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { while (true) { String trainerPokemon = bufferedReader.readLine(); @@ -117,19 +114,6 @@ public void run(ApplicationArguments args) { log.error("error message : {}", e.getStackTrace()[0]); } - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("pokemon-by-biome.txt"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - while (true) { - String pokemonByBiome = bufferedReader.readLine(); - if (pokemonByBiome == null) { - break; - } - pokemonByBiomes.add(new PokemonByBiome(pokemonByBiome)); - } - } catch (IOException e) { - log.error("error message : {}", e.getStackTrace()[0]); - } - List trainers = trainerPokemons.stream() .filter(trainerPokemon -> existsByTrainerName(trainerTypes, trainerPokemon.getTrainerName())) .map(trainerPokemon -> new Trainer( @@ -152,16 +136,6 @@ public void run(ApplicationArguments args) { ) .forEach(biomeRepository::save); - pokemonByBiomes.stream() - .map(pokemonByBiome -> new BiomePokemonInfo( - pokemonByBiome.getId(), - pokemonByBiome.getName(), - s3Service.getPokemonImageFromS3(pokemonByBiome.getId()), - BiomePokemonType.getBiomePokemonTypeByName(pokemonByBiome.getType1()), - BiomePokemonType.getBiomePokemonTypeByName(pokemonByBiome.getType2()) - )) - .forEach(biomePokemonInfoRepository::save); - Arrays.stream(BiomePokemonType.values()) .forEach(biomePokemonType -> biomePokemonTypeImageRepository.save( biomePokemonType.name(), 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 index 4fb080d3b..fad1a492e 100644 --- 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 @@ -1,6 +1,5 @@ package com.pokerogue.helper.biome.data; -import com.pokerogue.helper.biome.data.Tier; import java.util.List; import lombok.Getter; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonInfo.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonInfo.java deleted file mode 100644 index a2609c261..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/BiomePokemonInfo.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class BiomePokemonInfo { - - private final String id; - private final String name; - private final String image; - private final BiomePokemonType type1; - private final BiomePokemonType type2; -} 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 index 3c651da8d..642aca646 100644 --- 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 @@ -8,31 +8,33 @@ @Getter public enum BiomePokemonType { - GRASS("풀"), - POISON("독"), - FIRE("불꽃"), - WATER("물"), - ELECTRIC("전기"), - NORMAL("노말"), - FAIRY("페어리"), - BUG("벌레"), - DARK("악"), - DRAGON("드래곤"), - FIGHTING("격투"), - FLYING("비행"), - GHOST("고스트"), - GROUND("땅"), - ICE("얼음"), - ROCK("바위"), - PSYCHIC("에스퍼"), - STEEL("강철"), - STELLAR("스텔라"), - UNKNOWN("없음"); + 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) { + BiomePokemonType(String name, String id) { this.name = name; + this.id = id; } public static BiomePokemonType getBiomePokemonTypeByName(String name) { @@ -41,4 +43,11 @@ public static BiomePokemonType getBiomePokemonTypeByName(String 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/PokemonByBiome.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/PokemonByBiome.java deleted file mode 100644 index ca7039be3..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/data/PokemonByBiome.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pokerogue.helper.biome.data; - -import lombok.Getter; - -@Getter -public class PokemonByBiome { - - private final String id; - private final String name; - private final String type1; - private final String type2; - - public PokemonByBiome(String pokemonByBiome) { - String[] pokemonByBiomeInforms = pokemonByBiome.split(" / "); - this.id = pokemonByBiomeInforms[0]; - this.name = pokemonByBiomeInforms[1]; - this.type1 = pokemonByBiomeInforms[2]; - this.type2 = pokemonByBiomeInforms[3]; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonInfoRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonInfoRepository.java deleted file mode 100644 index 2fd6902f2..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/biome/repository/BiomePokemonInfoRepository.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pokerogue.helper.biome.repository; - -import com.pokerogue.helper.biome.data.BiomePokemon; -import com.pokerogue.helper.biome.data.BiomePokemonInfo; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class BiomePokemonInfoRepository { - - private final Map biomePokemonInfos; - - public BiomePokemonInfoRepository() { - this.biomePokemonInfos = new HashMap<>(); - } - - public void save(BiomePokemonInfo biomePokemonInfo) { - biomePokemonInfos.put(biomePokemonInfo.getId(), biomePokemonInfo); - } - - public Optional findById(String id) { - return Optional.ofNullable(biomePokemonInfos.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 7d5fac967..60d15659a 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 @@ -1,5 +1,6 @@ package com.pokerogue.helper.biome.service; +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; @@ -7,15 +8,16 @@ import com.pokerogue.helper.biome.dto.BiomeAllPokemonResponse; import com.pokerogue.helper.biome.dto.BiomeDetailResponse; import com.pokerogue.helper.biome.dto.BiomePokemonResponse; -import com.pokerogue.helper.biome.dto.BiomeTypeResponse; import com.pokerogue.helper.biome.dto.BiomeResponse; +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.BiomePokemonInfoRepository; import com.pokerogue.helper.biome.repository.BiomePokemonTypeImageRepository; 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.PokemonRepository; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -26,8 +28,9 @@ @RequiredArgsConstructor public class BiomeService { + private final S3Service s3Service; private final BiomeRepository biomeRepository; - private final BiomePokemonInfoRepository biomePokemonInfoRepository; + private final PokemonRepository pokemonRepository; private final BiomePokemonTypeImageRepository biomePokemonTypeImageRepository; public List findBiomes() { @@ -75,34 +78,36 @@ private List getBossPokemons(Biome biome) { private List getBiomePokemons(List biomePokemons) { return biomePokemons.stream() - .map(biomePokemon -> biomePokemonInfoRepository.findById(biomePokemon) + .map(biomePokemon -> pokemonRepository.findById(biomePokemon) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)) ) .map(biomePokemonInfo -> new BiomePokemonResponse( - biomePokemonInfo.getId(), - biomePokemonInfo.getName(), - biomePokemonInfo.getImage(), - getBiomePokemonTypeResponses(biomePokemonInfo.getType1(), biomePokemonInfo.getType2()) + biomePokemonInfo.id(), + biomePokemonInfo.koName(), + s3Service.getPokemonImageFromS3(biomePokemonInfo.id()), + getBiomePokemonTypeResponses( + Type.findById(biomePokemonInfo.firstType()), + Type.findById(biomePokemonInfo.secondType())) )) .distinct() .toList(); } private List getBiomePokemonTypeResponses( - BiomePokemonType type1, - BiomePokemonType type2 + Type firstType, + Type secondType ) { List biomeTypeRespons = new ArrayList<>(); - if (!type1.getName().equals("없음")) { + if (!firstType.equals(Type.EMPTY) && !firstType.equals(Type.UNKNOWN)) { biomeTypeRespons.add(new BiomeTypeResponse( - biomePokemonTypeImageRepository.findPokemonTypeImageUrl(type1.name()), - type1.getName()) + biomePokemonTypeImageRepository.findPokemonTypeImageUrl(firstType.name()), + firstType.getName()) ); } - if (!type2.getName().equals("없음")) { + if (!secondType.equals(Type.EMPTY) && !secondType.equals(Type.UNKNOWN)) { biomeTypeRespons.add(new BiomeTypeResponse( - biomePokemonTypeImageRepository.findPokemonTypeImageUrl(type2.name()), - type2.getName()) + biomePokemonTypeImageRepository.findPokemonTypeImageUrl(secondType.name()), + secondType.getName()) ); } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/global/config/DatabaseInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/global/config/DatabaseInitializer.java deleted file mode 100644 index 03f59acf5..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/global/config/DatabaseInitializer.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.pokerogue.helper.global.config; - -import com.pokerogue.helper.ability.domain.PokemonAbility; -import com.pokerogue.helper.ability.repository.PokemonAbilityRepository; -import com.pokerogue.helper.pokemon.domain.Pokemon; -import com.pokerogue.helper.pokemon.domain.PokemonAbilityMapping; -import com.pokerogue.helper.pokemon.domain.PokemonTypeMapping; -import com.pokerogue.helper.pokemon.repository.PokemonAbilityMappingRepository; -import com.pokerogue.helper.pokemon.repository.PokemonRepository; -import com.pokerogue.helper.pokemon.repository.PokemonTypeMappingRepository; -import com.pokerogue.helper.type.domain.PokemonType; -import com.pokerogue.helper.type.repository.PokemonTypeRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Component -@Transactional -@Profile("local") -@RequiredArgsConstructor -public class DatabaseInitializer implements ApplicationRunner { - - private final PokemonRepository pokemonRepository; - private final PokemonTypeRepository pokemonTypeRepository; - private final PokemonAbilityRepository pokemonAbilityRepository; - private final PokemonTypeMappingRepository pokemonTypeMappingRepository; - private final PokemonAbilityMappingRepository pokemonAbilityMappingRepository; - - @Override - public void run(ApplicationArguments args) { - List pokemons = pokemonRepository.saveAll(List.of( - new Pokemon(1L, "이상해씨", "이상해씨", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png"), - new Pokemon(4L, "파이리", "파이리", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png"), - new Pokemon(7L, "꼬부기", "꼬부기", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png"), - new Pokemon(25L, "피카츄", "피카츄", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png"), - new Pokemon(133L, "이브이", "이브이", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/133.png"), - new Pokemon(152L, "치코리타", "치코리타", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/152.png"), - new Pokemon(393L, "펭도리", "펭도리", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/393.png"), - new Pokemon(702L, "데덴네", "데덴네", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/702.png"), - new Pokemon(54L, "고라파덕", "고라파덕", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/54.png") - )); - - List pokemonTypes = pokemonTypeRepository.saveAll(List.of( - new PokemonType("grass", "풀", "grass dummy image"), - new PokemonType("poison", "독", "poison dummy image"), - new PokemonType("fire", "불", "fire dummy image"), - new PokemonType("water", "물", "water dummy image"), - new PokemonType("electric", "전기", "electric dummy image"), - new PokemonType("normal", "물", "normal dummy image"), - new PokemonType("fairy", "페어리", "fairy dummy image") - )); - - List pokemonAbilities = pokemonAbilityRepository.saveAll(List.of( - new PokemonAbility("심록", "심록", "description", "detail description"), - new PokemonAbility("엽록소", "엽록소", "description", "detail description"), - new PokemonAbility("맹화", "맹화", "description", "detail description"), - new PokemonAbility("선파워", "선파워", "description", "detail description"), - new PokemonAbility("급류", "급류", "description", "detail description"), - new PokemonAbility("젖은접시", "젖은접시", "description", "detail description"), - new PokemonAbility("정전기", "정전기", "description", "detail description"), - new PokemonAbility("피뢰침", "피뢰침", "description", "detail description"), - new PokemonAbility("도주", "도주", "description", "detail description"), - new PokemonAbility("적응력", "적응력", "description", "detail description"), - new PokemonAbility("리프가드", "리프가드", "description", "detail description"), - new PokemonAbility("위험예지", "위험예지", "description", "detail description"), - new PokemonAbility("승기", "승기", "description", "detail description"), - new PokemonAbility("볼주머니", "볼주머니", "description", "detail description"), - new PokemonAbility("픽업", "픽업", "description", "detail description"), - new PokemonAbility("습기", "습기", "description", "detail description"), - new PokemonAbility("날씨부정", "날씨부정", "description", "detail description"), - new PokemonAbility("쓱쓱", "쓱쓱", "description", "detail description") - )); - - - pokemonTypeMappingRepository.saveAll(List.of( - new PokemonTypeMapping(pokemons.get(0), pokemonTypes.get(0)), - new PokemonTypeMapping(pokemons.get(0), pokemonTypes.get(1)), - new PokemonTypeMapping(pokemons.get(1), pokemonTypes.get(2)), - new PokemonTypeMapping(pokemons.get(2), pokemonTypes.get(2)), - new PokemonTypeMapping(pokemons.get(3), pokemonTypes.get(2)), - new PokemonTypeMapping(pokemons.get(3), pokemonTypes.get(3)), - new PokemonTypeMapping(pokemons.get(4), pokemonTypes.get(3)), - new PokemonTypeMapping(pokemons.get(4), pokemonTypes.get(4)), - new PokemonTypeMapping(pokemons.get(5), pokemonTypes.get(4)), - new PokemonTypeMapping(pokemons.get(6), pokemonTypes.get(5)), - new PokemonTypeMapping(pokemons.get(7), pokemonTypes.get(6)), - new PokemonTypeMapping(pokemons.get(7), pokemonTypes.get(5)), - new PokemonTypeMapping(pokemons.get(8), pokemonTypes.get(6)) - )); - - pokemonAbilityMappingRepository.saveAll(List.of( - new PokemonAbilityMapping(pokemons.get(0), pokemonAbilities.get(0)), - new PokemonAbilityMapping(pokemons.get(0), pokemonAbilities.get(1)), - new PokemonAbilityMapping(pokemons.get(0), pokemonAbilities.get(16)), - new PokemonAbilityMapping(pokemons.get(1), pokemonAbilities.get(2)), - new PokemonAbilityMapping(pokemons.get(1), pokemonAbilities.get(17)), - new PokemonAbilityMapping(pokemons.get(2), pokemonAbilities.get(17)), - new PokemonAbilityMapping(pokemons.get(2), pokemonAbilities.get(3)), - new PokemonAbilityMapping(pokemons.get(3), pokemonAbilities.get(4)), - new PokemonAbilityMapping(pokemons.get(3), pokemonAbilities.get(5)), - new PokemonAbilityMapping(pokemons.get(4), pokemonAbilities.get(6)), - new PokemonAbilityMapping(pokemons.get(4), pokemonAbilities.get(7)), - new PokemonAbilityMapping(pokemons.get(5), pokemonAbilities.get(8)), - new PokemonAbilityMapping(pokemons.get(5), pokemonAbilities.get(15)), - new PokemonAbilityMapping(pokemons.get(6), pokemonAbilities.get(9)), - new PokemonAbilityMapping(pokemons.get(6), pokemonAbilities.get(14)), - new PokemonAbilityMapping(pokemons.get(7), pokemonAbilities.get(10)), - new PokemonAbilityMapping(pokemons.get(7), pokemonAbilities.get(11)), - new PokemonAbilityMapping(pokemons.get(8), pokemonAbilities.get(12)), - new PokemonAbilityMapping(pokemons.get(8), pokemonAbilities.get(13)) - )); - } -} 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 28baa6da1..d6d0ecfc1 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 @@ -21,6 +21,7 @@ public enum ErrorMessage { MOVE_NOT_FOUND(HttpStatus.NOT_FOUND, "id에 해당하는 기술을 찾지 못했습니다."), MOVE_CATEGORY_NOT_FOUND(HttpStatus.NOT_FOUND, "기술 카테고리를 찾지 못했습니다."), WEATHER_NOT_FOUND(HttpStatus.NOT_FOUND, "id에 해당하는 날씨를 찾지 못했습니다."), + EVOLUTION_NOT_FOUND(HttpStatus.NOT_FOUND, "해당하는 진화 정보를 찾지 못했습니다."), PARSE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "파싱에 실패했습니다."), TYPE_MATCHING_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "타입 상성 찾기에 실패했습니다."), diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/config/Pokemon2DatabaseInitializer.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/config/PokemonDatabaseInitializer.java similarity index 64% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/config/Pokemon2DatabaseInitializer.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/config/PokemonDatabaseInitializer.java index c24d083b3..24fe63242 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/config/Pokemon2DatabaseInitializer.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/config/PokemonDatabaseInitializer.java @@ -1,12 +1,15 @@ -package com.pokerogue.helper.pokemon2.config; - -import com.pokerogue.helper.pokemon2.data.Evolution; -import com.pokerogue.helper.pokemon2.data.EvolutionChain; -import com.pokerogue.helper.pokemon2.data.Move; -import com.pokerogue.helper.pokemon2.data.Pokemon; -import com.pokerogue.helper.pokemon2.repository.EvolutionRepository; -import com.pokerogue.helper.pokemon2.repository.MoveRepository; -import com.pokerogue.helper.pokemon2.repository.Pokemon2Repository; +package com.pokerogue.helper.pokemon.config; + +import com.pokerogue.helper.ability.data.Ability; +import com.pokerogue.helper.ability.data.AbilityInfo; +import com.pokerogue.helper.ability.repository.AbilityRepository; +import com.pokerogue.helper.global.exception.ErrorMessage; +import com.pokerogue.helper.global.exception.GlobalCustomException; +import com.pokerogue.helper.pokemon.data.Evolution; +import com.pokerogue.helper.pokemon.data.EvolutionChain; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.EvolutionRepository; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -14,9 +17,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Queue; import java.util.Set; @@ -24,26 +29,31 @@ import java.util.function.Consumer; import java.util.stream.Collectors; 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 Pokemon2DatabaseInitializer implements ApplicationRunner { +public class PokemonDatabaseInitializer implements ApplicationRunner { + + private static final int FIRST_LINE_NUMBER = 3; + private static final String FIELD_DELIMITER = "/"; + private static final String LIST_DELIMITER = ","; - private final Pokemon2Repository pokemon2Repository; - private final MoveRepository moveRepository; + private final PokemonRepository pokemonRepository; private final EvolutionRepository evolutionRepository; + private final AbilityRepository abilityRepository; private final List pokemonKeys = List.of( "id", "speciesId", "nameKo", "speciesName", "formName", - "type1", - "type2", + "firstType", + "secondType", "ability1", "ability2", "abilityHidden", @@ -82,9 +92,9 @@ public class Pokemon2DatabaseInitializer implements ApplicationRunner { @Override public void run(ApplicationArguments args) { - save("pokemon.txt", this::savePokemon); - save("move-for-pokemon-response.txt", this::saveMove); - save("evolution-for-pokemon-response.txt", this::saveEvolution); + save("data/pokemon/pokemon.txt", this::savePokemon); + save("data/pokemon/evolution-for-pokemon-response.txt", this::saveEvolution); + saveAbility(); } private void save(String file, Consumer consumer) { @@ -99,9 +109,9 @@ private void save(String file, Consumer consumer) { } } - private void savePokemon(BufferedReader br) { try { + Map> technicalMachineMoveInfos = savetechnicalMachineMoves("data/battle/tms.txt"); String line; while ((line = br.readLine()) != null) { List tokens = parseToken(line); @@ -110,15 +120,53 @@ private void savePokemon(BufferedReader br) { throw new IllegalArgumentException(pokemonKeys.size() + " " + tokens.size() + "포켓몬 데이터가 잘못 되었습니다."); } - Pokemon pokemon = createPokemon(tokens); - pokemon2Repository.save(pokemon.id(), pokemon); + Pokemon pokemon = createPokemon(tokens, technicalMachineMoveInfos); + pokemonRepository.save(pokemon.id(), pokemon); } } catch (IOException e) { throw new RuntimeException(e); } } - private Pokemon createPokemon(List values) { + private Map> savetechnicalMachineMoves(String path) { + Map> technicalMachineMoveInfos = new HashMap<>(); + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) { + int lineCount = 0; + String line; + while ((line = br.readLine()) != null) { + lineCount++; + if (lineCount < FIRST_LINE_NUMBER) { + continue; + } + List fields = splitFields(line); + List moveIds = Arrays.stream(fields.get(2).split(LIST_DELIMITER)) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + technicalMachineMoveInfos.put(fields.get(0), moveIds); + } + } catch (IOException e) { + log.error("error message : {}", e.getMessage(), e); + } + return technicalMachineMoveInfos; + } + + private List splitFields(String line) { + return Arrays.stream(line.split(FIELD_DELIMITER)) + .map(String::trim) + .map(this::regularizeEmptyField) + .toList(); + } + + private String regularizeEmptyField(String field) { + if (field.equals("EMPTY")) { + return ""; + } + return field; + } + + private Pokemon createPokemon(List values, Map> technicalMachineMoveInfos) { List moves = Arrays.stream(values.get(22).split(",")) .collect(Collectors.toList()); for (int i = 0; i < moves.size(); i += 2) { @@ -130,6 +178,7 @@ private Pokemon createPokemon(List values) { .boxed() .toList(); + List technicalMachineMoves = technicalMachineMoveInfos.get(regularize(values.get(1))); return new Pokemon( regularize(values.get(0)), regularize(values.get(1)), @@ -159,6 +208,7 @@ private Pokemon createPokemon(List values) { Double.parseDouble(values.get(20)), Arrays.stream(regularize(values.get(21)).split(",")).toList(), moves, + technicalMachineMoves, Arrays.stream(regularize(values.get(23)).split(",")).toList() ); } @@ -176,7 +226,7 @@ private void saveEvolution(BufferedReader br) { } } - for (Pokemon pokemon : pokemon2Repository.findAll().values()) { + for (Pokemon pokemon : pokemonRepository.findAll().values()) { List normalForms = List.of("mega", "mega_x", "mega_y", "primal", "gigantamax", "eternamax"); if (normalForms.contains(regularize(pokemon.formName()))) { @@ -196,8 +246,8 @@ private void createEvolutionChains() { List evolutions = evolutionRepository.findAll() .keySet() .stream() - .sorted(Comparator.comparing(r -> pokemon2Repository.findById(r) - .orElseThrow(() -> new IllegalArgumentException("")) + .sorted(Comparator.comparing(r -> pokemonRepository.findById(r) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)) .speciesId() )) .toList(); @@ -212,7 +262,7 @@ private void createEvolutionChains() { evolutionRepository.saveChain(from, chain); } - for (String from : pokemon2Repository.findAll().keySet()) { + for (String from : pokemonRepository.findAll().keySet()) { if ( evolutionRepository.findEvolutionChainById(from).isEmpty() || evolutionRepository.findEvolutionChainById(from).get().getChain().isEmpty() @@ -263,38 +313,6 @@ private Evolution createEvolution(String from, String values) { ); } - - private void saveMove(BufferedReader br) { - try { - String line; - while ((line = br.readLine()) != null) { - List tokens = parseToken(line); - - if (moveKeys.size() != tokens.size()) { - throw new IllegalArgumentException(moveKeys.size() + " " + tokens.size() + "기술 데이터가 잘못 되었습니다."); - } - - Move move = createMove(tokens); - - moveRepository.save(move.id(), move); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private Move createMove(List tokens) { - return new Move( - regularize(tokens.get(0)), - regularize(tokens.get(1)), - tokens.get(2), - tokens.get(3), - tokens.get(4), - regularize(tokens.get(5)), - regularize(tokens.get(6)) - ); - } - private String regularize(String str) { String ret = str.strip() .replace(" ", "_") @@ -324,4 +342,43 @@ private List parseToken(String line) { return values; } + + private void saveAbility() { + List abilityInfos = new ArrayList<>(); + + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data/ability/ability.txt"); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { + while (true) { + String abilityInfo = bufferedReader.readLine(); + if (abilityInfo == null) { + break; + } + abilityInfos.add(new AbilityInfo(abilityInfo)); + } + } catch (IOException e) { + log.error("error message : {}", e.getStackTrace()[0]); + } + + abilityInfos.stream() + .map(abilityInfo -> new Ability( + abilityInfo.getId(), + abilityInfo.getName(), + abilityInfo.getDescription(), + getAbilityPokemon(abilityInfo.getPokemons())) + ).forEach(abilityRepository::save); + } + + private List getAbilityPokemon(List pokemons) { + List abilityPokemons = new ArrayList<>(); + for (int i = 0; i < pokemons.size(); i++) { + String pokemonId = pokemons.get(i); + + Pokemon pokemon = pokemonRepository.findById(pokemonId) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); + + abilityPokemons.add(pokemon); + } + + return abilityPokemons; + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/controller/PokemonController.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/controller/PokemonController.java index 6f719f43f..3d134f3ac 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/controller/PokemonController.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/controller/PokemonController.java @@ -1,32 +1,29 @@ package com.pokerogue.helper.pokemon.controller; -import com.pokerogue.helper.pokemon.dto.PokedexResponse; + import com.pokerogue.helper.pokemon.dto.PokemonResponse; +import com.pokerogue.helper.pokemon.dto.PokemonDetailResponse; import com.pokerogue.helper.pokemon.service.PokemonService; 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.RestController; -@Slf4j @RestController @RequiredArgsConstructor public class PokemonController { private final PokemonService pokemonService; - @GetMapping("/api/v1/pokemons") - public ApiResponse> pokemonList() { - return new ApiResponse<>("포켓몬 리스트 불러오기에 성공했습니다.", pokemonService.findPokemons()); + @GetMapping("/api/v1/pokemons2") + public ApiResponse> findAll() { + return new ApiResponse<>("포켓몬 리스트 불러오기에 성공했습니다.", pokemonService.findAll()); } - @GetMapping("/api/v1/pokemon/{id}") - public ApiResponse pokedexDetails(@PathVariable("id") Long id) { - log.info("---- URI : {}, Param : {}", "/api/v1/pokemon/{id}", id); - - return new ApiResponse<>("포켓몬 정보 불러오기에 성공했습니다.", pokemonService.findPokedexDetails(id)); + @GetMapping("/api/v1/pokemon2/{id}") + public ApiResponse findAll(@PathVariable("id") String id) { + return new ApiResponse<>("포켓몬 정보 불러오기에 성공했습니다.", pokemonService.findById(id)); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Evolution.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java similarity index 69% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Evolution.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java index 1aa5a823e..81024b74f 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Evolution.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Evolution.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.data; +package com.pokerogue.helper.pokemon.data; public record Evolution(String from, String level, String to, String item, String condition) { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionChain.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionChain.java similarity index 95% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionChain.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionChain.java index 3d941c84f..43794659e 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionChain.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionChain.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.data; +package com.pokerogue.helper.pokemon.data; import java.util.ArrayList; import java.util.Collection; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionItem.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionItem.java similarity index 97% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionItem.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionItem.java index b686b54f8..fbfa52e2b 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/EvolutionItem.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/EvolutionItem.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.data; +package com.pokerogue.helper.pokemon.data; import java.util.Arrays; import lombok.Getter; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Pokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java similarity index 68% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Pokemon.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java index 6cc5afae6..2fd498f65 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Pokemon.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Pokemon.java @@ -1,5 +1,6 @@ -package com.pokerogue.helper.pokemon2.data; +package com.pokerogue.helper.pokemon.data; +import com.pokerogue.helper.battle.Type; import java.util.List; public record Pokemon( @@ -8,8 +9,8 @@ public record Pokemon( String koName, String speciesName, String formName, - String type1, - String type2, + String firstType, + String secondType, String ability1, String ability2, String abilityHidden, @@ -31,7 +32,12 @@ public record Pokemon( Double weight, List eggMoves, List moves, + List technicalMachineMoves, List biomes ) { + public boolean hasSameType(Type moveType) { + String engName = moveType.getEngName(); + return (engName.equals(firstType) || engName.equals(secondType)); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Type.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Type.java similarity index 78% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Type.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Type.java index 555c1ba5d..18bf7c4ff 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Type.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/data/Type.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.data; +package com.pokerogue.helper.pokemon.data; import java.util.Arrays; import lombok.Getter; @@ -47,4 +47,14 @@ public static Type findById(String id) { .findFirst() .orElse(EMPTY); } + + public static Type findByName(String name) { + return Arrays.stream(values()) + .filter(value -> value.getName() + .toLowerCase() + .equals(name) + ) + .findFirst() + .orElse(EMPTY); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/Pokemon.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/Pokemon.java deleted file mode 100644 index 6514d6559..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/Pokemon.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.pokerogue.helper.pokemon.domain; - -import com.pokerogue.helper.type.domain.PokemonType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import java.util.Comparator; -import java.util.List; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "pokemon") -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Pokemon { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "pokedex_number", nullable = false) - private Long pokedexNumber; - - @Column(name = "name", nullable = false, unique = true) - private String name; - - @Column(name = "ko_name", nullable = false) - private String koName; - - @Column(name = "weight", nullable = false) - private Double weight; - - @Column(name = "height", nullable = false) - private Double height; - - @Column(name = "hp", nullable = false) - private Integer hp; - - @Column(name = "speed", nullable = false) - private Integer speed; - - @Column(name = "attack", nullable = false) - private Integer attack; - - @Column(name = "defense", nullable = false) - private Integer defense; - - @Column(name = "special_attack", nullable = false) - private Integer specialAttack; - - @Column(name = "special_defense", nullable = false) - private Integer specialDefense; - - @Column(name = "total_stats", nullable = false) - private Integer totalStats; - - @Column(name = "image", nullable = false) - private String image; - - @OneToMany(mappedBy = "pokemon", fetch = FetchType.EAGER) - private List pokemonTypeMappings; - - @OneToMany(mappedBy = "pokemon", fetch = FetchType.LAZY) - private List pokemonAbilityMappings; - - public Pokemon( - Long pokedexNumber, - String name, - String koName, - Double weight, - Double height, - Integer hp, - Integer speed, - Integer attack, - Integer defense, - Integer specialAttack, - Integer specialDefense, - Integer totalStats, - String image - ) { - this.pokedexNumber = pokedexNumber; - this.name = name; - this.koName = koName; - this.weight = weight; - this.height = height; - this.hp = hp; - this.speed = speed; - this.attack = attack; - this.defense = defense; - this.specialAttack = specialAttack; - this.specialDefense = specialDefense; - this.totalStats = totalStats; - this.image = image; - } - - public List getSortedPokemonTypes() { - return this.pokemonTypeMappings.stream() - .map(PokemonTypeMapping::getPokemonType) - .sorted(Comparator.comparingLong(PokemonType::getId)) - .distinct() - .toList(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonAbilityMapping.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonAbilityMapping.java deleted file mode 100644 index 9575681c5..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonAbilityMapping.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pokerogue.helper.pokemon.domain; - -import com.pokerogue.helper.ability.domain.PokemonAbility; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "pokemon_ability_mapping") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PokemonAbilityMapping { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "pokemon_id", nullable = false) - private Pokemon pokemon; - - @ManyToOne - @JoinColumn(name = "pokemon_ability_id", nullable = false) - private PokemonAbility pokemonAbility; - - public PokemonAbilityMapping(Pokemon pokemon, PokemonAbility pokemonAbility) { - this.pokemon = pokemon; - this.pokemonAbility = pokemonAbility; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonTypeMapping.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonTypeMapping.java deleted file mode 100644 index cd6e6cb8e..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/domain/PokemonTypeMapping.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pokerogue.helper.pokemon.domain; - -import com.pokerogue.helper.type.domain.PokemonType; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "pokemon_type_mapping") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PokemonTypeMapping { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "pokemon_id", nullable = false) - private Pokemon pokemon; - - @ManyToOne - @JoinColumn(name = "pokemon_type_id", nullable = false) - private PokemonType pokemonType; - - public PokemonTypeMapping(Pokemon pokemon, PokemonType pokemonType) { - this.pokemon = pokemon; - this.pokemonType = pokemonType; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponse.java similarity index 82% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponse.java index 7fa2ca8a8..3b970e7f1 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponse.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.dto; +package com.pokerogue.helper.pokemon.dto; public record EvolutionResponse( diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponses.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponses.java similarity index 72% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponses.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponses.java index 78b811162..eace06232 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/EvolutionResponses.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/EvolutionResponses.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.dto; +package com.pokerogue.helper.pokemon.dto; import java.util.List; 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 new file mode 100644 index 000000000..bae2e84c3 --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/MoveResponse.java @@ -0,0 +1,36 @@ +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().getName()); + + 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/PokedexResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokedexResponse.java deleted file mode 100644 index f63aafd21..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokedexResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pokerogue.helper.pokemon.dto; - -import com.pokerogue.helper.ability.dto.PokemonAbilityResponse; -import com.pokerogue.helper.pokemon.domain.Pokemon; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import java.util.List; - -public record PokedexResponse( - Long pokedexNumber, - String koName, - String pokemonImage, - List pokemonTypeResponses, - List pokemonAbilityResponses, - Double weight, - Double height, - Integer attack, - Integer defense, - Integer specialAttack, - Integer specialDefense, - Integer hp, - Integer speed, - Integer totalStats -) { - - public static PokedexResponse of( - Pokemon pokemon, - List pokemonTypeResponses, - List pokemonAbilityResponses - ) { - return new PokedexResponse( - pokemon.getPokedexNumber(), - pokemon.getKoName(), - pokemon.getImage(), - pokemonTypeResponses, - pokemonAbilityResponses, - pokemon.getWeight(), - pokemon.getHeight(), - pokemon.getAttack(), - pokemon.getDefense(), - pokemon.getSpecialAttack(), - pokemon.getSpecialDefense(), - pokemon.getHp(), - pokemon.getSpeed(), - pokemon.getTotalStats()); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/PokemonAbilityResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonAbilityResponse.java similarity index 88% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/PokemonAbilityResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonAbilityResponse.java index 13fbcf6c4..b1465837c 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/PokemonAbilityResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonAbilityResponse.java @@ -1,4 +1,4 @@ -package com.pokerogue.helper.pokemon2.dto; +package com.pokerogue.helper.pokemon.dto; public record PokemonAbilityResponse(String id, String name, String description, Boolean passive, Boolean hidden) { diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonBiomeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonBiomeResponse.java new file mode 100644 index 000000000..797376d4d --- /dev/null +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonBiomeResponse.java @@ -0,0 +1,5 @@ +package com.pokerogue.helper.pokemon.dto; + +public record PokemonBiomeResponse(String id, String name, String image) { + +} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2DetailResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java similarity index 85% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2DetailResponse.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java index cb8224f81..33f53ff97 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2DetailResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonDetailResponse.java @@ -1,9 +1,9 @@ -package com.pokerogue.helper.pokemon2.dto; +package com.pokerogue.helper.pokemon.dto; import com.pokerogue.helper.type.dto.PokemonTypeResponse; import java.util.List; -public record Pokemon2DetailResponse( +public record PokemonDetailResponse( String id, Long pokedexNumber, String name, @@ -26,6 +26,6 @@ public record Pokemon2DetailResponse( EvolutionResponses evolutions, List moves, List eggMoveResponses, - List biomes + List biomes ) { } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonResponse.java index 60c5760c0..6cbb9227e 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/dto/PokemonResponse.java @@ -1,20 +1,44 @@ package com.pokerogue.helper.pokemon.dto; -import com.pokerogue.helper.pokemon.domain.Pokemon; +import com.pokerogue.helper.pokemon.data.Pokemon; import com.pokerogue.helper.type.dto.PokemonTypeResponse; - import java.util.List; public record PokemonResponse( - Long id, + String id, Long pokedexNumber, - String koName, + String name, + String formName, String image, - List pokemonTypeResponses + String backImage, + List pokemonTypeResponse, + Integer generation, + Integer totalStats, + Integer hp, + Integer speed, + Integer attack, + Integer defense, + Integer specialAttack, + Integer specialDefense ) { + public static PokemonResponse from(Pokemon pokemon, String image, String backImage, List pokemonTypeResponse) { - public static PokemonResponse of(Pokemon pokemon, List pokemonTypeResponses) { - return new PokemonResponse(pokemon.getId(), pokemon.getPokedexNumber(), pokemon.getKoName(), pokemon.getImage(), - pokemonTypeResponses); + return new PokemonResponse( + pokemon.id(), + Long.parseLong(pokemon.speciesId()), + pokemon.koName(), + pokemon.formName(), + image, + backImage, + pokemonTypeResponse, + pokemon.generation(), + pokemon.baseTotal(), + pokemon.hp(), + pokemon.attack(), + pokemon.defense(), + pokemon.specialAttack(), + pokemon.specialDefense(), + pokemon.speed() + ); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/EvolutionRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/EvolutionRepository.java similarity index 86% rename from backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/EvolutionRepository.java rename to backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/EvolutionRepository.java index 6315e42c2..5125819c2 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/EvolutionRepository.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/EvolutionRepository.java @@ -1,7 +1,7 @@ -package com.pokerogue.helper.pokemon2.repository; +package com.pokerogue.helper.pokemon.repository; -import com.pokerogue.helper.pokemon2.data.Evolution; -import com.pokerogue.helper.pokemon2.data.EvolutionChain; +import com.pokerogue.helper.pokemon.data.Evolution; +import com.pokerogue.helper.pokemon.data.EvolutionChain; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonAbilityMappingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonAbilityMappingRepository.java deleted file mode 100644 index b50360910..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonAbilityMappingRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pokerogue.helper.pokemon.repository; - -import com.pokerogue.helper.pokemon.domain.PokemonAbilityMapping; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PokemonAbilityMappingRepository extends JpaRepository { -} 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 b6ae7df77..103a64634 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,29 +1,26 @@ package com.pokerogue.helper.pokemon.repository; -import com.pokerogue.helper.pokemon.domain.Pokemon; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; +import com.pokerogue.helper.pokemon.data.Pokemon; +import java.util.Collections; +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; +import org.springframework.stereotype.Repository; + +@Repository +public class PokemonRepository { + private final Map data = new TreeMap<>(); -public interface PokemonRepository extends JpaRepository { + public Map findAll() { + return Collections.unmodifiableMap(data); + } - @Query(""" - select p from Pokemon p - join fetch p.pokemonAbilityMappings pam - join fetch pam.pokemonAbility pa - where p.id = :id - """) - Optional findDetailsById(@Param("id") Long id); + public Optional findById(String id) { + return Optional.ofNullable(data.get(id)); + } - @Query(""" - select p from Pokemon p - join fetch p.pokemonTypeMappings ptm - join fetch ptm.pokemonType - order by p.id - """) - List findAllWithTypes(); + public void save(String key, Pokemon pokemon) { + data.put(key, pokemon); + } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonTypeMappingRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonTypeMappingRepository.java deleted file mode 100644 index a9edda481..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon/repository/PokemonTypeMappingRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pokerogue.helper.pokemon.repository; - -import com.pokerogue.helper.pokemon.domain.PokemonTypeMapping; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface PokemonTypeMappingRepository extends JpaRepository { -} 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 3b0a5cfd3..62161b219 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 @@ -1,60 +1,282 @@ package com.pokerogue.helper.pokemon.service; -import com.pokerogue.helper.ability.dto.PokemonAbilityResponse; + +import com.pokerogue.external.s3.service.S3Service; +import com.pokerogue.helper.ability.data.Ability; +import com.pokerogue.helper.ability.repository.AbilityRepository; +import com.pokerogue.helper.battle.BattleMoveRepository; +import com.pokerogue.helper.biome.data.Biome; +import com.pokerogue.helper.biome.dto.BiomeResponse; +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.domain.Pokemon; -import com.pokerogue.helper.pokemon.domain.PokemonAbilityMapping; -import com.pokerogue.helper.pokemon.dto.PokedexResponse; +import com.pokerogue.helper.pokemon.data.Evolution; +import com.pokerogue.helper.pokemon.data.EvolutionChain; +import com.pokerogue.helper.pokemon.data.EvolutionItem; +import com.pokerogue.helper.pokemon.data.Pokemon; +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.PokemonResponse; +import com.pokerogue.helper.pokemon.repository.EvolutionRepository; import com.pokerogue.helper.pokemon.repository.PokemonRepository; import com.pokerogue.helper.type.dto.PokemonTypeResponse; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -@Slf4j @Service @RequiredArgsConstructor public class PokemonService { + private final S3Service s3Service; private final PokemonRepository pokemonRepository; + private final BattleMoveRepository battleMoveRepository; + private final EvolutionRepository evolutionRepository; + private final BiomeRepository biomeRepository; + private final AbilityRepository abilityRepository; + + private List findAllCache = List.of(); + private Map findByIdCache = new HashMap<>(); - public List findPokemons() { - List pokemons = pokemonRepository.findAllWithTypes(); + public List findAll() { + if (findAllCache.isEmpty()) { + initFindAllCache(); + } + return findAllCache; + } - return pokemons.stream() - .map(this::toPokemonResponse) + private void initFindAllCache() { + findAllCache = pokemonRepository.findAll().values().stream() + .map(pokemon -> PokemonResponse.from( + pokemon, + s3Service.getPokemonImageFromS3(pokemon.id()), + s3Service.getPokemonBackImageFromS3(pokemon.id()), + createTypeResponse(pokemon) + )) + .sorted(Comparator.comparingLong(PokemonResponse::pokedexNumber)) .toList(); } - private PokemonResponse toPokemonResponse(Pokemon pokemon) { - List pokemonTypeResponses = pokemon.getSortedPokemonTypes().stream() - .map(PokemonTypeResponse::from) + public PokemonDetailResponse findById(String id) { + if (findByIdCache.isEmpty()) { + initFindByIdCache(); + } + return findByIdCache.get(id); + } + + private void initFindByIdCache() { + List pokemonDetailRespons = pokemonRepository.findAll().values() + .stream() + .map(this::toPokemon2DetailResponse) .toList(); - return PokemonResponse.of(pokemon, pokemonTypeResponses); + findByIdCache = pokemonDetailRespons.stream().collect( + Collectors.toMap( + PokemonDetailResponse::id, + Function.identity() + )); + } + + private PokemonDetailResponse toPokemon2DetailResponse(Pokemon pokemon) { + List pokemonTypeResponses = createTypeResponse(pokemon); + List pokemonAbilityResponses = createAbilityResponse(pokemon); + EvolutionResponses evolutionResponses = createEvolutionResponse(pokemon); + List moveResponse = createMoveResponse(pokemon.moves()); + List eggMoveResponse = createEggMoveResponse(pokemon.eggMoves()); + List biomeResponse = createBiomeResponse(pokemon.biomes()); + + return new PokemonDetailResponse( + pokemon.id(), + Long.parseLong(pokemon.speciesId()), + pokemon.koName(), + s3Service.getPokemonImageFromS3(pokemon.id()), + pokemonTypeResponses, + pokemonAbilityResponses, + pokemon.baseTotal(), + pokemon.hp(), + pokemon.attack(), + pokemon.defense(), + pokemon.specialAttack(), + pokemon.specialDefense(), + pokemon.speed(), + pokemon.legendary(), + pokemon.subLegendary(), + pokemon.mythical(), + pokemon.canChangeForm(), + pokemon.weight(), + pokemon.height(), + evolutionResponses, + moveResponse, + eggMoveResponse, + biomeResponse + ); } - @Transactional(readOnly = true) - public PokedexResponse findPokedexDetails(Long id) { - Pokemon pokemon = pokemonRepository.findDetailsById(id) + private EvolutionResponses createEvolutionResponse(Pokemon pokemon) { + EvolutionChain chain = evolutionRepository.findEvolutionChainById(pokemon.id()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.EVOLUTION_NOT_FOUND)); + + int currentStage = IntStream.range(0, chain.getChain().size()) + .filter(i -> chain.getChain().get(i).stream().anyMatch(r -> r.equals(pokemon.id()))) + .sum(); + + return new EvolutionResponses( + currentStage, + createStages(chain) + ); + } + + private List createStages(EvolutionChain evolutionChain) { + List> chain = evolutionChain.getChain(); + List ret = new ArrayList<>(); + + Pokemon firstPokemon = pokemonRepository.findById(chain.get(0).get(0)) .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); - return toPokedexResponse(pokemon); + ret.add(new EvolutionResponse( + firstPokemon.id(), + firstPokemon.koName(), + 1, + 0, + "", + "", + s3Service.getPokemonImageFromS3(firstPokemon.id()) + )); + + for (int i = 0; i < chain.size() - 1; i++) { + List stage = chain.get(i); + for (String id : stage) { + List evolutions = evolutionRepository.findEdgeById(id) + .orElse(null); + + if (evolutions == null) { + continue; + } + + for (Evolution evolution : evolutions) { + Pokemon pokemon = pokemonRepository.findById(evolution.to()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_NOT_FOUND)); + ret.add(new EvolutionResponse( + pokemon.id(), + pokemon.koName(), + Integer.parseInt(evolution.level()), + i + 1, + EvolutionItem.findById(evolution.item()).getKoName(), + evolution.condition(), + s3Service.getPokemonImageFromS3(pokemon.id()) + )); + } + } + } + return ret; } - private PokedexResponse toPokedexResponse(Pokemon pokemon) { - List pokemonTypeResponses = pokemon.getSortedPokemonTypes().stream() - .map(PokemonTypeResponse::from) + private List createAbilityResponse(Pokemon pokemon) { + List ret = new ArrayList<>(); + + Ability passive = abilityRepository.findById(pokemon.abilityPassive()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); + ret.add(new PokemonAbilityResponse( + pokemon.abilityPassive(), passive.getName(), passive.getDescription(), + true, false + )); + + Ability ability1 = abilityRepository.findById(pokemon.ability1()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); + Ability ability2 = abilityRepository.findById(pokemon.ability2()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); + List defaultAbilities = Stream.of(ability1, ability2) + .distinct() + .map(ability -> new PokemonAbilityResponse( + pokemon.ability1(), ability.getName(), + ability.getDescription(), false, false) + ) + .toList(); + + ret.addAll(defaultAbilities); + + if (!pokemon.abilityHidden().isEmpty()) { + Ability hidden = abilityRepository.findById(pokemon.abilityHidden()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)); + ret.add(new PokemonAbilityResponse(pokemon.abilityHidden(), hidden.getName(), hidden.getDescription(), + false, + true)); + + for (int i = 1; i < ret.size() - 1; i++) { + if (abilityRepository.findById(ret.get(i).id()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND)) == hidden + ) { + ret.remove(i); + break; + } + } + } + + return ret; + } + + private List createTypeResponse(Pokemon pokemon) { + Type firstType = Type.findById(pokemon.firstType()); + Type secondType = Type.findById(pokemon.secondType()); + return Stream.of(firstType, secondType) + .distinct() + .filter(type -> type != Type.EMPTY) + .map(type -> new PokemonTypeResponse(type.getName(), + s3Service.getPokerogueTypeImageFromS3(type.getId().toLowerCase()))) + .toList(); + } + + private List createBiomeResponse(List biomes) { + return biomes.stream() + .map(id -> { + if (id.isEmpty()) { + return new PokemonBiomeResponse("", "", ""); + } + Biome biome = biomeRepository.findById(id).orElseThrow(() -> new GlobalCustomException(ErrorMessage.BIOME_NOT_FOUND)); + return new PokemonBiomeResponse( + id, + biome.getName(), + s3Service.getBiomeImageFromS3(id) + ); + } + ) .toList(); - List pokemonAbilityResponses = pokemon.getPokemonAbilityMappings().stream() - .map(PokemonAbilityMapping::getPokemonAbility) - .map(PokemonAbilityResponse::from) + } + + 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()) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)) + .type().getEngName()))) .toList(); + } - return PokedexResponse.of(pokemon, pokemonTypeResponses, pokemonAbilityResponses); + 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)), + Integer.parseInt(moves.get(index + 1)), + s3Service.getPokerogueTypeImageFromS3( + battleMoveRepository.findById(moves.get(index)) + .orElseThrow(() -> new GlobalCustomException(ErrorMessage.MOVE_NOT_FOUND)) + .type().getEngName()) + )) + .toList(); } } diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/controller/Pokemon2Controller.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/controller/Pokemon2Controller.java deleted file mode 100644 index b26895d0b..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/controller/Pokemon2Controller.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pokerogue.helper.pokemon2.controller; - - -import com.pokerogue.helper.pokemon2.dto.Pokemon2Response; -import com.pokerogue.helper.pokemon2.dto.Pokemon2DetailResponse; -import com.pokerogue.helper.pokemon2.service.Pokemon2Service; -import com.pokerogue.helper.util.dto.ApiResponse; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -public class Pokemon2Controller { - - private final Pokemon2Service pokemon2Service; - - @GetMapping("/api/v1/pokemons2") - public ApiResponse> findAll() { - return new ApiResponse<>("포켓몬 리스트 불러오기에 성공했습니다.", pokemon2Service.findAll()); - } - - @GetMapping("/api/v1/pokemon2/{id}") - public ApiResponse findAll(@PathVariable("id") String id) { - return new ApiResponse<>("포켓몬 정보 불러오기에 성공했습니다.", pokemon2Service.findById(id)); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Ability.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Ability.java deleted file mode 100644 index fa5d5afb8..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Ability.java +++ /dev/null @@ -1,353 +0,0 @@ -package com.pokerogue.helper.pokemon2.data; - - -import java.util.Arrays; - -public enum Ability { - STENCH("Stench", "악취", "악취를 풍겨서 공격했을 때 상대가 풀죽을 때가 있다."), - DRIZZLE("Drizzle", "잔비", "등장했을 때 날씨를 비로 만든다."), - SPEEDBOOST("Speed Boost", "가속", "매 턴 스피드가 올라간다."), - BATTLEARMOR("Battle Armor", "전투무장", "단단한 껍질에 보호받아 상대의 공격이 급소에 맞지 않는다."), - STURDY("Sturdy", "옹골참", "상대 기술을 받아도 일격으로 쓰러지지 않는다. 일격필살 기술도 효과 없다."), - DAMP("Damp", "습기", "주변을 습하게 함으로써 자폭 등 폭발하는 기술을 아무도 못 쓰게 한다."), - LIMBER("Limber", "유연", "유연한 몸으로 인해 마비 상태가 되지 않는다."), - SANDVEIL("Sand Veil", "모래숨기", "모래바람일 때 회피율이 올라간다."), - STATIC("Static", "정전기", "정전기를 몸에 둘러 접촉한 상대를 마비시킬 때가 있다."), - VOLTABSORB("Volt Absorb", "축전", "전기타입의 기술을 받으면 데미지를 받지 않고 회복한다."), - WATERABSORB("Water Absorb", "저수", "물타입의 기술을 받으면 데미지를 받지 않고 회복한다."), - OBLIVIOUS("Oblivious", "둔감", "둔감해서 헤롱헤롱이나 도발 상태가 되지 않는다."), - CLOUDNINE("Cloud Nine", "날씨부정", "모든 날씨의 영향이 없어진다."), - COMPOUNDEYES("Compound Eyes", "복안", "복안을 가지고 있어 기술의 명중률이 올라간다."), - INSOMNIA("Insomnia", "불면", "잠들지 못하는 체질이라 잠듦 상태가 되지 않는다."), - COLORCHANGE("Color Change", "변색", "상대에게 받은 기술의 타입으로 자신의 타입이 변화한다."), - IMMUNITY("Immunity", "면역", "체내에 면역을 가지고 있어 독 상태가 되지 않는다."), - FLASHFIRE("Flash Fire", "타오르는불꽃", "불꽃타입의 기술을 받으면 불꽃을 받아서 자신이 사용하는 불꽃타입의 기술이 강해진다."), - SHIELDDUST("Shield Dust", "인분", "인분에 보호받아 기술의 추가 효과를 받지 않게 된다."), - OWNTEMPO("Own Tempo", "마이페이스", "마이페이스라서 혼란 상태가 되지 않는다."), - SUCTIONCUPS("Suction Cups", "흡반", "흡반으로 지면에 달라붙어 포켓몬을 교체시키는 기술이나 도구의 효과를 발휘하지 못하게 한다."), - INTIMIDATE("Intimidate", "위협", "등장했을 때 위협해서 상대를 위축시켜 상대의 공격을 떨어뜨린다."), - SHADOWTAG("Shadow Tag", "그림자밟기", "상대의 그림자를 밟아 도망치거나 교체할 수 없게 한다."), - ROUGHSKIN("Rough Skin", "까칠한피부", "공격을 받았을 때 자신에게 접촉한 상대를 까칠까칠한 피부로 상처를 입힌다."), - WONDERGUARD("Wonder Guard", "불가사의부적", "효과가 굉장한 기술만 맞는 불가사의한 힘."), - LEVITATE("Levitate", "부유", "땅에서 뜨는 것으로 땅타입의 기술을 받지 않는다."), - EFFECTSPORE("Effect Spore", "포자", "공격으로 자신에게 접촉한 상대를 독이나 마비, 잠듦 상태로 만들 때가 있다."), - SYNCHRONIZE("Synchronize", "싱크로", "자신이 걸린 독이나 마비, 화상을 상대에게 옮긴다."), - CLEARBODY("Clear Body", "클리어바디", "상대 기술이나 특성으로 능력이 떨어지지 않는다."), - NATURALCURE("Natural Cure", "자연회복", "지닌 포켓몬으로 돌아오면 상태 이상이 회복된다."), - LIGHTNINGROD("Lightning Rod", "피뢰침", "전기타입의 기술을 자신에게 끌어모아 데미지를 받지 않고 특수공격을 올린다."), - SERENEGRACE("Serene Grace", "하늘의은총", "하늘의 은총 덕분에 기술의 추가 효과가 나오기 쉽다."), - SWIFTSWIM("Swift Swim", "쓱쓱", "비가 오는 날씨일 때 스피드가 올라간다."), - CHLOROPHYLL("Chlorophyll", "엽록소", "날씨가 맑을 때 스피드가 올라간다."), - ILLUMINATE("Illuminate", "발광", "주변을 밝게 하여 명중률이 떨어지지 않는다."), - TRACE("Trace", "트레이스", "등장했을 때 상대의 특성을 트레이스해서 같은 특성이 된다."), - HUGEPOWER("Huge Power", "천하장사", "물리공격의 위력이 2배가 된다."), - POISONPOINT("Poison Point", "독가시", "자신과 접촉한 상대를 독 상태로 만들 때가 있다."), - INNERFOCUS("Inner Focus", "정신력", "단련한 정신으로 인하여 상대의 공격에 풀죽지 않는다."), - MAGMAARMOR("Magma Armor", "마그마의무장", "뜨거운 마그마를 몸에 둘러서 얼음 상태가 되지 않는다."), - WATERVEIL("Water Veil", "수의베일", "물의 베일을 몸에 둘러서 화상 상태가 되지 않는다."), - MAGNETPULL("Magnet Pull", "자력", "강철타입의 포켓몬을 자력으로 끌어모아 도망칠 수 없게 한다."), - SOUNDPROOF("Soundproof", "방음", "소리를 차단하는 것으로 소리 공격을 받지 않는다."), - RAINDISH("Rain Dish", "젖은접시", "비가 오는 날씨일 때 조금씩 HP를 회복한다."), - SANDSTREAM("Sand Stream", "모래날림", "등장했을 때 날씨를 모래바람으로 만든다."), - PRESSURE("Pressure", "프레셔", "프레셔를 줘서 상대가 쓰는 기술의 PP를 많이 줄인다."), - THICKFAT("Thick Fat", "두꺼운지방", "두꺼운 지방으로 보호되고 있어 불꽃타입과 얼음타입의 기술의 데미지를 반감시킨다."), - EARLYBIRD("Early Bird", "일찍기상", "잠듦 상태가 되어도 2배 스피드로 깨어날 수 있다."), - FLAMEBODY("Flame Body", "불꽃몸", "자신과 접촉한 상대를 화상 상태로 만들 때가 있다."), - RUNAWAY("Run Away", "도주", "야생 포켓몬으로부터 반드시 도망칠 수 있다."), - KEENEYE("Keen Eye", "날카로운눈", "날카로운 눈 덕분에 명중률이 떨어지지 않는다."), - HYPERCUTTER("Hyper Cutter", "괴력집게", "힘이 자랑인 집게를 가지고 있어 상대가 공격을 떨어뜨리지 못한다."), - PICKUP("Pickup", "픽업", "상대가 지닌 도구를 주워올 때가 있다."), - TRUANT("Truant", "게으름", "기술을 사용하면 다음 턴은 쉰다."), - HUSTLE("Hustle", "의욕", "자신의 공격이 높아지지만 명중률이 떨어진다."), - CUTECHARM("Cute Charm", "헤롱헤롱바디", "자신과 접촉한 상대를 헤롱헤롱 상태로 만들 때가 있다."), - PLUS("Plus", "플러스", "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다."), - MINUS("Minus", "마이너스", "플러스나 마이너스의 특성을 가진 포켓몬이 동료에 있으면 자신의 특수공격이 올라간다."), - FORECAST("Forecast", "기분파", "날씨의 영향을 받아 물타입, 불꽃타입, 얼음타입 중 하나로 변화한다."), - STICKYHOLD("Sticky Hold", "점착", "점착질의 몸에 도구가 달라붙어 있어 상대에게 도구를 뺏기지 않는다."), - SHEDSKIN("Shed Skin", "탈피", "몸의 껍질을 벗어 던져 상태 이상을 회복할 때가 있다."), - GUTS("Guts", "근성", "상태 이상이 되면 근성을 보여서 공격이 올라간다."), - MARVELSCALE("Marvel Scale", "이상한비늘", "상태 이상이 되면 이상한 비늘이 반응해서 방어가 올라간다."), - LIQUIDOOZE("Liquid Ooze", "해감액", "해감액을 흡수한 상대는 강렬한 악취로 데미지를 받아 HP가 줄어든다."), - OVERGROW("Overgrow", "심록", "HP가 줄었을 때 풀타입 기술의 위력이 올라간다."), - BLAZE("Blaze", "맹화", "HP가 줄었을 때 불꽃타입 기술의 위력이 올라간다."), - TORRENT("Torrent", "급류", "HP가 줄었을 때 물타입 기술의 위력이 올라간다."), - SWARM("Swarm", "벌레의알림", "HP가 줄었을 때 벌레타입 기술의 위력이 올라간다."), - ROCKHEAD("Rock Head", "돌머리", "반동을 받는 기술을 사용해도 HP가 줄지 않는다."), - DROUGHT("Drought", "가뭄", "등장했을 때 날씨를 맑음으로 만든다."), - ARENATRAP("Arena Trap", "개미지옥", "배틀에서 상대를 도망칠 수 없게 한다."), - VITALSPIRIT("Vital Spirit", "의기양양", "의기양양해져서 잠듦 상태가 되지 않는다."), - WHITESMOKE("White Smoke", "하얀연기", "하얀 연기의 보호를 받아 상대가 능력을 떨어뜨릴 수 없다."), - PUREPOWER("Pure Power", "순수한힘", "요가의 힘으로 물리공격의 위력이 2배가 된다."), - SHELLARMOR("Shell Armor", "조가비갑옷", "단단한 껍질의 보호를 받아 상대의 공격이 급소에 맞지 않는다."), - AIRLOCK("Air Lock", "에어록", "모든 날씨의 영향이 없어진다."), - TANGLEDFEET("Tangled Feet", "갈지자걸음", "혼란 상태일 때는 회피율이 올라간다."), - MOTORDRIVE("Motor Drive", "전기엔진", "전기타입의 기술을 받으면 데미지를 받지 않고 스피드가 올라간다."), - RIVALRY("Rivalry", "투쟁심", "성별이 같으면 투쟁심을 불태워 강해진다. 성별이 다르면 약해진다."), - STEADFAST("Steadfast", "불굴의마음", "풀죽을 때마다 불굴의 마음을 불태워 스피드가 올라간다."), - SNOWCLOAK("Snow Cloak", "눈숨기", "날씨가 눈일 때 회피율이 올라간다."), - GLUTTONY("Gluttony", "먹보", "HP가 줄어들면 먹을 나무열매를 HP가 절반일 때 먹어버린다."), - ANGERPOINT("Anger Point", "분노의경혈", "급소에 공격이 맞으면 크게 분노해 공격력이 최대가 된다."), - UNBURDEN("Unburden", "곡예", "지니던 도구가 없어지면 스피드가 올라간다."), - HEATPROOF("Heatproof", "내열", "내열인 몸으로 인해 불꽃타입 공격의 데미지를 반감한다."), - SIMPLE("Simple", "단순", "능력 변화가 평소의 2배가 된다."), - DRYSKIN("Dry Skin", "건조피부", "비가 오는 날씨나 물타입의 기술로 HP가 회복되고 맑을 때나 불꽃타입의 기술로는 줄어든다."), - DOWNLOAD("Download", "다운로드", "상대의 방어와 특수방어를 비교해서 낮은 쪽 능력에 맞춰서 자신의 공격이나 특수공격을 올린다."), - IRONFIST("Iron Fist", "철주먹", "펀치를 사용하는 기술의 위력이 올라간다."), - POISONHEAL("Poison Heal", "포이즌힐", "독 상태가 되면 HP가 줄지 않고 증가한다."), - ADAPTABILITY("Adaptability", "적응력", "자신과 같은 타입의 기술 위력이 올라간다."), - SKILLLINK("Skill Link", "스킬링크", "연속 기술을 사용하면 항상 최고 횟수를 사용할 수 있다."), - HYDRATION("Hydration", "촉촉바디", "비가 오는 날씨일 때 상태 이상이 회복된다."), - SOLARPOWER("Solar Power", "선파워", "날씨가 맑으면 특수공격이 올라가지만 매 턴 HP가 줄어든다."), - QUICKFEET("Quick Feet", "속보", "상태 이상이 되면 스피드가 올라간다."), - NORMALIZE("Normalize", "노말스킨", "어떤 타입의 기술도 모두 노말타입이 된다. 위력이 조금 올라간다."), - SNIPER("Sniper", "스나이퍼", "공격을 급소에 맞혔을 때 위력이 더욱 올라간다."), - MAGICGUARD("Magic Guard", "매직가드", "공격 이외에는 데미지를 입지 않는다."), - NOGUARD("No Guard", "노가드", "노가드전법에 따라 서로가 사용하는 기술이 반드시 맞게 된다."), - STALL("Stall", "시간벌기", "기술을 사용하는 순서가 반드시 마지막이 된다."), - TECHNICIAN("Technician", "테크니션", "위력이 약한 기술의 위력을 올려서 공격할 수 있다."), - LEAFGUARD("Leaf Guard", "리프가드", "날씨가 맑을 때는 상태 이상이 되지 않는다."), - KLUTZ("Klutz", "서투름", "지니고 있는 도구를 쓸 수 없다."), - MOLDBREAKER("Mold Breaker", "틀깨기", "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다."), - SUPERLUCK("Super Luck", "대운", "대운을 가지고 있어 상대의 급소에 공격이 맞기 쉽다."), - AFTERMATH("Aftermath", "유폭", "기절했을 때 접촉한 상대에게 데미지를 준다."), - ANTICIPATION("Anticipation", "위험예지", "상대가 지닌 위험한 기술을 감지할 수 있다."), - FOREWARN("Forewarn", "예지몽", "등장했을 때 상대가 지닌 기술을 하나만 꿰뚫어본다."), - UNAWARE("Unaware", "천진", "상대의 능력 변화를 무시하고 공격할 수 있다."), - TINTEDLENS("Tinted Lens", "색안경", "효과가 별로인 기술을 통상의 위력으로 쓸 수 있다."), - FILTER("Filter", "필터", "효과가 굉장한 공격의 위력을 약하게 만든다."), - SLOWSTART("Slow Start", "슬로스타트", "5턴 동안 공격과 스피드가 절반이 된다."), - SCRAPPY("Scrappy", "배짱", "고스트타입 포켓몬에게 노말타입과 격투타입의 기술을 맞게 한다."), - STORMDRAIN("Storm Drain", "마중물", "물타입의 기술을 자신에게 끌어모아 데미지는 받지 않고 특수공격이 올라간다."), - ICEBODY("Ice Body", "아이스바디", "날씨가 눈일 때 HP를 조금씩 회복한다."), - SOLIDROCK("Solid Rock", "하드록", "효과가 굉장한 공격의 위력을 약하게 만든다."), - SNOWWARNING("Snow Warning", "눈퍼뜨리기", "등장했을 때 날씨를 눈으로 만든다."), - HONEYGATHER("Honey Gather", "꿀모으기", "배틀이 끝났을 때 달콤한꿀을 주울 때가 있다. 배틀 후에 꿀을 팔아 돈을 받을 수 있다."), - FRISK("Frisk", "통찰", "등장했을 때 상대의 특성을 통찰할 수 있다."), - RECKLESS("Reckless", "이판사판", "반동 데미지를 받는 기술의 위력이 올라간다."), - MULTITYPE("Multitype", "멀티타입", "지니고 있는 플레이트나 Z크리스탈 타입에 따라 자신의 타입이 바뀐다."), - FLOWERGIFT("Flower Gift", "플라워기프트", "날씨가 맑을 때 자신과 같은 편의 공격과 특수방어의 능력이 올라간다."), - BADDREAMS("Bad Dreams", "나이트메어", "잠듦 상태의 상대에게 데미지를 준다."), - PICKPOCKET("Pickpocket", "나쁜손버릇", "접촉한 상대의 도구를 훔친다."), - SHEERFORCE("Sheer Force", "우격다짐", "기술의 추가 효과가 없어지지만 그만큼 높은 위력으로 기술을 사용할 수 있다."), - CONTRARY("Contrary", "심술꾸러기", "능력의 변화가 역전해서 올라갈 때 떨어지고 떨어질 때 올라간다."), - UNNERVE("Unnerve", "긴장감", "상대를 긴장시켜 나무열매를 먹지 못하게 한다."), - DEFIANT("Defiant", "오기", "능력이 떨어지면 공격이 크게 올라간다."), - DEFEATIST("Defeatist", "무기력", "HP가 절반이 되면 무기력해져서 공격과 특수공격이 반감된다."), - CURSEDBODY("Cursed Body", "저주받은바디", "공격을 받으면 상대의 기술을 사슬묶기 상태로 만들 때가 있다."), - HEALER("Healer", "치유의마음", "같은 편의 상태 이상을 가끔 회복시킨다."), - FRIENDGUARD("Friend Guard", "프렌드가드", "같은 편의 데미지를 줄일 수 있다."), - WEAKARMOR("Weak Armor", "깨어진갑옷", "물리 기술로 데미지를 받으면 방어가 떨어지고 스피드가 크게 올라간다."), - HEAVYMETAL("Heavy Metal", "헤비메탈", "자신의 무게가 2배가 된다."), - LIGHTMETAL("Light Metal", "라이트메탈", "자신의 무게가 절반이 된다."), - MULTISCALE("Multiscale", "멀티스케일", "HP가 꽉 찼을 때 받는 데미지가 줄어든다."), - TOXICBOOST("Toxic Boost", "독폭주", "독 상태가 되었을 때 물리 기술의 위력이 올라간다."), - FLAREBOOST("Flare Boost", "열폭주", "화상 상태가 되었을 때 특수 기술의 위력이 올라간다."), - HARVEST("Harvest", "수확", "사용한 나무열매를 몇 번이고 만들어 낸다."), - TELEPATHY("Telepathy", "텔레파시", "같은 편의 공격의 낌새를 읽고 기술을 회피한다."), - MOODY("Moody", "변덕쟁이", "매 턴 능력 중 하나가 크게 오르고 하나가 떨어진다."), - OVERCOAT("Overcoat", "방진", "모래바람이나 싸라기눈 등의 데미지를 입지 않는다. 가루의 기술을 받지 않는다."), - POISONTOUCH("Poison Touch", "독수", "접촉하기만 해도 상대를 독 상태로 만들 때가 있다."), - REGENERATOR("Regenerator", "재생력", "지닌 포켓몬으로 돌아오면 HP를 조금 회복한다."), - BIGPECKS("Big Pecks", "부풀린가슴", "방어를 떨어뜨리는 효과를 받지 않는다."), - SANDRUSH("Sand Rush", "모래헤치기", "날씨가 모래바람일 때 스피드가 올라간다."), - WONDERSKIN("Wonder Skin", "미라클스킨", "변화 기술을 받기 어려운 몸으로 되어 있다."), - ANALYTIC("Analytic", "애널라이즈", "제일 마지막에 기술을 쓰면 기술의 위력이 올라간다."), - ILLUSION("Illusion", "일루전", "지닌 포켓몬 중 제일 뒤에 있는 포켓몬으로 둔갑하여 나와서 상대를 속인다."), - IMPOSTER("Imposter", "괴짜", "눈앞의 포켓몬으로 변신해버린다."), - INFILTRATOR("Infiltrator", "틈새포착", "상대의 벽이나 대타출동을 뚫고 공격할 수 있다."), - MUMMY("Mummy", "미라", "상대가 접촉하면 상대를 미라로 만들어버린다."), - MOXIE("Moxie", "자기과신", "상대를 쓰러뜨리면 자신감이 붙어서 공격이 올라간다."), - JUSTIFIED("Justified", "정의의마음", "악타입 공격을 받으면 정의감으로 공격이 올라간다."), - RATTLED("Rattled", "주눅", "위협이나 악타입과 고스트타입과 벌레타입의 기술에 주눅이 들어 스피드가 올라간다."), - MAGICBOUNCE("Magic Bounce", "매직미러", "상대가 쓴 변화 기술을 받지 않고 그대로 되받아칠 수 있다."), - SAPSIPPER("Sap Sipper", "초식", "풀타입 기술을 받으면 데미지를 입지 않고 공격이 올라간다."), - PRANKSTER("Prankster", "짓궂은마음", "변화 기술을 먼저 쓸 수 있다."), - SANDFORCE("Sand Force", "모래의힘", "날씨가 모래바람일 때 바위타입과 땅타입과 강철타입의 위력이 올라간다."), - IRONBARBS("Iron Barbs", "철가시", "자신과 접촉한 상대에게 철가시로 데미지를 준다."), - ZENMODE("Zen Mode", "달마모드", "HP가 절반 이하가 되면 모습이 변화한다."), - VICTORYSTAR("Victory Star", "승리의별", "자신과 같은 편의 명중률이 올라간다."), - TURBOBLAZE("Turboblaze", "터보블레이즈", "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다."), - TERAVOLT("Teravolt", "테라볼티지", "상대 특성에 방해받지 않고 상대에게 기술을 쓸 수 있다."), - AROMAVEIL("Aroma Veil", "아로마베일", "자신과 같은 편으로 향하는 멘탈 공격을 막을 수 있다."), - FLOWERVEIL("Flower Veil", "플라워베일", "같은 편의 풀타입 포켓몬은 능력이 떨어지지 않고 상태 이상도 되지 않는다."), - CHEEKPOUCH("Cheek Pouch", "볼주머니", "어떤 나무열매라도 먹으면 HP도 회복한다."), - PROTEAN("Protean", "변환자재", "자신이 사용한 기술과 같은 타입으로 변화한다."), - FURCOAT("Fur Coat", "퍼코트", "상대로부터 받는 물리 기술의 데미지가 절반이 된다."), - MAGICIAN("Magician", "매지션", "기술을 맞은 상대의 도구를 빼앗아 버린다."), - BULLETPROOF("Bulletproof", "방탄", "상대 구슬이나 폭탄 등 기술을 막을 수 있다."), - COMPETITIVE("Competitive", "승기", "능력이 떨어지면 특수공격이 크게 올라간다."), - STRONGJAW("Strong Jaw", "옹골찬턱", "턱이 튼튼하여 무는 기술의 위력이 올라간다."), - REFRIGERATE("Refrigerate", "프리즈스킨", "노말타입의 기술이 얼음타입이 된다. 위력이 조금 올라간다."), - SWEETVEIL("Sweet Veil", "스위트베일", "같은 편의 포켓몬이 잠들지 않게 된다."), - STANCECHANGE("Stance Change", "배틀스위치", "공격 기술을 쓰면 블레이드폼으로 기술 킹실드를 쓰면 실드폼으로 변한다."), - GALEWINGS("Gale Wings", "질풍날개", "HP가 꽉 찼을 때 비행타입의 기술을 먼저 쓸 수 있다."), - MEGALAUNCHER("Mega Launcher", "메가런처", "파동 기술의 위력이 올라간다."), - GRASSPELT("Grass Pelt", "풀모피", "그래스필드일 때 방어가 올라간다."), - SYMBIOSIS("Symbiosis", "공생", "같은 편이 도구를 쓰면 자신이 지니고 있는 도구를 같은 편에게 건넨다."), - TOUGHCLAWS("Tough Claws", "단단한발톱", "상대에게 접촉하는 기술의 위력이 올라간다."), - PIXILATE("Pixilate", "페어리스킨", "노말타입의 기술이 페어리타입이 된다. 위력이 조금 올라간다."), - GOOEY("Gooey", "미끈미끈", "공격으로 자신과 접촉한 상대의 스피드를 떨어뜨린다."), - AERILATE("Aerilate", "스카이스킨", "노말타입의 기술이 비행타입이 된다. 위력이 조금 올라간다."), - PARENTALBOND("Parental Bond", "부자유친", "부모와 자식 2마리로 2번 공격할 수 있다."), - DARKAURA("Dark Aura", "다크오라", "전원의 악타입 기술이 강해진다."), - FAIRYAURA("Fairy Aura", "페어리오라", "전원의 페어리타입 기술이 강해진다."), - AURABREAK("Aura Break", "오라브레이크", "오라의 효과를 역전시켜 위력을 떨어뜨린다."), - PRIMORDIALSEA("Primordial Sea", "시작의바다", "불꽃타입의 공격을 받지 않는 날씨로 만든다."), - DESOLATELAND("Desolate Land", "끝의대지", "물타입의 공격을 받지 않는 날씨로 만든다."), - DELTASTREAM("Delta Stream", "델타스트림", "비행타입의 약점이 없어지는 날씨로 만든다."), - STAMINA("Stamina", "지구력", "공격을 받으면 방어가 올라간다."), - WIMPOUT("Wimp Out", "도망태세", "HP가 절반이 되면 황급히 도망쳐서 지닌 포켓몬으로 돌아간다."), - EMERGENCYEXIT("Emergency Exit", "위기회피", "HP가 절반이 되면 위험을 회피하기 위해 지닌 포켓몬으로 돌아간다."), - WATERCOMPACTION("Water Compaction", "꾸덕꾸덕굳기", "물타입의 기술을 받으면 방어가 크게 올라간다."), - MERCILESS("Merciless", "무도한행동", "독 상태의 상대를 공격하면 반드시 급소에 맞는다."), - SHIELDSDOWN("Shields Down", "리밋실드", "HP가 절반이 되면 껍질이 깨져 공격적으로 된다."), - STAKEOUT("Stakeout", "잠복", "교체로 나온 상대에게 2배 데미지로 공격할 수 있다."), - WATERBUBBLE("Water Bubble", "수포", "자신을 향하는 불꽃타입 기술의 위력을 떨어뜨린다. 화상을 입지 않는다."), - STEELWORKER("Steelworker", "강철술사", "강철타입 기술의 위력이 올라간다."), - BERSERK("Berserk", "발끈", "상대의 공격으로 HP가 절반이 되면 특수공격이 올라간다."), - SLUSHRUSH("Slush Rush", "눈치우기", "날씨가 눈일 때 스피드가 올라간다."), - LONGREACH("Long Reach", "원격", "모든 기술을 상대에게 접촉하지 않고 사용할 수 있다."), - LIQUIDVOICE("Liquid Voice", "촉촉보이스", "모든 소리 기술이 물타입이 된다."), - TRIAGE("Triage", "힐링시프트", "회복 기술을 먼저 사용할 수 있다."), - GALVANIZE("Galvanize", "일렉트릭스킨", "노말타입 기술이 전기타입이 된다. 위력이 조금 올라간다."), - SURGESURFER("Surge Surfer", "서핑테일", "일렉트릭필드일 때 스피드가 2배가 된다."), - SCHOOLING("Schooling", "어군", "HP가 많을 때 무리지어 강해진다. HP가 얼마 남지 않으면 무리는 뿔뿔이 흩어진다."), - DISGUISE("Disguise", "탈", "몸을 덮는 탈로 1번 공격을 막을 수 있다."), - BATTLEBOND("Battle Bond", "유대변화", "상대를 쓰러뜨리면 트레이너와의 유대감이 깊어져서 지우개굴닌자로 변한다. 물수리검이 강해진다."), - POWERCONSTRUCT("Power Construct", "스웜체인지", "HP가 절반이 되면 셀들이 응원하러 달려와 퍼펙트폼으로 모습이 변한다."), - CORROSION("Corrosion", "부식", "강철타입이나 독타입도 독 상태로 만들 수 있다."), - COMATOSE("Comatose", "절대안깸", "항상 비몽사몽 상태로 절대 깨지 않는다. 잠든 상태로 공격할 수 있다."), - QUEENLYMAJESTY("Queenly Majesty", "여왕의위엄", "상대에게 위압감을 줘서 이쪽을 향한 선제 기술을 사용할 수 없게 한다."), - INNARDSOUT("Innards Out", "내용물분출", "상대가 쓰러뜨렸을 때 HP의 남은 양만큼 상대에게 데미지를 준다."), - DANCER("Dancer", "무희", "누군가 춤 기술을 쓰면 자신도 이어서 춤 기술을 쓸 수 있다."), - BATTERY("Battery", "배터리", "같은 편 특수 기술의 위력을 올린다."), - FLUFFY("Fluffy", "복슬복슬", "상대로부터 받은 접촉하는 기술의 데미지를 반감시키지만 불꽃타입 기술의 데미지는 2배가 된다."), - DAZZLING("Dazzling", "비비드바디", "상대를 놀라게 해서 이쪽을 향한 선제 기술을 사용할 수 없게 한다."), - SOULHEART("Soul-Heart", "소울하트", "포켓몬이 기절할 때마다 특수공격이 올라간다."), - TANGLINGHAIR("Tangling Hair", "컬리헤어", "공격으로 자신에게 접촉한 상대의 스피드를 떨어뜨린다."), - RECEIVER("Receiver", "리시버", "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다."), - POWEROFALCHEMY("Power of Alchemy", "화학의힘", "쓰러진 같은 편의 특성을 이어받아 같은 특성으로 바뀐다."), - BEASTBOOST("Beast Boost", "비스트부스트", "상대를 기절시켰을 때 자신의 가장 높은 능력이 올라간다."), - RKSSYSTEM("RKS System", "AR시스템", "지니고 있는 메모리로 자신의 타입이 변한다."), - ELECTRICSURGE("Electric Surge", "일렉트릭메이커", "등장했을 때 일렉트릭필드를 사용한다."), - PSYCHICSURGE("Psychic Surge", "사이코메이커", "등장했을 때 사이코필드를 사용한다."), - MISTYSURGE("Misty Surge", "미스트메이커", "등장했을 때 미스트필드를 사용한다."), - GRASSYSURGE("Grassy Surge", "그래스메이커", "등장했을 때 그래스필드를 사용한다."), - FULLMETALBODY("Full Metal Body", "메탈프로텍트", "상대 기술이나 특성으로 능력이 떨어지지 않는다."), - SHADOWSHIELD("Shadow Shield", "스펙터가드", "HP가 꽉 찼을 때 받는 데미지가 줄어든다."), - PRISMARMOR("Prism Armor", "프리즘아머", "효과가 굉장한 공격의 위력을 약하게 만든다."), - NEUROFORCE("Neuroforce", "브레인포스", "효과가 굉장한 공격의 위력이 더욱 올라간다."), - INTREPIDSWORD("Intrepid Sword", "불요의검", "등장했을 때 공격이 올라간다."), - DAUNTLESSSHIELD("Dauntless Shield", "불굴의방패", "등장했을 때 방어가 올라간다."), - LIBERO("Libero", "리베로", "자신이 사용한 기술과 같은 타입으로 변화한다."), - BALLFETCH("Ball Fetch", "볼줍기", "첫 번째로 실패한 몬스터볼을 주워온다."), - COTTONDOWN("Cotton Down", "솜털", "공격을 받으면 솜털을 흩뿌려서 자신을 제외한 모든 포켓몬의 스피드를 떨어뜨린다."), - PROPELLERTAIL("Propeller Tail", "스크루지느러미", "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다."), - MIRRORARMOR("Mirror Armor", "미러아머", "자신이 받는 능력 다운 효과에 한해 되받아친다."), - GULPMISSILE("Gulp Missile", "그대로꿀꺽미사일", "파도타기나 다이빙을 쓰면 먹이를 물어온다. 데미지를 받으면 먹이를 토해내서 공격한다."), - STALWART("Stalwart", "굳건한신념", "상대의 기술을 끌어모으는 특성이나 기술의 영향을 받지 않는다."), - STEAMENGINE("Steam Engine", "증기기관", "물타입이나 불꽃타입 기술을 받으면 스피드가 매우 크게 올라간다."), - PUNKROCK("Punk Rock", "펑크록", "소리 기술의 위력이 올라간다. 상대로부터 받는 소리 기술의 데미지는 절반이 된다."), - SANDSPIT("Sand Spit", "모래뿜기", "공격을 받으면 모래바람을 일으킨다."), - ICESCALES("Ice Scales", "얼음인분", "얼음인분의 보호를 받아 특수공격으로 받는 데미지가 절반이 된다."), - RIPEN("Ripen", "숙성", "나무열매를 숙성시켜서 효과가 2배가 된다."), - ICEFACE("Ice Face", "아이스페이스", "물리공격을 머리의 얼음이 대신 맞아주지만 모습도 바뀐다. 얼음은 싸라기눈이 내리면 원래대로 돌아온다."), - POWERSPOT("Power Spot", "파워스폿", "옆에 있기만 해도 기술의 위력이 올라간다."), - MIMICRY("Mimicry", "의태", "필드의 상태에 따라 포켓몬의 타입이 바뀐다."), - SCREENCLEANER("Screen Cleaner", "배리어프리", "등장했을 때 상대와 같은 편의 빛의장막, 리플렉터, 오로라베일의 효과가 사라진다."), - STEELYSPIRIT("Steely Spirit", "강철정신", "같은 편의 강철타입 공격의 위력이 올라간다."), - PERISHBODY("Perish Body", "멸망의바디", "접촉하는 기술을 받으면 3턴 후에 양쪽 모두 기절한다. 교체되면 효과가 없어진다."), - WANDERINGSPIRIT("Wandering Spirit", "떠도는영혼", "접촉하는 기술로 공격해온 포켓몬과 특성을 바꾼다."), - GORILLATACTICS("Gorilla Tactics", "무아지경", "공격이 올라가지만 처음에 선택한 기술 외에는 쓸 수 없게 된다."), - NEUTRALIZINGGAS("Neutralizing Gas", "화학변화가스", "화학변화가스를 가진 포켓몬이 배틀에 나와 있으면 모든 포켓몬이 가진 특성의 효과가 사라지거나 발동하지 않게 된다."), - PASTELVEIL("Pastel Veil", "파스텔베일", "자신과 같은 편이 독의 상태 이상 효과를 받지 않게 된다."), - HUNGERSWITCH("Hunger Switch", "꼬르륵스위치", "턴이 끝날 때마다 배부른 모양, 배고픈 모양, 배부른 모양...으로 번갈아서 모습을 바꾼다."), - QUICKDRAW("Quick Draw", "퀵드로", "상대보다 먼저 행동할 수도 있다."), - UNSEENFIST("Unseen Fist", "보이지않는주먹", "상대에게 접촉하는 기술을 사용하면 방어의 효과를 무시하고 공격할 수 있다."), - CURIOUSMEDICINE("Curious Medicine", "기묘한약", "등장했을 때 조개껍질에서 약을 흩뿌려서 능력 변화를 원래대로 되돌린다."), - TRANSISTOR("Transistor", "트랜지스터", "전기타입 기술의 위력이 올라간다."), - DRAGONSMAW("Dragon's Maw", "용의턱", "드래곤타입 기술의 위력이 올라간다."), - CHILLINGNEIGH("Chilling Neigh", "백의울음", "상대를 쓰러뜨리면 차가운 울음소리를 내면서 공격이 올라간다."), - GRIMNEIGH("Grim Neigh", "흑의울음", "상대를 쓰러뜨리면 무서운 울음소리를 내면서 특수공격이 올라간다."), - ASONEGLASTRIER("As One glastrier", "혼연일체", "버드렉스의 긴장감과 블리자포스의 백의울음 두 가지 특성을 겸비한다."), - ASONESPECTRIER("As One spectrier", "혼연일체", "버드렉스의 긴장감과 레이스포스의 흑의울음 두 가지 특성을 겸비한다."), - LINGERINGAROMA("Lingering Aroma", "가시지않는향기", "상대가 접촉하면 가시지 않는 향기가 상대에게 배어 버린다."), - SEEDSOWER("Seed Sower", "넘치는씨", "공격을 받으면 필드를 그래스필드로 만든다."), - THERMALEXCHANGE("Thermal Exchange", "열교환", "불꽃타입 기술로 공격받으면 공격이 올라간다. 화상 상태가 되지 않는다."), - ANGERSHELL("Anger Shell", "분노의껍질", "상대의 공격에 의해 HP가 절반이 되면 화가 나서 방어와 특수방어가 떨어지지만 공격, 특수공격, 스피드가 올라간다."), - PURIFYINGSALT("Purifying Salt", "정화의소금", "깨끗한 소금에 의해 상태 이상이 되지 않는다. 고스트타입 기술의 데미지를 반감시킨다."), - WELLBAKEDBODY("Well-Baked Body", "노릇노릇바디", "불꽃타입 기술로 공격받으면 데미지를 입지 않고 방어가 크게 올라간다."), - WINDRIDER("Wind Rider", "바람타기", "순풍이 불거나 바람 기술로 공격받으면 데미지를 받지 않고 공격이 올라간다."), - GUARDDOG("Guard Dog", "파수견", "위협을 받으면 공격이 올라간다. 포켓몬을 교체시키는 기술이나 도구의 효과를 받지 않는다."), - ROCKYPAYLOAD("Rocky Payload", "바위나르기", "바위타입 기술의 위력이 올라간다."), - WINDPOWER("Wind Power", "풍력발전", "바람 기술로 공격받으면 충전 상태가 된다."), - ZEROTOHERO("Zero to Hero", "마이티체인지", "지닌 포켓몬으로 돌아오면 마이티폼으로 변한다."), - COMMANDER("Commander", "사령탑", "등장했을 때 같은 편에 어써러셔가 있으면 입속에 들어가 안에서 지시를 내린다."), - ELECTROMORPHOSIS("Electromorphosis", "전기로바꾸기", "데미지를 받으면 충전 상태가 된다."), - PROTOSYNTHESIS("Protosynthesis", "고대활성", "부스트에너지를 지니고 있거나 날씨가 맑을 때 가장 높은 능력이 올라간다."), - QUARKDRIVE("Quark Drive", "쿼크차지", "부스트에너지를 지니고 있거나 일렉트릭필드일 때 가장 높은 능력이 올라간다."), - GOODASGOLD("Good as Gold", "황금몸", "산화하지 않는 튼튼한 황금몸 덕분에 상대의 변화 기술의 영향을 받지 않는다."), - VESSELOFRUIN("Vessel of Ruin", "재앙의그릇", "재앙을 부르는 그릇의 힘으로 자신을 제외한 모든 포켓몬의 특수 공격을 약하게 만든다."), - SWORDOFRUIN("Sword of Ruin", "재앙의검", "재앙을 부르는 검의 힘으로 자신을 제외한 모든 포켓몬의 방어를 약하게 만든다."), - TABLETSOFRUIN("Tablets of Ruin", "재앙의목간", "재앙을 부르는 목간의 힘으로 자신을 제외한 모든 포켓몬의 공격을 약하게 만든다."), - BEADSOFRUIN("Beads of Ruin", "재앙의구슬", "재앙을 부르는 곡옥의 힘으로 자신을 제외한 모든 포켓몬의 특수방어를 약하게 만든다."), - ORICHALCUMPULSE("Orichalcum Pulse", "진홍빛고동", "등장했을 때 날씨를 맑음으로 만든다. 햇살이 강하면 고대의 고동에 의해 공격이 강화된다."), - HADRONENGINE("Hadron Engine", "하드론엔진", "등장했을 때 일렉트릭필드를 전개한다. 일렉트릭필드일 때 미래 기관에 의해 특수공격이 강화된다."), - OPPORTUNIST("Opportunist", "편승", "상대의 능력이 올라가면 자신도 편승해서 똑같이 자신도 올린다."), - CUDCHEW("Cud Chew", "되새김질", "한 번에 한하여 나무열매를 먹으면 다음 턴이 끝날 때 위에서 꺼내서 또 먹는다."), - SHARPNESS("Sharpness", "예리함", "상대를 베는 기술의 위력이 올라간다."), - SUPREMEOVERLORD("Supreme Overlord", "총대장", "등장했을 때 지금까지 쓰러진 같은 편의 수가 많을수록 조금씩 공격과 특수공격이 올라간다."), - COSTAR("Costar", "협연", "등장했을 때 같은 편의 능력 변화를 복사한다."), - TOXICDEBRIS("Toxic Debris", "독치장", "물리 기술로 데미지를 받으면 상대의 발밑에 독압정을 뿌린다."), - ARMORTAIL("Armor Tail", "테일아머", "머리를 감싸고 있는 수수께끼의 꼬리가 이쪽을 향한 선제 기술을 사용할 수 없게 한다."), - EARTHEATER("Earth Eater", "흙먹기", "땅타입의 기술로 공격받으면 데미지를 받지 않고 회복한다."), - MYCELIUMMIGHT("Mycelium Might", "균사의힘", "변화 기술을 사용할 때 반드시 행동이 느려지지만 상대 특성에 방해받지 않는다."), - MINDSEYE("Mind's Eye", "심안", "노말타입과 격투타입 기술을 고스트타입에게 맞힐 수 있다. 상대의 회피율 변화를 무시하고 명중률도 떨어지지 않는다."), - SUPERSWEETSYRUP("Supersweet Syrup", "감미로운꿀", "처음 등장했을 때 감미로운 꿀의 향기를 흩뿌려서 상대의 회피율을 떨어뜨린다."), - HOSPITALITY("Hospitality", "대접", "등장했을 때 같은 편을 대접해서 HP를 조금 회복시킨다."), - TOXICCHAIN("Toxic Chain", "독사슬", "독소를 머금은 사슬의 힘으로 기술에 맞은 상대를 맹독 상태로 만들 때가 있다."), - EMBODYASPECTTEAL("Embody Aspect", "초상투영", "마음속에 깃든 추억의 힘으로 벽록의가면을 빛나게 하여 자신의 스피드를 올린다."), - EMBODYASPECTWELLSPRING("Embody Aspect", "초상투영", "마음속에 깃든 추억의 힘으로 우물의가면을 빛나게 하여 자신의 특수방어를 올린다."), - EMBODYASPECTHEARTHFLAME("Embody Aspect", "초상투영", "마음속에 깃든 추억의 힘으로 화덕의가면을 빛나게 하여 자신의 공격력을 올린다."), - EMBODYASPECTCORNERSTONE("Embody Aspect", "초상투영", "마음속에 깃든 추억의 힘으로 주춧돌의가면을 빛나게 하여 자신의 방어력을 올린다."), - TERASHIFT("Tera Shift", "테라체인지", "등장했을 때 주위의 에너지를 흡수하여 테라스탈폼으로 변한다."), - TERASHELL("Tera Shell", "테라셸", "모든 타입의 힘이 담긴 등껍질이 HP가 꽉 찼을 때 받는 데미지를 모두 효과가 별로이게 만든다."), - TERAFORMZERO("Teraform Zero", "제로포밍", "테라파고스가 스텔라폼이 되었을 때 숨겨진 힘에 의해 날씨와 필드의 영향을 모두 무효로 만든다."), - POISONPUPPETEER("Poison Puppeteer", "독조종", "복숭악동의 기술에 의해 독 상태가 된 상대는 혼란 상태도 되어 버린다."), - EMPTY("", "", ""), - ; - - private final String id; - private final String name; - private final String description; - - Ability(String id, String name, String description) { - this.id = id; - this.name = name; - this.description = description; - } - - public static Ability findById(String id) { - return Arrays.stream(values()) - .filter(value -> value.getId() - .replace("-", "_") - .replace(" ", "_") - .replace("'", "") - .toLowerCase() - .equals(id)) - .findFirst() - .orElse(EMPTY); - } - - public String getId() { - return id; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Biome.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Biome.java deleted file mode 100644 index f0f5842fb..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Biome.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.pokerogue.helper.pokemon2.data; - -import java.util.Arrays; -import lombok.Getter; - -@Getter -public enum Biome { - UNKNOWNLOCATION("unknownLocation", "기억할 수 없는 곳"), - TOWN("TOWN", "마을"), - PLAINS("PLAINS", "평야"), - GRASS("GRASS", "풀숲"), - TALL_GRASS("TALL_GRASS", "높은 풀숲"), - METROPOLIS("METROPOLIS", "대도시"), - FOREST("FOREST", "숲"), - SEA("SEA", "바다"), - SWAMP("SWAMP", "늪지"), - BEACH("BEACH", "해변"), - LAKE("LAKE", "호수"), - SEABED("SEABED", "해저"), - MOUNTAIN("MOUNTAIN", "산"), - BADLANDS("BADLANDS", "악지"), - CAVE("CAVE", "동굴"), - DESERT("DESERT", "사막"), - ICE_CAVE("ICE_CAVE", "얼음 동굴"), - MEADOW("MEADOW", "목초지"), - POWER_PLANT("POWER_PLANT", "발전소"), - VOLCANO("VOLCANO", "화산"), - GRAVEYARD("GRAVEYARD", "묘지"), - DOJO("DOJO", "도장"), - FACTORY("FACTORY", "공장"), - RUINS("RUINS", "고대 유적"), - WASTELAND("WASTELAND", "황무지"), - ABYSS("ABYSS", "심연"), - SPACE("SPACE", "우주"), - CONSTRUCTION_SITE("CONSTRUCTION_SITE", "공사장"), - JUNGLE("JUNGLE", "정글"), - FAIRY_CAVE("FAIRY_CAVE", "페어리 동굴"), - TEMPLE("TEMPLE", "사원"), - SLUM("SLUM", "슬럼"), - SNOWY_FOREST("SNOWY_FOREST", "눈덮인 숲"), - ISLAND("ISLAND", "섬"), - LABORATORY("LABORATORY", "연구소"), - END("END", "???"), - EMPTY("", ""), - ; - - private final String id; - private final String name; - - Biome(String id, String name) { - this.id = id; - this.name = name; - } - - public static Biome findById(String id) { - return Arrays.stream(values()) - .filter(value -> value.getId().toLowerCase() - .replace("-", "_") - .replace(" ", "_") - .equals(id) - ) - .findFirst() - .orElse(EMPTY); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Move.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Move.java deleted file mode 100644 index a6e86bffa..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/Move.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.pokerogue.helper.pokemon2.data; - -public record Move(String id, String name, String effect, String power, String accuracy, String type, String category) { -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/MoveCategory.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/MoveCategory.java deleted file mode 100644 index d4e48cfb3..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/data/MoveCategory.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pokerogue.helper.pokemon2.data; - -import java.util.Arrays; -import java.util.Optional; -import lombok.Getter; - -@Getter -public enum MoveCategory { - - STATUS("status", "변화", "https://dl70s9ccojnge.cloudfront.net/pokerogue-helper/pokerogue/move-category/status.png"), - SPECIAL("special", "특수", - "https://dl70s9ccojnge.cloudfront.net/pokerogue-helper/pokerogue/move-category/special.png"), - PHYSICAL("physical", "물리", - "https://dl70s9ccojnge.cloudfront.net/pokerogue-helper/pokerogue/move-category/physical.png"), - ; - - private final String id; - private final String name; - private final String image; - - MoveCategory(String id, String name, String image) { - this.id = id; - this.name = name; - this.image = image; - } - - public static MoveCategory findById(String id) { - return Arrays.stream(values()) - .filter(category -> category.id.equals(id)) - .findAny() - .orElseThrow(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/BiomeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/BiomeResponse.java deleted file mode 100644 index e64354896..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/BiomeResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.pokerogue.helper.pokemon2.dto; - -public record BiomeResponse(String id, String name, String image) { - -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/MoveResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/MoveResponse.java deleted file mode 100644 index fa22265fd..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/MoveResponse.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.pokerogue.helper.pokemon2.dto; - -import com.pokerogue.helper.pokemon2.data.Move; -import com.pokerogue.helper.pokemon2.data.MoveCategory; -import com.pokerogue.helper.pokemon2.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(Move move, Integer level, String typeImageFromS3) { - MoveCategory moveCategory = MoveCategory.findById(move.category()); - Type type1 = Type.findById(move.type()); - - return new MoveResponse( - move.id(), - move.name(), - level, - Integer.parseInt(move.power()), - Integer.parseInt(move.accuracy()), - type1.getName(), - typeImageFromS3, - moveCategory.getName(), - moveCategory.getImage() - ); - } - -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2Response.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2Response.java deleted file mode 100644 index 308ebd928..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/dto/Pokemon2Response.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pokerogue.helper.pokemon2.dto; - -import com.pokerogue.helper.pokemon2.data.Pokemon; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import java.util.List; - -public record Pokemon2Response( - String id, - Long pokedexNumber, - String name, - String formName, - String image, - String backImage, - List pokemonTypeResponse, - Integer generation, - Integer totalStats, - Integer hp, - Integer speed, - Integer attack, - Integer defense, - Integer specialAttack, - Integer specialDefense -) { - public static Pokemon2Response from(Pokemon pokemon, String image, String backImage, List pokemonTypeResponse) { - - return new Pokemon2Response( - pokemon.id(), - Long.parseLong(pokemon.speciesId()), - pokemon.koName(), - pokemon.formName(), - image, - backImage, - pokemonTypeResponse, - pokemon.generation(), - pokemon.baseTotal(), - pokemon.hp(), - pokemon.attack(), - pokemon.defense(), - pokemon.specialAttack(), - pokemon.specialDefense(), - pokemon.speed() - ); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/MoveRepository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/MoveRepository.java deleted file mode 100644 index 5be41afe6..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/MoveRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pokerogue.helper.pokemon2.repository; - - -import com.pokerogue.helper.pokemon2.data.Move; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.TreeMap; -import org.springframework.stereotype.Repository; - -@Repository -public class MoveRepository { - private final Map data = new HashMap<>(); - - public Optional findById(String id) { - return Optional.ofNullable(data.get(id)); - } - - public void save(String key, Move value) { - data.put(key, value); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/Pokemon2Repository.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/Pokemon2Repository.java deleted file mode 100644 index db5bd6f72..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/repository/Pokemon2Repository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pokerogue.helper.pokemon2.repository; - - -import com.pokerogue.helper.pokemon2.data.Pokemon; -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import java.util.TreeMap; -import org.springframework.stereotype.Repository; - -@Repository -public class Pokemon2Repository { - private final Map data = new TreeMap<>(); - - public Map findAll() { - return Collections.unmodifiableMap(data); - } - - public Optional findById(String id) { - return Optional.ofNullable(data.get(id)); - } - - public void save(String key, Pokemon pokemon) { - data.put(key, pokemon); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/service/Pokemon2Service.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/service/Pokemon2Service.java deleted file mode 100644 index 594e3806d..000000000 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/pokemon2/service/Pokemon2Service.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.pokerogue.helper.pokemon2.service; - - -import com.pokerogue.external.s3.service.S3Service; -import com.pokerogue.helper.pokemon2.data.Ability; -import com.pokerogue.helper.pokemon2.data.Biome; -import com.pokerogue.helper.pokemon2.data.Evolution; -import com.pokerogue.helper.pokemon2.data.EvolutionChain; -import com.pokerogue.helper.pokemon2.data.EvolutionItem; -import com.pokerogue.helper.pokemon2.data.Pokemon; -import com.pokerogue.helper.pokemon2.data.Type; -import com.pokerogue.helper.pokemon2.dto.BiomeResponse; -import com.pokerogue.helper.pokemon2.dto.EvolutionResponse; -import com.pokerogue.helper.pokemon2.dto.EvolutionResponses; -import com.pokerogue.helper.pokemon2.dto.MoveResponse; -import com.pokerogue.helper.pokemon2.dto.Pokemon2DetailResponse; -import com.pokerogue.helper.pokemon2.dto.Pokemon2Response; -import com.pokerogue.helper.pokemon2.dto.PokemonAbilityResponse; -import com.pokerogue.helper.pokemon2.repository.EvolutionRepository; -import com.pokerogue.helper.pokemon2.repository.MoveRepository; -import com.pokerogue.helper.pokemon2.repository.Pokemon2Repository; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class Pokemon2Service { - - private final S3Service s3Service; - private final Pokemon2Repository pokemon2Repository; - private final MoveRepository moveRepository; - private final EvolutionRepository evolutionRepository; - - private List findAllCache = List.of(); - private Map findByIdCache = new HashMap<>(); - - public List findAll() { - if (findAllCache.isEmpty()) { - initFindAllCache(); - } - return findAllCache; - } - - private void initFindAllCache() { - findAllCache = pokemon2Repository.findAll().values().stream() - .map(pokemon -> Pokemon2Response.from( - pokemon, - s3Service.getPokemonImageFromS3(pokemon.id()), - s3Service.getPokemonBackImageFromS3(pokemon.id()), - createTypeResponse(pokemon) - )) - .sorted(Comparator.comparingLong(Pokemon2Response::pokedexNumber)) - .toList(); - } - - public Pokemon2DetailResponse findById(String id) { - if (findByIdCache.isEmpty()) { - initFindByIdCache(); - } - return findByIdCache.get(id); - } - - private void initFindByIdCache() { - List pokemon2DetailResponses = pokemon2Repository.findAll().values() - .stream() - .map(this::toPokemon2DetailResponse) - .toList(); - - findByIdCache = pokemon2DetailResponses.stream().collect( - Collectors.toMap( - Pokemon2DetailResponse::id, - Function.identity() - )); - } - - private Pokemon2DetailResponse toPokemon2DetailResponse(Pokemon pokemon) { - List pokemonTypeResponses = createTypeResponse(pokemon); - List pokemonAbilityResponses = createAbilityResponse(pokemon); - EvolutionResponses evolutionResponses = createEvolutionResponse(pokemon); - List moveResponse = createMoveResponse(pokemon.moves()); - List eggMoveResponse = createEggMoveResponse(pokemon.eggMoves()); - List biomeResponse = createBiomeResponse(pokemon.biomes()); - - return new Pokemon2DetailResponse( - pokemon.id(), - Long.parseLong(pokemon.speciesId()), - pokemon.koName(), - s3Service.getPokemonImageFromS3(pokemon.id()), - pokemonTypeResponses, - pokemonAbilityResponses, - pokemon.baseTotal(), - pokemon.hp(), - pokemon.attack(), - pokemon.defense(), - pokemon.specialAttack(), - pokemon.specialDefense(), - pokemon.speed(), - pokemon.legendary(), - pokemon.subLegendary(), - pokemon.mythical(), - pokemon.canChangeForm(), - pokemon.weight(), - pokemon.height(), - evolutionResponses, - moveResponse, - eggMoveResponse, - biomeResponse - ); - } - - private EvolutionResponses createEvolutionResponse(Pokemon pokemon) { - EvolutionChain chain = evolutionRepository.findEvolutionChainById(pokemon.id()) - .orElseThrow(() -> new IllegalArgumentException()); - - int currentStage = IntStream.range(0, chain.getChain().size()) - .filter(i -> chain.getChain().get(i).stream().anyMatch(r -> r.equals(pokemon.id()))) - .sum(); - - return new EvolutionResponses( - currentStage, - createStages(chain) - ); - } - - private List createStages(EvolutionChain evolutionChain) { - List> chain = evolutionChain.getChain(); - List ret = new ArrayList<>(); - - Pokemon firstPokemon = pokemon2Repository.findById(chain.get(0).get(0)) - .orElseThrow(() -> new IllegalArgumentException()); - - ret.add(new EvolutionResponse( - firstPokemon.id(), - firstPokemon.koName(), - 1, - 0, - "", - "", - s3Service.getPokemonImageFromS3(firstPokemon.id()) - )); - - for (int i = 0; i < chain.size() - 1; i++) { - List stage = chain.get(i); - for (String id : stage) { - List evolutions = evolutionRepository.findEdgeById(id) - .orElse(null); - - if (evolutions == null) { - continue; - } - - for (Evolution evolution : evolutions) { - Pokemon pokemon = pokemon2Repository.findById(evolution.to()) - .orElseThrow(() -> new IllegalArgumentException("")); - ret.add(new EvolutionResponse( - pokemon.id(), - pokemon.koName(), - Integer.parseInt(evolution.level()), - i + 1, - EvolutionItem.findById(evolution.item()).getKoName(), - evolution.condition(), - s3Service.getPokemonImageFromS3(pokemon.id()) - )); - } - } - } - return ret; - } - - private List createAbilityResponse(Pokemon pokemon) { - List ret = new ArrayList<>(); - - Ability passive = Ability.findById(pokemon.abilityPassive()); - Ability hidden = Ability.findById(pokemon.abilityHidden()); - Ability ability1 = Ability.findById(pokemon.ability1()); - Ability ability2 = Ability.findById(pokemon.ability2()); - - ret.add(new PokemonAbilityResponse( - pokemon.abilityPassive(), passive.getName(), passive.getDescription(), - true, false - )); - - List defaultAbilities = Stream.of(ability1, ability2) - .distinct() - .filter(ability -> ability != Ability.EMPTY) - .map(ability -> new PokemonAbilityResponse( - pokemon.ability1(), ability.getName(), - ability.getDescription(), false, false) - ) - .toList(); - - ret.addAll(defaultAbilities); - - if (hidden != Ability.EMPTY) { - ret.add(new PokemonAbilityResponse(pokemon.abilityHidden(), hidden.getName(), hidden.getDescription(), - false, - true)); - - for (int i = 1; i < ret.size() - 1; i++) { - if (Ability.findById(ret.get(i).id()) == hidden) { - ret.remove(i); - break; - } - } - - } - - return ret; - } - - private List createTypeResponse(Pokemon pokemon) { - Type type1 = Type.findById(pokemon.type1()); - Type type2 = Type.findById(pokemon.type2()); - return Stream.of(type1, type2) - .distinct() - .filter(type -> type != Type.EMPTY) - .map(type -> new PokemonTypeResponse(type.getName(), - s3Service.getPokerogueTypeImageFromS3(type.getId().toLowerCase()))) - .toList(); - } - - private List createBiomeResponse(List biomes) { - return biomes.stream() - .map(id -> { - Biome biome = Biome.findById(id); - return new BiomeResponse( - id, - biome.getName(), - s3Service.getBiomeImageFromS3(id) - ); - } - ) - .toList(); - } - - private List createEggMoveResponse(List moves) { - return moves.stream() - .map(r -> moveRepository.findById(r).orElseThrow(() -> new IllegalArgumentException())) - .map(move -> MoveResponse.from(move, 1, - s3Service.getPokerogueTypeImageFromS3(moveRepository.findById(move.id()) - .orElseThrow(() -> new IllegalArgumentException()) - .type()))) - .toList(); - } - - private List createMoveResponse(List moves) { - return IntStream.iterate(0, index -> index + 2) - .limit(moves.size() / 2) - .mapToObj(index -> MoveResponse.from( - moveRepository.findById(moves.get(index)).orElseThrow(), - Integer.parseInt(moves.get(index + 1)), - s3Service.getPokerogueTypeImageFromS3( - moveRepository.findById(moves.get(index)).orElseThrow().type()) - )) - .toList(); - } -} diff --git a/backend/pokerogue/src/main/java/com/pokerogue/helper/type/dto/PokemonTypeResponse.java b/backend/pokerogue/src/main/java/com/pokerogue/helper/type/dto/PokemonTypeResponse.java index d63f79ff4..233da444d 100644 --- a/backend/pokerogue/src/main/java/com/pokerogue/helper/type/dto/PokemonTypeResponse.java +++ b/backend/pokerogue/src/main/java/com/pokerogue/helper/type/dto/PokemonTypeResponse.java @@ -1,6 +1,5 @@ package com.pokerogue.helper.type.dto; -import com.pokerogue.helper.pokemon2.data.Pokemon; import com.pokerogue.helper.type.domain.PokemonType; public record PokemonTypeResponse(String typeName, String typeLogo) { diff --git a/backend/pokerogue/src/main/resources b/backend/pokerogue/src/main/resources index 87d01a886..eff425cd1 160000 --- a/backend/pokerogue/src/main/resources +++ b/backend/pokerogue/src/main/resources @@ -1 +1 @@ -Subproject commit 87d01a886c64e48d3aac2be5894c56b19ee665dc +Subproject commit eff425cd1976d136a1b4171ae55ea06839d1b19e diff --git a/backend/pokerogue/src/test/java/com/pokerogue/environment/client/FakePokeClient.java b/backend/pokerogue/src/test/java/com/pokerogue/environment/client/FakePokeClient.java deleted file mode 100644 index af4440084..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/environment/client/FakePokeClient.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.pokerogue.environment.client; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.pokerogue.external.pokemon.client.PokeClient; -import com.pokerogue.external.pokemon.dto.CountResponse; -import com.pokerogue.external.pokemon.dto.DataUrl; -import com.pokerogue.external.pokemon.dto.DataUrls; -import com.pokerogue.external.pokemon.dto.ability.AbilityResponse; -import com.pokerogue.external.pokemon.dto.pokemon.PokemonSaveResponse; -import com.pokerogue.external.pokemon.dto.pokemon.species.PokemonSpeciesResponse; -import com.pokerogue.external.pokemon.dto.type.TypeMatchingResponse; -import com.pokerogue.external.pokemon.dto.type.TypeResponse; - -import java.io.File; -import java.io.FileNotFoundException; -import java.util.List; - -public class FakePokeClient extends PokeClient { - - private static final List abilityDataUrls = List.of( - new DataUrl("stench", "https://pokeapi.co/api/v2/ability/1/"), - new DataUrl("drizzle", "https://pokeapi.co/api/v2/ability/2/"), - new DataUrl("speed-boost", "https://pokeapi.co/api/v2/ability/3/"), - new DataUrl("damp", "https://pokeapi.co/api/v2/ability/6/"), - new DataUrl("water-absorb", "https://pokeapi.co/api/v2/ability/11/"), - new DataUrl("compound-eyes", "https://pokeapi.co/api/v2/ability/14/"), - new DataUrl("chlorophyll", "https://pokeapi.co/api/v2/ability/34/"), - new DataUrl("sticky-hold", "https://pokeapi.co/api/v2/ability/60/"), - new DataUrl("blaze", "https://pokeapi.co/api/v2/ability/66/"), - new DataUrl("frisk", "https://pokeapi.co/api/v2/ability/119/"), - new DataUrl("poison-touch", "https://pokeapi.co/api/v2/ability/143/") - ); - private static final List pokemonDataUrls = List.of( - new DataUrl("gloom", "https://pokeapi.co/api/v2/pokemon/44/"), - new DataUrl("grimer", "https://pokeapi.co/api/v2/pokemon/88/"), - new DataUrl("politoed", "https://pokeapi.co/api/v2/pokemon/186/"), - new DataUrl("kyogre", "https://pokeapi.co/api/v2/pokemon/382/"), - new DataUrl("yanma", "https://pokeapi.co/api/v2/pokemon/193/"), - new DataUrl("torchic", "https://pokeapi.co/api/v2/pokemon/255/") - ); - private static final String JSON_PATH = "src/test/resources/json/"; - private static final String ABILITY_JSON_PATH = JSON_PATH + "ability/ability-%s.json"; - private static final String POKEMON_JSON_PATH = JSON_PATH + "pokemon/pokemon-%s.json"; - private static final String POKEMON_SPECIES_JSON_PATH = JSON_PATH + "pokemon-species/pokemon-species-%s.json"; - private static final String TYPE_JSON_PATH = JSON_PATH + "type/type-%s.json"; - private static final ObjectMapper mapper = new ObjectMapper(); - public static final int TEST_POKEMON_COUNT; - public static final int TEST_ABILITY_COUNT; - public static final int TEST_TYPE_COUNT = 19; - - static { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - TEST_POKEMON_COUNT = pokemonDataUrls.size(); - TEST_ABILITY_COUNT = abilityDataUrls.size(); - } - - public FakePokeClient() { - super(null); - } - - @Override - public CountResponse getAbilityResponsesCount() { - return new CountResponse(TEST_ABILITY_COUNT); - } - - @Override - public DataUrls getAbilityResponses(int limit) { - return new DataUrls(abilityDataUrls); - } - - @Override - public AbilityResponse getAbilityResponse(String id) { - String path = String.format(ABILITY_JSON_PATH, id); - - return deserializeTestFixture(AbilityResponse.class, path); - } - - @Override - public CountResponse getTypeResponsesCount() { - return new CountResponse(TEST_TYPE_COUNT); - } - - @Override - public DataUrls getTypeResponses(int limit) { - String path = String.format(TYPE_JSON_PATH, "all"); - - return deserializeTestFixture(DataUrls.class, path); - } - - @Override - public TypeResponse getTypeResponse(String id) { - String path = String.format(TYPE_JSON_PATH, id); - - return deserializeTestFixture(TypeResponse.class, path); - } - - @Override - public CountResponse getPokemonResponsesCount() { - return new CountResponse(TEST_POKEMON_COUNT); - } - - @Override - public DataUrls getPokemonResponses(int offset, int limit) { - return new DataUrls(pokemonDataUrls); - } - - @Override - public PokemonSaveResponse getPokemonSaveResponse(String id) { - String path = String.format(POKEMON_JSON_PATH, id); - - return deserializeTestFixture(PokemonSaveResponse.class, path); - } - - @Override - public PokemonSpeciesResponse getPokemonSpeciesResponse(String id) { - String path = String.format(POKEMON_SPECIES_JSON_PATH, id); - - return deserializeTestFixture(PokemonSpeciesResponse.class, path); - } - - @Override - public TypeMatchingResponse getTypeMatchingResponse(String id) { - String path = String.format(TYPE_JSON_PATH, id); - - return deserializeTestFixture(TypeMatchingResponse.class, path); - } - - @Override - public byte[] getPixelImage(String id) { - return null; - } - - @Override - public byte[] getArtImage(String id) { - return null; - } - - private T deserializeTestFixture(Class dtoType, String path) { - try { - return mapper.readValue(new File(path), dtoType); - } catch (FileNotFoundException e) { - throw new RuntimeException("해당하는 json 파일을 찾을 수 없습니다."); - } catch (Exception e) { - throw new RuntimeException("테스트 데이터 역직렬화에 실패했습니다."); - } - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/environment/client/TestClientConfig.java b/backend/pokerogue/src/test/java/com/pokerogue/environment/client/TestClientConfig.java index c3970c79a..b01dd408c 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/environment/client/TestClientConfig.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/environment/client/TestClientConfig.java @@ -1,6 +1,5 @@ package com.pokerogue.environment.client; -import com.pokerogue.external.pokemon.client.PokeClient; import com.pokerogue.external.s3.client.S3ImageClient; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; @@ -8,11 +7,6 @@ @TestConfiguration public class TestClientConfig { - @Bean - public PokeClient pokeClient() { - return new FakePokeClient(); - } - @Bean public S3ImageClient s3ImageClient() { return new FakeS3ImageClient(); diff --git a/backend/pokerogue/src/test/java/com/pokerogue/environment/controller/ControllerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/environment/controller/ControllerTest.java deleted file mode 100644 index c72ff4628..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/environment/controller/ControllerTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pokerogue.environment.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.web.servlet.MockMvc; - -public abstract class ControllerTest { - - @Autowired - protected MockMvc mockMvc; - - @Autowired - protected ObjectMapper objectMapper; -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/ability/service/PokemonAbilityServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/ability/service/PokemonAbilityServiceTest.java deleted file mode 100644 index f25dd32b8..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/ability/service/PokemonAbilityServiceTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.pokerogue.helper.ability.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.ability.dto.PokemonAbilityWithPokemonsResponse; -import com.pokerogue.helper.ability.dto.SameAbilityPokemonResponse; -import com.pokerogue.helper.ability.repository.PokemonAbilityRepository; -import com.pokerogue.helper.global.exception.ErrorMessage; -import com.pokerogue.helper.global.exception.GlobalCustomException; -import com.pokerogue.helper.type.domain.PokemonType; -import com.pokerogue.helper.type.dto.PokemonTypeResponse; -import com.pokerogue.helper.type.repository.PokemonTypeRepository; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -class PokemonAbilityServiceTest extends ServiceTest { - - @Autowired - private PokemonAbilityService pokemonAbilityService; - - @Autowired - private PokemonAbilityRepository pokemonAbilityRepository; - - @Autowired - private PokemonTypeRepository pokemonTypeRepository; - - @Test - @DisplayName("존재하지 않는 포켓몬의 특성을 조회하면 예외가 발생한다.") - void findAbilityDetailsWhenAbilityIdNotExist() { - assertThatThrownBy(() -> pokemonAbilityService.findAbilityDetails(Long.MAX_VALUE)) - .isInstanceOf(GlobalCustomException.class) - .hasMessage(ErrorMessage.POKEMON_ABILITY_NOT_FOUND.getMessage()); - } - - @Test - @DisplayName("같은 특성을 가진 포켓몬 목록을 조회할 때 id 순으로 정렬한다.") - void findPokemonsOrderByIdInAbilityDetails() { - Long abilityId = pokemonAbilityRepository.findAll().get(0).getId(); - - PokemonAbilityWithPokemonsResponse pokemonAbilityWithPokemons = pokemonAbilityService.findAbilityDetails( - abilityId); - - List pokemonIds = pokemonAbilityWithPokemons.pokemons().stream() - .map(SameAbilityPokemonResponse::id) - .toList(); - assertThat(pokemonIds).isSortedAccordingTo(Long::compare); - } - - @Test - @DisplayName("같은 특성을 가진 포켓몬 목록을 조회할 때 포켓몬의 타입을 id 순으로 정렬한다.") - void findPokemonsWithTypesOrderByIdInAbilityDetails() { - Long abilityId = pokemonAbilityRepository.findAll().get(0).getId(); - - PokemonAbilityWithPokemonsResponse pokemonAbilityWithPokemons = pokemonAbilityService.findAbilityDetails( - abilityId); - - List> pokemonTypeNamesInResponse = pokemonTypeNamesGroupByPokemon(pokemonAbilityWithPokemons); - Map allPokemonTypeNamesWithId = findAllPokemonTypeNamesWithId(); - assertAll(() -> pokemonTypeNamesInResponse.forEach(typeNames -> - assertThat(typeNames).isSortedAccordingTo(Comparator.comparingLong(allPokemonTypeNamesWithId::get)))); - } - - private List> pokemonTypeNamesGroupByPokemon( - PokemonAbilityWithPokemonsResponse pokemonAbilityWithPokemons) { - return pokemonAbilityWithPokemons.pokemons().stream() - .map(SameAbilityPokemonResponse::pokemonTypeResponses) - .map(pokemonTypeResponses -> pokemonTypeResponses.stream() - .map(PokemonTypeResponse::typeName) - .toList()) - .toList(); - } - - private Map findAllPokemonTypeNamesWithId() { - return pokemonTypeRepository.findAll().stream() - .collect(Collectors.toMap(PokemonType::getName, PokemonType::getId)); - } -} 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 abc83d37f..ec8c06b7b 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,6 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.pokerogue.environment.service.ServiceTest; +import com.pokerogue.helper.pokemon.data.Pokemon; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,18 +17,18 @@ class BattleServiceTest extends ServiceTest { private BattleService battleService; @Autowired - private PokemonMovesByMachineRepository pokemonMovesByMachineRepository; + private PokemonRepository pokemonRepository; @Test @DisplayName("포켓몬의 기술(자력 기술, 머신 기술, 알 기술) 리스트를 조회한다.") void findMovesByPokemon() { - List pokedexNumbers = pokemonMovesByMachineRepository.findAll() + List pokemonIds = pokemonRepository.findAll().values() .stream() - .map(PokemonMovesByMachine::pokedexNumber) + .map(Pokemon::id) .toList(); - pokedexNumbers.forEach(pokedexNumber -> { - List moveResponses = battleService.findMovesByPokemon(pokedexNumber); + pokemonIds.forEach(pokemonId -> { + List moveResponses = battleService.findMovesByPokemon(pokemonId); assertThat(moveResponses).isNotEmpty(); }); } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java index 00bdf4247..ca3523020 100644 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/battle/DataInitializerTest.java @@ -13,27 +13,15 @@ class DataInitializerTest { @DisplayName("날씨, 기술 데이터를 세팅한다.") void setWeathersData() { BattleMoveRepository battleMoveRepository = new BattleMoveRepository(); - PokemonMovesByMachineRepository pokemonMovesByMachineRepository = new PokemonMovesByMachineRepository(); - PokemonMovesBySelfRepository pokemonMovesBySelfRepository = new PokemonMovesBySelfRepository(); - PokemonMovesByEggRepository pokemonMovesByEggRepository = new PokemonMovesByEggRepository(); - BattlePokemonRepository battlePokemonRepository = new BattlePokemonRepository(); TypeMatchingRepository typeMatchingRepository = new TypeMatchingRepository(); DataInitializer dataInitializer = new DataInitializer( battleMoveRepository, - pokemonMovesByMachineRepository, - pokemonMovesBySelfRepository, - pokemonMovesByEggRepository, - battlePokemonRepository, typeMatchingRepository ); dataInitializer.run(new DefaultApplicationArguments()); assertAll(() -> { assertThat(battleMoveRepository.findAll()).hasSize(920); - assertThat(pokemonMovesByMachineRepository.findAll()).hasSize(1082); - assertThat(pokemonMovesBySelfRepository.findAll()).hasSize(1082); - assertThat(pokemonMovesByEggRepository.findAll()).hasSize(1082); - assertThat(battlePokemonRepository.findAll()).hasSize(1268); assertThat(typeMatchingRepository.findAll()).hasSize(361); }); } diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonDatabaseInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonDatabaseInitializerTest.java new file mode 100644 index 000000000..7cdf4ee50 --- /dev/null +++ b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/data/PokemonDatabaseInitializerTest.java @@ -0,0 +1,47 @@ +package com.pokerogue.helper.pokemon.data; + +import com.pokerogue.helper.ability.repository.AbilityRepository; +import com.pokerogue.helper.pokemon.config.PokemonDatabaseInitializer; +import com.pokerogue.helper.pokemon.repository.EvolutionRepository; +import com.pokerogue.helper.pokemon.repository.PokemonRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.boot.DefaultApplicationArguments; + +class PokemonDatabaseInitializerTest { + + @Test + @DisplayName("포켓몬 정보가 지정된 개수만큼 저장된다") + void savePokemonCount() { + PokemonRepository pokemonRepository = new PokemonRepository(); + PokemonDatabaseInitializer pokemonDatabaseInitializer = new PokemonDatabaseInitializer( + pokemonRepository, + new EvolutionRepository(), + new AbilityRepository() + ); + + pokemonDatabaseInitializer.run(new DefaultApplicationArguments()); + + Assertions.assertThat(pokemonRepository.findAll()).hasSize(1268); + } + + @ParameterizedTest + @ValueSource(strings = {"bulbasaur", "chikorita", "wailmer", "virizion", "golisopod", "melmetal", "spidops", + "hydrapple", "alola_exeggutor"}) + @DisplayName("포켓몬의 저장된 이름을 확인한다") + void savePokemonNames(String name) { + PokemonRepository pokemonRepository = new PokemonRepository(); + PokemonDatabaseInitializer pokemonDatabaseInitializer = new PokemonDatabaseInitializer( + pokemonRepository, + new EvolutionRepository(), + new AbilityRepository() + ); + + pokemonDatabaseInitializer.run(new DefaultApplicationArguments()); + + Assertions.assertThat(pokemonRepository.findById(name)).isNotNull(); + } +} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/domain/PokemonTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/domain/PokemonTest.java deleted file mode 100644 index 3ad8b60c0..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/domain/PokemonTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pokerogue.helper.pokemon.domain; - -import static org.assertj.core.api.Assertions.assertThat; - -import com.pokerogue.helper.type.domain.PokemonType; -import java.util.Comparator; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class PokemonTest { - - @Test - @DisplayName("포켓몬의 타입 목록을 id 순으로 조회한다.") - void getSortedPokemonTypes() { - List pokemonTypes = List.of( - new PokemonType(2L, "grass", "풀", "grass dummy image"), - new PokemonType(1L, "poison", "독", "poison dummy image") - ); - List pokemonTypeMappings = pokemonTypes.stream() - .map(type -> new PokemonTypeMapping(null, type)) - .toList(); - Pokemon pokemon = new Pokemon(1L, 1L, "이상해씨", "이상해씨", 6.9, 0.7, 45, 45, 55, 50, 60, 70, 500, - "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png", pokemonTypeMappings, - List.of()); - - List sortedPokemonTypes = pokemon.getSortedPokemonTypes(); - - assertThat(sortedPokemonTypes).isSortedAccordingTo(Comparator.comparingLong(PokemonType::getId)); - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/service/PokemonServiceTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/service/PokemonServiceTest.java deleted file mode 100644 index 45b18b7b0..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon/service/PokemonServiceTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.pokerogue.helper.pokemon.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.pokemon.dto.PokedexResponse; -import com.pokerogue.helper.pokemon.dto.PokemonResponse; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -class PokemonServiceTest extends ServiceTest { - - @Autowired - private PokemonService pokemonService; - - @Test - @DisplayName("모든 포켓몬 목록을 조회한다.") - void findPokemons() { - List pokemons = pokemonService.findPokemons(); - - assertThat(pokemons).isNotEmpty(); - } - - @Test - @DisplayName("한 포켓몬의 도감 상세 정보를 조회한다.") - void findPokedexDetails() { - long pokemonId = pokemonService.findPokemons().get(0).id(); - - PokedexResponse pokedexDetails = pokemonService.findPokedexDetails(pokemonId); - - assertAll(() -> { - assertThat(pokedexDetails.pokedexNumber()).isNotNull(); - assertThat(pokedexDetails.pokemonTypeResponses()).isNotEmpty(); - assertThat(pokedexDetails.pokemonAbilityResponses()).isNotEmpty(); - }); - } - - @Test - @DisplayName("존재하지 않는 포켓몬의 상세 정보를 조회하면 예외가 발생한다.") - void findPokedexDetailsWhenNotExist() { - assertThatThrownBy(() -> pokemonService.findPokedexDetails(Long.MAX_VALUE)) - .isInstanceOf(GlobalCustomException.class) - .hasMessage(ErrorMessage.POKEMON_NOT_FOUND.getMessage()); - } -} diff --git a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon2/data/Pokemon2DatabaseInitializerTest.java b/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon2/data/Pokemon2DatabaseInitializerTest.java deleted file mode 100644 index d98bfc8df..000000000 --- a/backend/pokerogue/src/test/java/com/pokerogue/helper/pokemon2/data/Pokemon2DatabaseInitializerTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pokerogue.helper.pokemon2.data; - -import com.pokerogue.helper.pokemon2.config.Pokemon2DatabaseInitializer; -import com.pokerogue.helper.pokemon2.repository.EvolutionRepository; -import com.pokerogue.helper.pokemon2.repository.MoveRepository; -import com.pokerogue.helper.pokemon2.repository.Pokemon2Repository; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.boot.DefaultApplicationArguments; - -class Pokemon2DatabaseInitializerTest { - - @Test - @DisplayName("포켓몬 정보가 지정된 개수만큼 저장된다") - void savePokemonCount() { - Pokemon2Repository pokemon2Repository = new Pokemon2Repository(); - Pokemon2DatabaseInitializer pokemon2DatabaseInitializer = new Pokemon2DatabaseInitializer( - pokemon2Repository, - new MoveRepository(), - new EvolutionRepository() - ); - - pokemon2DatabaseInitializer.run(new DefaultApplicationArguments()); - - Assertions.assertThat(pokemon2Repository.findAll()).hasSize(1268); - } - - @ParameterizedTest - @ValueSource(strings = {"bulbasaur", "chikorita", "wailmer", "virizion", "golisopod", "melmetal", "spidops", - "hydrapple", "alola_exeggutor"}) - @DisplayName("포켓몬의 저장된 이름을 확인한다") - void savePokemonNames(String name) { - Pokemon2Repository pokemon2Repository = new Pokemon2Repository(); - Pokemon2DatabaseInitializer pokemon2DatabaseInitializer = new Pokemon2DatabaseInitializer( - pokemon2Repository, - new MoveRepository(), - new EvolutionRepository() - ); - - pokemon2DatabaseInitializer.run(new DefaultApplicationArguments()); - - Assertions.assertThat(pokemon2Repository.findById(name)).isNotNull(); - } -}