Skip to content

Commit

Permalink
Merge pull request #61 from woowacourse-teams/be/feat/#58-get-ability…
Browse files Browse the repository at this point in the history
…-detail-api

[BE-FEAT] 단일 특성 정보를 불러오는 API
  • Loading branch information
dwax1324 authored Jul 24, 2024
2 parents ed2fff2 + 7d0f70a commit a097eb2
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
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 org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -18,4 +20,9 @@ public class PokemonAbilityController {
public ApiResponse<List<PokemonAbilityResponse>> abilityList() {
return new ApiResponse<>("특성 리스트 불러오기에 성공했습니다.", pokemonAbilityService.findAbilities());
}

@GetMapping("/api/v1/ability/{id}")
public ApiResponse<PokemonAbilityWithPokemonsResponse> abilityDetails(@PathVariable("id") Long id) {
return new ApiResponse<>("특성 정보 불러오기에 성공했습니다.", pokemonAbilityService.findAbilityDetails(id));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.pokerogue.helper.ability.dto;

import java.util.List;

public record PokemonAbilityWithPokemonsResponse(String name, String description, List<SameAbilityPokemonResponse> pokemons) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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 name,
String image,
List<PokemonTypeResponse> pokemonTypeResponses
) {
public static SameAbilityPokemonResponse from(Pokemon pokemon, List<PokemonTypeResponse> pokemonTypeResponses) {
Long id = pokemon.getId();
Long pokedexNumber = pokemon.getPokedexNumber();
String name = pokemon.getName();
String image = pokemon.getImage();

return new SameAbilityPokemonResponse(id, pokedexNumber, name, image, pokemonTypeResponses);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
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<PokemonAbility, Long> {


@NonNull
@Query("""
select a from PokemonAbility a
join fetch a.pokemonAbilityMappings m
""")
Optional<PokemonAbility> findByIdWithPokemonMappings(@NonNull @Param("id") Long id);

Optional<PokemonAbility> findByName(String name);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@

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.pokemon.domain.PokemonTypeMapping;
import com.pokerogue.helper.pokemon.repository.PokemonRepository;
import com.pokerogue.helper.type.dto.PokemonTypeResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -21,4 +30,23 @@ public List<PokemonAbilityResponse> findAbilities() {
.map(PokemonAbilityResponse::from)
.toList();
}

public PokemonAbilityWithPokemonsResponse findAbilityDetails(Long id) {
PokemonAbility ability = pokemonAbilityRepository.findByIdWithPokemonMappings(id)
.orElseThrow(() -> new GlobalCustomException(ErrorMessage.POKEMON_ABILITY_NOT_FOUND));

List<SameAbilityPokemonResponse> pokemonResponses = ability.getPokemonAbilityMappings().stream()
.map(PokemonAbilityMapping::getPokemon)
.map(pokemon -> SameAbilityPokemonResponse.from(pokemon, toPokemonTypeResponse(pokemon)))
.toList();

return new PokemonAbilityWithPokemonsResponse(ability.getName(), ability.getDescription(), pokemonResponses);
}

private List<PokemonTypeResponse> toPokemonTypeResponse(Pokemon pokemon) {
return pokemon.getPokemonTypeMappings().stream()
.map(PokemonTypeMapping::getPokemonType)
.map(PokemonTypeResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ public List<PokemonResponse> findPokemons() {

private PokemonResponse toPokemonResponse(Pokemon pokemon) {
List<PokemonTypeMapping> pokemonTypeMappings = pokemon.getPokemonTypeMappings();

List<PokemonTypeResponse> pokemonTypeResponses = pokemonTypeMappings.stream()
.map(PokemonTypeMapping::getPokemonType)
.map(PokemonTypeResponse::from)
Expand All @@ -47,14 +46,11 @@ public PokedexResponse findPokedexDetails(Long id) {
}

private PokedexResponse toPokedexResponse(Pokemon pokemon) {
List<PokemonTypeMapping> pokemonTypeMappings = pokemon.getPokemonTypeMappings();
List<PokemonAbilityMapping> pokemonAbilityMappings = pokemon.getPokemonAbilityMappings();

List<PokemonTypeResponse> pokemonTypeResponses = pokemonTypeMappings.stream()
List<PokemonTypeResponse> pokemonTypeResponses = pokemon.getPokemonTypeMappings().stream()
.map(PokemonTypeMapping::getPokemonType)
.map(PokemonTypeResponse::from)
.toList();
List<String> pokemonAbilityNames = pokemonAbilityMappings.stream()
List<String> pokemonAbilityNames = pokemon.getPokemonAbilityMappings().stream()
.map(PokemonAbilityMapping::getPokemonAbilityName)
.toList();

Expand Down

0 comments on commit a097eb2

Please sign in to comment.