diff --git a/pom.xml b/pom.xml index 6637fce..f999658 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,12 @@ spring-boot-starter-oauth2-client + + org.apache.httpcomponents + httpclient + 4.5 + + diff --git a/src/main/java/lbs/lbs/controller/SummonerController.java b/src/main/java/lbs/lbs/controller/SummonerController.java new file mode 100644 index 0000000..1f75326 --- /dev/null +++ b/src/main/java/lbs/lbs/controller/SummonerController.java @@ -0,0 +1,34 @@ +package lbs.lbs.controller; + +import lbs.lbs.entity.MatchId; +import lbs.lbs.entity.Summoner; +import lbs.lbs.service.SummonerService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@RestController +@RequestMapping("/summoners") +@RequiredArgsConstructor +public class SummonerController { + + private final SummonerService summonerService; + + @GetMapping("/{summonerName}") + public Summoner callSummonerByName(@PathVariable(name = "summonerName") String summonerName) { + // URL 인코딩 사용 + summonerName = URLEncoder.encode(summonerName, StandardCharsets.UTF_8); + Summoner apiResult = summonerService.callRiotAPISummonerByName(summonerName); + return apiResult; + } + + @PostMapping("/match-ids/{puuid}") + public List getMatchIds(@PathVariable(name = "puuid") String puuid) { + List matchIds = summonerService.getMatchIds(puuid); + + return matchIds; + } +} \ No newline at end of file diff --git a/src/main/java/lbs/lbs/dto/MatchIdResponseDto.java b/src/main/java/lbs/lbs/dto/MatchIdResponseDto.java new file mode 100644 index 0000000..12be640 --- /dev/null +++ b/src/main/java/lbs/lbs/dto/MatchIdResponseDto.java @@ -0,0 +1,12 @@ +package lbs.lbs.dto; + +import lbs.lbs.entity.MatchId; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class MatchIdResponseDto { + List matchIdList = new ArrayList<>(); +} diff --git a/src/main/java/lbs/lbs/dto/SummonerResponseDto.java b/src/main/java/lbs/lbs/dto/SummonerResponseDto.java new file mode 100644 index 0000000..287b268 --- /dev/null +++ b/src/main/java/lbs/lbs/dto/SummonerResponseDto.java @@ -0,0 +1,15 @@ +package lbs.lbs.dto; + +import lombok.Getter; + +@Getter +public class SummonerResponseDto { + private String id; + + private String accountId; + private String revisionDate; + private String profileIconId; + private String puuid; + private String name; + private int summonerLevel; +} diff --git a/src/main/java/lbs/lbs/entity/MatchId.java b/src/main/java/lbs/lbs/entity/MatchId.java new file mode 100644 index 0000000..513221a --- /dev/null +++ b/src/main/java/lbs/lbs/entity/MatchId.java @@ -0,0 +1,27 @@ +package lbs.lbs.entity; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor +public class MatchId { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + private String match_id; + + @ManyToOne(fetch = FetchType.LAZY) + private Summoner summoner; + + + public MatchId(String match_id, Summoner summoner) { + this.match_id = match_id; + this.summoner = summoner; + } +} diff --git a/src/main/java/lbs/lbs/entity/Summoner.java b/src/main/java/lbs/lbs/entity/Summoner.java new file mode 100644 index 0000000..48115eb --- /dev/null +++ b/src/main/java/lbs/lbs/entity/Summoner.java @@ -0,0 +1,39 @@ +package lbs.lbs.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import lombok.*; + +import java.util.List; + +@Entity +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class Summoner { + @Id @Column(name = "summoner_id") + private String id; + + private String profile_icon_id; + private String puuid; + + @OneToMany(mappedBy = "summoner") + private List matchIds; + + private String summoner_name; + private int summoner_level; + + public Summoner(String id, String profile_icon_id, String puuid, String summoner_name, int summoner_level) { + this.id = id; + this.profile_icon_id = profile_icon_id; + this.puuid = puuid; + this.summoner_name = summoner_name; + this.summoner_level = summoner_level; + } + + +} diff --git a/src/main/java/lbs/lbs/repository/MatchIdRepository.java b/src/main/java/lbs/lbs/repository/MatchIdRepository.java new file mode 100644 index 0000000..3508d49 --- /dev/null +++ b/src/main/java/lbs/lbs/repository/MatchIdRepository.java @@ -0,0 +1,9 @@ +package lbs.lbs.repository; + +import lbs.lbs.entity.MatchId; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MatchIdRepository extends JpaRepository { +} diff --git a/src/main/java/lbs/lbs/repository/SummonerRepository.java b/src/main/java/lbs/lbs/repository/SummonerRepository.java new file mode 100644 index 0000000..ac86fa3 --- /dev/null +++ b/src/main/java/lbs/lbs/repository/SummonerRepository.java @@ -0,0 +1,14 @@ +package lbs.lbs.repository; + +import lbs.lbs.entity.Summoner; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface SummonerRepository extends JpaRepository { + boolean existsById(String id); + Optional findById(String id); + Optional findByPuuid(String puuid); +} diff --git a/src/main/java/lbs/lbs/service/SummonerService.java b/src/main/java/lbs/lbs/service/SummonerService.java new file mode 100644 index 0000000..b30b913 --- /dev/null +++ b/src/main/java/lbs/lbs/service/SummonerService.java @@ -0,0 +1,104 @@ +package lbs.lbs.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lbs.lbs.dto.MatchIdResponseDto; +import lbs.lbs.dto.SummonerResponseDto; +import lbs.lbs.entity.MatchId; +import lbs.lbs.entity.Summoner; +import lbs.lbs.repository.MatchIdRepository; +import lbs.lbs.repository.SummonerRepository; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class SummonerService { + private final ObjectMapper objectMapper = new ObjectMapper(); + + private final SummonerRepository summonerRepository; + + private final MatchIdRepository matchIdRepository; + private final CloseableHttpClient httpClient = HttpClients.createDefault(); + + @Value("${riot.api.key}") + private String myKey; + + public Summoner callRiotAPISummonerByName(String summonerName) { + try { + HttpGet request = new HttpGet("https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+ summonerName + "?api_key=" + myKey); + try (CloseableHttpResponse response = httpClient.execute(request)) { + int statusCode = response.getStatusLine().getStatusCode(); + + if (statusCode != 200) { + throw new NullPointerException("해당 아이디는 존재하지 않습니다."); + } + HttpEntity entity = response.getEntity(); + SummonerResponseDto summonerResponseDto = objectMapper.readValue(entity.getContent(), SummonerResponseDto.class); + + if(summonerRepository.existsById(summonerResponseDto.getId())){ + return summonerRepository.findById(summonerResponseDto.getId()).orElseThrow(() -> + new NullPointerException("해당 아이디는 존재하지 않습니다.")); + + } + Summoner summoner = new Summoner(summonerResponseDto.getId(), summonerResponseDto.getProfileIconId(), + summonerResponseDto.getPuuid(),summonerResponseDto.getName(), summonerResponseDto.getSummonerLevel()); + + summonerRepository.save(summoner); + return summoner; + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public List getMatchIds(String puuid) { + try { + HttpGet request = new HttpGet("https://asia.api.riotgames.com/lol/match/v5/matches/by-puuid/" + puuid + "/ids?start=0&count=20" + "&api_key=" + myKey); + try (CloseableHttpResponse response = httpClient.execute(request)) { + + int statusCode = response.getStatusLine().getStatusCode(); + + if (statusCode != 200) { + throw new NullPointerException("해당 puuid가 존재하지 않습니다.."); + } + + HttpEntity entity = response.getEntity(); + List matchIdList = objectMapper.readValue(entity.getContent(), List.class); + + Summoner summoner = summonerRepository.findByPuuid(puuid).orElseThrow(() -> + new NullPointerException("해당 아이디는 존재하지 않습니다.")); + + // matchIds를 설정할 때 builder() 대신에 set 메서드를 사용하여 id를 할당 + summoner.setMatchIds(matchIdList.stream() + .map(matchId -> new MatchId(matchId, summoner)) + .collect(Collectors.toList())); + + summonerRepository.save(summoner); + + // MatchId 저장 부분도 변경 + List savedMatchIds = matchIdRepository.saveAll( + matchIdList.stream() + .map(matchIdStr -> new MatchId(matchIdStr, summoner)) + .collect(Collectors.toList()) + ); + + return savedMatchIds; + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index dec78ee..834c933 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -31,4 +31,6 @@ spring.security.oauth2.client.registration.google.client-id=183395526084-pgrgikh spring.security.oauth2.client.registration.google.client-secret=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 spring.security.oauth2.client.registration.google.scope=email,profile -spring.profiles.include=oauth \ No newline at end of file +spring.profiles.include=oauth + +riot.api.key=RGAPI-38558dc3-3e7b-4dca-85db-45998f8484c3