From ca586fb8e7a98f69c4ae93cb81dbe69d415bf250 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 14:06:10 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[FEAT]=20api=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20dto=20=EA=B5=AC=ED=98=84=20#10?= =?UTF-8?q?7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/dto/response/RecordResponse.java | 13 +++++++++++++ .../dto/response/ReplacementRecordResponse.java | 6 ++++++ .../query/dto/response/ScoreRecordResponse.java | 16 ++++++++++++++++ .../query/dto/response/TimelineResponse2.java | 9 +++++++++ 4 files changed, 44 insertions(+) create mode 100644 src/main/java/com/sports/server/query/dto/response/RecordResponse.java create mode 100644 src/main/java/com/sports/server/query/dto/response/ReplacementRecordResponse.java create mode 100644 src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java create mode 100644 src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java diff --git a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java new file mode 100644 index 00000000..1fefe3d0 --- /dev/null +++ b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java @@ -0,0 +1,13 @@ +package com.sports.server.query.dto.response; + +public record RecordResponse( + String type, + Integer recordedAt, + String playerName, + String teamName, + String teamImageUrl, + Integer order, + ScoreRecordResponse score, + ReplacementRecordResponse replacement +) { +} diff --git a/src/main/java/com/sports/server/query/dto/response/ReplacementRecordResponse.java b/src/main/java/com/sports/server/query/dto/response/ReplacementRecordResponse.java new file mode 100644 index 00000000..ac2e7b00 --- /dev/null +++ b/src/main/java/com/sports/server/query/dto/response/ReplacementRecordResponse.java @@ -0,0 +1,6 @@ +package com.sports.server.query.dto.response; + +public record ReplacementRecordResponse( + String replacedPlayerName +) { +} diff --git a/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java new file mode 100644 index 00000000..f376f764 --- /dev/null +++ b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java @@ -0,0 +1,16 @@ +package com.sports.server.query.dto.response; + +import java.util.List; + +public record ScoreRecordResponse( + Integer point, + List histories +) { + + public record History( + String teamName, + String teamImageUrl, + Integer score + ) { + } +} diff --git a/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java b/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java new file mode 100644 index 00000000..c1e6aaea --- /dev/null +++ b/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java @@ -0,0 +1,9 @@ +package com.sports.server.query.dto.response; + +import java.util.List; + +public record TimelineResponse2( + String gameQuarter, + List records +) { +} From 23435e77b70152738724036b202c66826c547b1d Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 15:19:11 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[FEAT]=20n=20+=201=EC=9D=84=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80=ED=95=98=EA=B3=A0=EC=9E=90=20=ED=8E=98=EC=B9=98=20?= =?UTF-8?q?=EC=A1=B0=EC=9D=B8=20=EC=BF=BC=EB=A6=AC=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReplacementRecordQueryRepository.java | 23 +++++++++++++++++++ .../ScoreRecordQueryRepository.java | 22 ++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java create mode 100644 src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java diff --git a/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java new file mode 100644 index 00000000..3206c3e4 --- /dev/null +++ b/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java @@ -0,0 +1,23 @@ +package com.sports.server.query.repository; + +import com.sports.server.command.record.domain.ReplacementRecord; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface ReplacementRecordQueryRepository extends Repository { + + @Query("select rr from ReplacementRecord rr " + + "join fetch rr.record r " + + "join fetch rr.originLineupPlayer rop " + + "join fetch rr.replacedLineupPlayer rrp " + + "join fetch r.game g " + + "join fetch r.gameTeam gt " + + "join fetch gt.leagueTeam lt " + + "join fetch r.recordedQuarter rq " + + "where g.id = :gameId " + + "order by rq.id desc, r.recordedAt desc") + List findByGameId(@Param("gameId") Long gameId); +} diff --git a/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java new file mode 100644 index 00000000..3e50d127 --- /dev/null +++ b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java @@ -0,0 +1,22 @@ +package com.sports.server.query.repository; + +import com.sports.server.command.record.domain.ScoreRecord; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface ScoreRecordQueryRepository extends Repository { + + @Query("select sr from ScoreRecord sr " + + "join fetch sr.record r " + + "join fetch r.game g " + + "join fetch r.gameTeam gt " + + "join fetch gt.leagueTeam lt " + + "join fetch r.recordedQuarter rq " + + "join fetch sr.lineupPlayer srp " + + "where g.id = :gameId " + + "order by rq.id desc, r.recordedAt desc") + List findByGameId(@Param("gameId") Long gameId); +} From f86bf9de8025a753201c1458f7f43051737de0d1 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 15:24:58 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[FEAT]=20=EA=B5=90=EC=B2=B4=20=ED=83=80?= =?UTF-8?q?=EC=9E=84=EB=9D=BC=EC=9D=B8=20dto=20=EB=A7=A4=ED=95=91=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReplacementRecordQueryService.java | 24 +++++++++++++++++++ .../application/TimelineQueryService.java | 14 ++++++++--- .../query/dto/response/RecordResponse.java | 23 +++++++++++++++++- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java diff --git a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java new file mode 100644 index 00000000..366c08c8 --- /dev/null +++ b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java @@ -0,0 +1,24 @@ +package com.sports.server.query.application; + +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.repository.ReplacementRecordQueryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class ReplacementRecordQueryService { + + private final ReplacementRecordQueryRepository replacementRecordQueryRepository; + + public List findByGameId(Long gameId) { + return replacementRecordQueryRepository.findByGameId(gameId) + .stream() + .map(RecordResponse::from) + .toList(); + } +} diff --git a/src/main/java/com/sports/server/query/application/TimelineQueryService.java b/src/main/java/com/sports/server/query/application/TimelineQueryService.java index 2b20d75a..4d15b2e2 100644 --- a/src/main/java/com/sports/server/query/application/TimelineQueryService.java +++ b/src/main/java/com/sports/server/query/application/TimelineQueryService.java @@ -1,9 +1,11 @@ package com.sports.server.query.application; import com.sports.server.command.record.domain.Record; -import com.sports.server.query.repository.RecordQueryRepository; -import com.sports.server.query.dto.response.TimelineResponse; import com.sports.server.command.sport.domain.Quarter; +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.dto.response.TimelineResponse; +import com.sports.server.query.dto.response.TimelineResponse2; +import com.sports.server.query.repository.RecordQueryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +14,7 @@ import java.util.List; import java.util.Map; -import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.*; @Service @Transactional(readOnly = true) @@ -20,6 +22,7 @@ public class TimelineQueryService { private final RecordQueryRepository recordQueryRepository; + private final ReplacementRecordQueryService replacementRecordQueryService; public List getTimeline(final Long gameId) { List records = recordQueryRepository.findByGameIdOrderByQuarterAndScoredAtDesc(gameId); @@ -31,4 +34,9 @@ public List getTimeline(final Long gameId) { .map(quarter -> new TimelineResponse(quarter, groupedByQuarter.get(quarter))) .toList(); } + + public List getTimeline2(final Long gameId) { + List replacementRecords = replacementRecordQueryService.findByGameId(gameId); + return null; + } } diff --git a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java index 1fefe3d0..d43f31a0 100644 --- a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java @@ -1,13 +1,34 @@ package com.sports.server.query.dto.response; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sports.server.command.leagueteam.LeagueTeam; +import com.sports.server.command.record.domain.Record; +import com.sports.server.command.record.domain.ReplacementRecord; + public record RecordResponse( + @JsonIgnore + Long quarterId, String type, Integer recordedAt, String playerName, String teamName, String teamImageUrl, - Integer order, ScoreRecordResponse score, ReplacementRecordResponse replacement ) { + + public static RecordResponse from(ReplacementRecord replacementRecord) { + Record record = replacementRecord.getRecord(); + LeagueTeam team = record.getGameTeam().getLeagueTeam(); + return new RecordResponse( + record.getRecordedQuarter().getId(), + record.getRecordType().name(), + record.getRecordedAt(), + replacementRecord.getOriginLineupPlayer().getName(), + team.getName(), + team.getLogoImageUrl(), + null, + new ReplacementRecordResponse(replacementRecord.getReplacedLineupPlayer().getName()) + ); + } } From e5cb1e1899063467c20cf8959b28cb54c1becbaf Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 16:44:35 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[FEAT]=20=ED=83=80=EC=9E=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ScoreRecordQueryService.java | 52 +++++++++++++++++++ .../application/TimelineQueryService.java | 23 ++++---- .../query/dto/response/RecordResponse.java | 21 +++++++- .../query/dto/response/TimelineResponse.java | 22 +------- .../query/dto/response/TimelineResponse2.java | 9 ---- .../repository/GameTeamQueryRepository.java | 3 ++ .../repository/RecordQueryRepository.java | 20 ------- .../ScoreRecordQueryRepository.java | 2 +- 8 files changed, 86 insertions(+), 66 deletions(-) create mode 100644 src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java delete mode 100644 src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java delete mode 100644 src/main/java/com/sports/server/query/repository/RecordQueryRepository.java diff --git a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java new file mode 100644 index 00000000..f7008083 --- /dev/null +++ b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java @@ -0,0 +1,52 @@ +package com.sports.server.query.application; + +import com.sports.server.command.game.domain.GameTeam; +import com.sports.server.command.record.domain.ScoreRecord; +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.dto.response.ScoreRecordResponse; +import com.sports.server.query.repository.GameTeamQueryRepository; +import com.sports.server.query.repository.ScoreRecordQueryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.toMap; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class ScoreRecordQueryService { + + private final ScoreRecordQueryRepository scoreRecordQueryRepository; + private final GameTeamQueryRepository gameTeamQueryRepository; + + public List findByGameId(Long gameId) { + List gameTeams = gameTeamQueryRepository.findAllByGameWithTeam(gameId); + Map scores = gameTeams.stream() + .collect(toMap(gameTeam -> gameTeam, gameTeam -> 0)); + + List scoreRecords = scoreRecordQueryRepository.findByGameId(gameId); + + List responses = new ArrayList<>(); + for (ScoreRecord scoreRecord : scoreRecords) { + GameTeam gameTeam = scoreRecord.getRecord().getGameTeam(); + int score = scoreRecord.getScore(); + scores.put(gameTeam, scores.get(gameTeam) + score); + List histories = gameTeams.stream() + .map(team -> new ScoreRecordResponse.History( + team.getLeagueTeam().getName(), + team.getLeagueTeam().getLogoImageUrl(), + scores.get(team))) + .toList(); + ScoreRecordResponse scoreRecordResponse = new ScoreRecordResponse(score, histories); + responses.add(RecordResponse.from(scoreRecord, scoreRecordResponse)); + } + Collections.reverse(responses); + return responses; + } +} diff --git a/src/main/java/com/sports/server/query/application/TimelineQueryService.java b/src/main/java/com/sports/server/query/application/TimelineQueryService.java index 4d15b2e2..321bf378 100644 --- a/src/main/java/com/sports/server/query/application/TimelineQueryService.java +++ b/src/main/java/com/sports/server/query/application/TimelineQueryService.java @@ -1,42 +1,39 @@ package com.sports.server.query.application; -import com.sports.server.command.record.domain.Record; import com.sports.server.command.sport.domain.Quarter; import com.sports.server.query.dto.response.RecordResponse; import com.sports.server.query.dto.response.TimelineResponse; -import com.sports.server.query.dto.response.TimelineResponse2; -import com.sports.server.query.repository.RecordQueryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; -import static java.util.stream.Collectors.*; +import static java.util.stream.Collectors.groupingBy; @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class TimelineQueryService { - private final RecordQueryRepository recordQueryRepository; private final ReplacementRecordQueryService replacementRecordQueryService; + private final ScoreRecordQueryService scoreRecordQueryService; public List getTimeline(final Long gameId) { - List records = recordQueryRepository.findByGameIdOrderByQuarterAndScoredAtDesc(gameId); - Map> groupedByQuarter = records.stream() - .collect(groupingBy(Record::getRecordedQuarter)); + List records = new ArrayList<>(); + records.addAll(replacementRecordQueryService.findByGameId(gameId)); + records.addAll(scoreRecordQueryService.findByGameId(gameId)); + + Map> groupedByQuarter = records.stream() + .collect(groupingBy(RecordResponse::quarter)); return groupedByQuarter.keySet() .stream() .sorted(Comparator.comparingLong(Quarter::getId).reversed()) - .map(quarter -> new TimelineResponse(quarter, groupedByQuarter.get(quarter))) + .map(quarter -> new TimelineResponse(quarter.getName(), groupedByQuarter.get(quarter))) .toList(); - } - public List getTimeline2(final Long gameId) { - List replacementRecords = replacementRecordQueryService.findByGameId(gameId); - return null; } } diff --git a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java index d43f31a0..be8a09a5 100644 --- a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java @@ -4,10 +4,12 @@ import com.sports.server.command.leagueteam.LeagueTeam; import com.sports.server.command.record.domain.Record; import com.sports.server.command.record.domain.ReplacementRecord; +import com.sports.server.command.record.domain.ScoreRecord; +import com.sports.server.command.sport.domain.Quarter; public record RecordResponse( @JsonIgnore - Long quarterId, + Quarter quarter, String type, Integer recordedAt, String playerName, @@ -21,7 +23,7 @@ public static RecordResponse from(ReplacementRecord replacementRecord) { Record record = replacementRecord.getRecord(); LeagueTeam team = record.getGameTeam().getLeagueTeam(); return new RecordResponse( - record.getRecordedQuarter().getId(), + record.getRecordedQuarter(), record.getRecordType().name(), record.getRecordedAt(), replacementRecord.getOriginLineupPlayer().getName(), @@ -31,4 +33,19 @@ public static RecordResponse from(ReplacementRecord replacementRecord) { new ReplacementRecordResponse(replacementRecord.getReplacedLineupPlayer().getName()) ); } + + public static RecordResponse from(ScoreRecord scoreRecord, ScoreRecordResponse scoreRecordResponse) { + Record record = scoreRecord.getRecord(); + LeagueTeam team = record.getGameTeam().getLeagueTeam(); + return new RecordResponse( + record.getRecordedQuarter(), + record.getRecordType().name(), + record.getRecordedAt(), + scoreRecord.getLineupPlayer().getName(), + team.getName(), + team.getLogoImageUrl(), + scoreRecordResponse, + null + ); + } } diff --git a/src/main/java/com/sports/server/query/dto/response/TimelineResponse.java b/src/main/java/com/sports/server/query/dto/response/TimelineResponse.java index 7cef2a64..0929f12e 100644 --- a/src/main/java/com/sports/server/query/dto/response/TimelineResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/TimelineResponse.java @@ -1,29 +1,9 @@ package com.sports.server.query.dto.response; -import com.sports.server.command.record.domain.Record; -import com.sports.server.command.sport.domain.Quarter; import java.util.List; public record TimelineResponse( String gameQuarter, List records ) { - - public TimelineResponse(Quarter quarter, List records) { - this( - quarter.getName(), - records.stream() - .map(RecordResponse::new) - .toList() - ); - } - - public record RecordResponse( - Integer recordedAt) { - public RecordResponse(Record record) { - this( - record.getRecordedAt() - ); - } - } -} \ No newline at end of file +} diff --git a/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java b/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java deleted file mode 100644 index c1e6aaea..00000000 --- a/src/main/java/com/sports/server/query/dto/response/TimelineResponse2.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sports.server.query.dto.response; - -import java.util.List; - -public record TimelineResponse2( - String gameQuarter, - List records -) { -} diff --git a/src/main/java/com/sports/server/query/repository/GameTeamQueryRepository.java b/src/main/java/com/sports/server/query/repository/GameTeamQueryRepository.java index 68a953c7..8fabb520 100644 --- a/src/main/java/com/sports/server/query/repository/GameTeamQueryRepository.java +++ b/src/main/java/com/sports/server/query/repository/GameTeamQueryRepository.java @@ -15,6 +15,9 @@ public interface GameTeamQueryRepository extends Repository { @Query("select gt from GameTeam gt join fetch gt.leagueTeam where gt.game = :game") List findAllByGameWithTeam(@Param("game") final Game game); + @Query("select gt from GameTeam gt join fetch gt.leagueTeam where gt.game.id = :gameId") + List findAllByGameWithTeam(@Param("gameId") final Long gameId); + @Query("select gt from GameTeam gt " + "join fetch gt.leagueTeam " + "where gt.game.id in :gameIds") diff --git a/src/main/java/com/sports/server/query/repository/RecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/RecordQueryRepository.java deleted file mode 100644 index a5750cc3..00000000 --- a/src/main/java/com/sports/server/query/repository/RecordQueryRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sports.server.query.repository; - -import com.sports.server.command.record.domain.Record; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.Repository; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface RecordQueryRepository extends Repository { - - @Query("select r from Record r " + - "join fetch r.game " + - "join fetch r.gameTeam rgt " + - "join fetch rgt.leagueTeam " + - "join fetch r.recordedQuarter rq " + - "where r.game.id = :gameId " + - "order by rq.id desc, r.recordedAt desc") - List findByGameIdOrderByQuarterAndScoredAtDesc(final @Param("gameId") Long gameId); -} diff --git a/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java index 3e50d127..ef8fad03 100644 --- a/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java +++ b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java @@ -17,6 +17,6 @@ public interface ScoreRecordQueryRepository extends Repository findByGameId(@Param("gameId") Long gameId); } From 6a58db9b72125b492eeab2d2d0864206ea86583b Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 17:48:06 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[TEST]=20=ED=83=80=EC=9E=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EC=9D=B8=EC=88=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/TimelineQueryService.java | 1 + .../TimelineQueryAcceptanceTest.java | 109 ++++++++++++------ src/test/resources/record-fixture.sql | 66 ++++++----- 3 files changed, 108 insertions(+), 68 deletions(-) diff --git a/src/main/java/com/sports/server/query/application/TimelineQueryService.java b/src/main/java/com/sports/server/query/application/TimelineQueryService.java index 321bf378..f54a5474 100644 --- a/src/main/java/com/sports/server/query/application/TimelineQueryService.java +++ b/src/main/java/com/sports/server/query/application/TimelineQueryService.java @@ -28,6 +28,7 @@ public List getTimeline(final Long gameId) { records.addAll(scoreRecordQueryService.findByGameId(gameId)); Map> groupedByQuarter = records.stream() + .sorted(Comparator.comparingInt(RecordResponse::recordedAt).reversed()) .collect(groupingBy(RecordResponse::quarter)); return groupedByQuarter.keySet() .stream() diff --git a/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java b/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java index 8baec32d..a9230aef 100644 --- a/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java +++ b/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java @@ -1,44 +1,38 @@ package com.sports.server.query.acceptance; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.dto.response.ReplacementRecordResponse; +import com.sports.server.query.dto.response.ScoreRecordResponse; import com.sports.server.query.dto.response.TimelineResponse; import com.sports.server.support.AcceptanceTest; import io.restassured.RestAssured; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.jdbc.Sql; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + @Sql(scripts = "/record-fixture.sql") public class TimelineQueryAcceptanceTest extends AcceptanceTest { - private static final List EXPECTED_RECORDS_3QUARTER = List.of( - new TimelineResponse.RecordResponse(39), - new TimelineResponse.RecordResponse(25), - new TimelineResponse.RecordResponse(1) - ); - private static final List EXPECTED_RECORDS_2QUARTER = List.of( - new TimelineResponse.RecordResponse(30), - new TimelineResponse.RecordResponse(20), - new TimelineResponse.RecordResponse(5) - ); + private static final String QUARTER1 = "1쿼터"; + private static final String QUARTER2 = "2쿼터"; - private static final List EXPECTED_RECORDS_1QUARTER = List.of( - new TimelineResponse.RecordResponse(14), - new TimelineResponse.RecordResponse(10), - new TimelineResponse.RecordResponse(3) - ); + private static final String TEAM_A = "팀A"; + public static final String TEAM_A_IMAGE_URL = "http://example.com/logo_a.png"; + private static final String TEAM_B = "팀B"; + public static final String TEAM_B_IMAGE_URL = "http://example.com/logo_b.png"; + + private static final String SCORE_TYPE = "SCORE"; + private static final String REPLACEMENT_TYPE = "REPLACEMENT"; - @Disabled @Test void 게임의_타임라인을_조회한다() { // given @@ -54,23 +48,62 @@ public class TimelineQueryAcceptanceTest extends AcceptanceTest { // then List actual = toResponses(response, TimelineResponse.class); - Map> groupByQuarter = actual.stream() - .collect(Collectors.groupingBy(TimelineResponse::gameQuarter)); assertAll( () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(actual) - .map(TimelineResponse::gameQuarter) - .containsExactly("3쿼터", "2쿼터", "1쿼터"), - - () -> assertThat(groupByQuarter.get("3쿼터")) - .map(TimelineResponse::records) - .containsExactly(EXPECTED_RECORDS_3QUARTER), - () -> assertThat(groupByQuarter.get("2쿼터")) - .map(TimelineResponse::records) - .containsExactly(EXPECTED_RECORDS_2QUARTER), - () -> assertThat(groupByQuarter.get("1쿼터")) - .map(TimelineResponse::records) - .containsExactly(EXPECTED_RECORDS_1QUARTER) + () -> assertThat(actual).isEqualTo(List.of( + new TimelineResponse( + QUARTER2, List.of( + new RecordResponse( + null, SCORE_TYPE, + 13, + "선수10", + TEAM_B, + TEAM_B_IMAGE_URL, + new ScoreRecordResponse(3, List.of( + new ScoreRecordResponse.History( + TEAM_A, TEAM_A_IMAGE_URL, 2), + new ScoreRecordResponse.History( + TEAM_B, TEAM_B_IMAGE_URL, 3) + )), + null + ), + new RecordResponse( + null, REPLACEMENT_TYPE, + 10, + "선수2", + TEAM_A, + TEAM_A_IMAGE_URL, + null, + new ReplacementRecordResponse("선수3") + ) + )), + new TimelineResponse( + QUARTER1, List.of( + new RecordResponse( + null, REPLACEMENT_TYPE, + 4, + "선수6", + TEAM_B, + TEAM_B_IMAGE_URL, + null, + new ReplacementRecordResponse("선수7") + ), + new RecordResponse( + null, SCORE_TYPE, + 2, + "선수2", + TEAM_A, + TEAM_A_IMAGE_URL, + new ScoreRecordResponse(2, List.of( + new ScoreRecordResponse.History( + TEAM_A, TEAM_A_IMAGE_URL, 2), + new ScoreRecordResponse.History( + TEAM_B, TEAM_B_IMAGE_URL, 0) + )), + null + ) + )) + )) ); } } \ No newline at end of file diff --git a/src/test/resources/record-fixture.sql b/src/test/resources/record-fixture.sql index d8163c92..1171c517 100644 --- a/src/test/resources/record-fixture.sql +++ b/src/test/resources/record-fixture.sql @@ -16,8 +16,8 @@ VALUES (1, 1, 1, '농구 대전', '2023-11-12T10:00:00', 'abc123', '2023-11-12T1 -- 팀 INSERT INTO league_teams (name, logo_image_url, manager_id, organization_id, league_id) -VALUES ('팀 A', 'http://example.com/logo_a.png', 1, 1, 1), - ('팀 B', 'http://example.com/logo_b.png', 2, 1, 1); +VALUES ('팀A', 'http://example.com/logo_a.png', 1, 1, 1), + ('팀B', 'http://example.com/logo_b.png', 2, 1, 1); -- 경기의 팀 -- 농구 대전 (game_id = 1) A팀 vs B팀 @@ -25,36 +25,42 @@ INSERT INTO game_teams (game_id, league_team_id, cheer_count, score) VALUES (1, 1, 1, 15), -- 팀 A의 정보 (1, 2, 2, 10); -- 팀 B의 정보 --- 농구 대전(game_id = 1) A팀 선수 -INSERT INTO lineup_players (id, game_team_id, name, description) -VALUES (1, 1, '선수1', '센터'), - (2, 1, '선수2', '파워 포워드'), - (3, 1, '선수3', '슈팅 가드'), - (4, 1, '선수4', '포인트 가드'), - (5, 1, '선수5', '스몰 포워드'); - --- 농구 대전(game_id = 1) B팀 선수 -INSERT INTO lineup_players (id, game_team_id, name, description) -VALUES (6, 2, '선수6', '센터'), - (7, 2, '선수7', '파워 포워드'), - (8, 2, '선수8', '슈팅 가드'), - (9, 2, '선수9', '포인트 가드'), - (10, 2, '선수10', '스몰 포워드'); +-- 농구 대전(game_id = 1) A팀(game_team_id = 1) 선수 +INSERT INTO lineup_players (id, game_team_id, name, description, is_captain, number) +VALUES (1, 1, '선수1', '센터', true, 1), + (2, 1, '선수2', '파워 포워드', false, 2), + (3, 1, '선수3', '슈팅 가드', false, 3), + (4, 1, '선수4', '포인트 가드', false, 4), + (5, 1, '선수5', '스몰 포워드', false, 5); + +-- 농구 대전(game_id = 1) B팀(game_team_id = 2) 선수 +INSERT INTO lineup_players (id, game_team_id, name, description, is_captain, number) +VALUES (6, 2, '선수6', '센터', true, 6), + (7, 2, '선수7', '파워 포워드', false, 7), + (8, 2, '선수8', '슈팅 가드', false, 8), + (9, 2, '선수9', '포인트 가드', false, 9), + (10, 2, '선수10', '스몰 포워드', false, 10); -- 1쿼터 경기 기록 추가 -INSERT INTO records (game_id, game_team_id, lineup_player_id, score, recorded_quarter_id, recorded_at) -VALUES (1, 1, 3, 2, 1, 3), -- 선수 3의 2득점 - (1, 2, 6, 2, 1, 10), -- 선수 6의 2득점 - (1, 1, 2, 3, 1, 14); -- 선수 2의 3득점 +INSERT INTO records (id, game_id, game_team_id, recorded_quarter_id, recorded_at, record_type) +VALUES (1, 1, 1, 1, 2, 'SCORE'); +INSERT INTO score_records (record_id, lineup_player_id, score) +VALUES (1, 2, 2); -- A팀 선수 2의 2득점 + +INSERT INTO records (id, game_id, game_team_id, recorded_quarter_id, recorded_at, record_type) +VALUES (2, 1, 2, 1, 4, 'REPLACEMENT'); +INSERT INTO replacement_records(record_id, origin_lineup_player_id, replaced_lineup_player_id) +VALUES (2, 6, 7); -- B팀 6선수 OUT 7선수 IN + -- 2쿼터 경기 기록 추가 -INSERT INTO records (game_id, game_team_id, lineup_player_id, score, recorded_quarter_id, recorded_at) -VALUES (1, 1, 1, 2, 2, 5), -- 선수 1의 2득점 - (1, 2, 10, 2, 2, 20), -- 선수 10의 2득점 - (1, 1, 5, 3, 2, 30); -- 선수 5의 3득점 --- 3쿼터 경기 기록 추가 -INSERT INTO records (game_id, game_team_id, lineup_player_id, score, recorded_quarter_id, recorded_at) -VALUES (1, 1, 4, 3, 3, 1), -- 선수 4의 3득점 - (1, 2, 9, 2, 3, 25), -- 선수 9의 2득점 - (1, 1, 5, 3, 3, 39); -- 선수 5의 3득점 +INSERT INTO records (id, game_id, game_team_id, recorded_quarter_id, recorded_at, record_type) +VALUES (3, 1, 1, 2, 10, 'REPLACEMENT'); +INSERT INTO replacement_records(record_id, origin_lineup_player_id, replaced_lineup_player_id) +VALUES (3, 2, 3); -- A팀 2선수 OUT 3선수 IN + +INSERT INTO records (id, game_id, game_team_id, recorded_quarter_id, recorded_at, record_type) +VALUES (4, 1, 2, 2, 13, 'SCORE'); +INSERT INTO score_records (record_id, lineup_player_id, score) +VALUES (4, 10, 3); -- B팀 선수 10의 3득점 SET foreign_key_checks = 1; From 300c44bd5859daab33b0938f9221d23c0d8f1227 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 17:55:31 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[DOCS]=20=ED=83=80=EC=9E=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20api=20=EB=AC=B8=EC=84=9C=ED=99=94=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 2 +- src/main/resources/static/docs/api.html | 167 +++++++++++++++++- .../TimelineQueryControllerTest.java | 105 +++++++---- 3 files changed, 239 insertions(+), 35 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 07ce21d8..df6f7996 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -64,7 +64,7 @@ operation::league-query-controller-test/리그의_해당하는_스포츠_전체 === 게임의 타임라인 조회 -// operation::timeline-query-controller-test/타임라인을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] +operation::timeline-query-controller-test/타임라인을_조회한다[snippets='http-request,path-parameters,http-response,response-fields'] == 스포츠 API diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 41659280..64e959b8 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1668,7 +1668,172 @@

타임라

게임의 타임라인 조회

+
+

HTTP request

+
+
+
GET /games/1/timeline HTTP/1.1
+Content-Type: application/json;charset=UTF-8
+Host: www.api.hufstreaming.site
+
+
+
+
+

Path parameters

+ + ++++ + + + + + + + + + + + + +
Table 1. /games/{gameId}/timeline
ParameterDescription

gameId

게임의 ID

+
+
+

HTTP response

+
+
+
HTTP/1.1 200 OK
+Vary: Origin
+Vary: Access-Control-Request-Method
+Vary: Access-Control-Request-Headers
+Content-Type: application/json
+Content-Length: 1118
 
+[ {
+  "gameQuarter" : "2쿼터",
+  "records" : [ {
+    "type" : "SCORE",
+    "recordedAt" : 13,
+    "playerName" : "선수10",
+    "teamName" : "팀B",
+    "teamImageUrl" : "http://example.com/logo_b.png",
+    "score" : {
+      "point" : 3,
+      "histories" : [ {
+        "teamName" : "팀A",
+        "teamImageUrl" : "http://example.com/logo_a.png",
+        "score" : 2
+      }, {
+        "teamName" : "팀B",
+        "teamImageUrl" : "http://example.com/logo_b.png",
+        "score" : 3
+      } ]
+    },
+    "replacement" : {
+      "replacedPlayerName" : "선수3"
+    }
+  }, {
+    "type" : "REPLACEMENT",
+    "recordedAt" : 10,
+    "playerName" : "선수2",
+    "teamName" : "팀A",
+    "teamImageUrl" : "http://example.com/logo_a.png",
+    "score" : {
+      "point" : 2,
+      "histories" : [ {
+        "teamName" : "팀A",
+        "teamImageUrl" : "http://example.com/logo_a.png",
+        "score" : 2
+      }, {
+        "teamName" : "팀B",
+        "teamImageUrl" : "http://example.com/logo_b.png",
+        "score" : 0
+      } ]
+    },
+    "replacement" : {
+      "replacedPlayerName" : "선수3"
+    }
+  } ]
+} ]
+
+
+
+
+

Response fields

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PathTypeDescription

[].gameQuarter

String

쿼터의 이름

[].records[].type

String

기록의 타입

[].records[].recordedAt

Number

기록된 시간

[].records[].playerName

String

기록의 대상 선수 이름

[].records[].teamName

String

기록의 대상 팀 이름

[].records[].teamImageUrl

String

기록의 대상 팀 이미지

[].records[].score.point

Number

SCORE 타입일 때 득점한 점수

[].records[].score.histories[].teamName

String

SCORE 타입일 때 점수 히스토리에 표시할 팀 이름

[].records[].score.histories[].teamImageUrl

String

SCORE 타입일 때 점수 히스토리에 표시할 팀 이미지

[].records[].score.histories[].score

Number

SCORE 타입일 때 점수 히스토리에 표시할 점수

[].records[].replacement.replacedPlayerName

String

REPLACEMENT 타입일 때 교체되어 IN 되는 선수

+
@@ -1702,7 +1867,7 @@

diff --git a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java index 39a0ff78..b9b3017a 100644 --- a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java @@ -1,46 +1,76 @@ package com.sports.server.query.presentation; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.dto.response.ReplacementRecordResponse; +import com.sports.server.query.dto.response.ScoreRecordResponse; import com.sports.server.query.dto.response.TimelineResponse; -import com.sports.server.query.dto.response.TimelineResponse.RecordResponse; import com.sports.server.support.DocumentationTest; -import java.util.List; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; import org.springframework.http.MediaType; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.ResultActions; +import java.util.List; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + public class TimelineQueryControllerTest extends DocumentationTest { - @Test - @Disabled - void 타임라인을_조회한다() throws Exception { + private static final String QUARTER2 = "2쿼터"; - // given - Long gameId = 1L; + private static final String TEAM_A = "팀A"; + public static final String TEAM_A_IMAGE_URL = "http://example.com/logo_a.png"; + private static final String TEAM_B = "팀B"; + public static final String TEAM_B_IMAGE_URL = "http://example.com/logo_b.png"; - List responses = List.of( - new TimelineResponse("쿼터1", List.of( - new RecordResponse(25), - new RecordResponse(30) - )), - new TimelineResponse("쿼터2", List.of( - new RecordResponse(25), - new RecordResponse(30) - )) + private static final String SCORE_TYPE = "SCORE"; + private static final String REPLACEMENT_TYPE = "REPLACEMENT"; - ); - given(timelineQueryService.getTimeline(gameId)) - .willReturn(responses); + @Test + void 타임라인을_조회한다() throws Exception { + // given + Long gameId = 1L; + BDDMockito.given(timelineQueryService.getTimeline(gameId)) + .willReturn(List.of( + new TimelineResponse( + QUARTER2, List.of( + new RecordResponse( + null, SCORE_TYPE, + 13, + "선수10", + TEAM_B, + TEAM_B_IMAGE_URL, + new ScoreRecordResponse(3, List.of( + new ScoreRecordResponse.History( + TEAM_A, TEAM_A_IMAGE_URL, 2), + new ScoreRecordResponse.History( + TEAM_B, TEAM_B_IMAGE_URL, 3) + )), + new ReplacementRecordResponse("선수3") + ), + new RecordResponse( + null, REPLACEMENT_TYPE, + 10, + "선수2", + TEAM_A, + TEAM_A_IMAGE_URL, + new ScoreRecordResponse(2, List.of( + new ScoreRecordResponse.History( + TEAM_A, TEAM_A_IMAGE_URL, 2), + new ScoreRecordResponse.History( + TEAM_B, TEAM_B_IMAGE_URL, 0) + )), + new ReplacementRecordResponse("선수3") + ) + )) + )); // when ResultActions result = mockMvc.perform(get("/games/{gameId}/timeline", gameId) @@ -55,11 +85,20 @@ public class TimelineQueryControllerTest extends DocumentationTest { ), responseFields( fieldWithPath("[].gameQuarter").type(JsonFieldType.STRING).description("쿼터의 이름"), - fieldWithPath("[].records[].scoredAt").type(JsonFieldType.NUMBER).description("득점한 시간"), - fieldWithPath("[].records[].playerName").type(JsonFieldType.STRING) - .description("득점한 선수의 이름"), - fieldWithPath("[].records[].teamName").type(JsonFieldType.STRING).description("팀 이름"), - fieldWithPath("[].records[].score").type(JsonFieldType.NUMBER).description("득점한 점수") + fieldWithPath("[].records[].type").type(JsonFieldType.STRING).description("기록의 타입"), + fieldWithPath("[].records[].recordedAt").type(JsonFieldType.NUMBER).description("기록된 시간"), + fieldWithPath("[].records[].playerName").type(JsonFieldType.STRING).description("기록의 대상 선수 이름"), + fieldWithPath("[].records[].teamName").type(JsonFieldType.STRING).description("기록의 대상 팀 이름"), + fieldWithPath("[].records[].teamImageUrl").type(JsonFieldType.STRING).description("기록의 대상 팀 이미지"), + fieldWithPath("[].records[].score.point").type(JsonFieldType.NUMBER).description("SCORE 타입일 때 득점한 점수"), + fieldWithPath("[].records[].score.histories[].teamName").type(JsonFieldType.STRING) + .description("SCORE 타입일 때 점수 히스토리에 표시할 팀 이름"), + fieldWithPath("[].records[].score.histories[].teamImageUrl").type(JsonFieldType.STRING) + .description("SCORE 타입일 때 점수 히스토리에 표시할 팀 이미지"), + fieldWithPath("[].records[].score.histories[].score").type(JsonFieldType.NUMBER) + .description("SCORE 타입일 때 점수 히스토리에 표시할 점수"), + fieldWithPath("[].records[].replacement.replacedPlayerName").type(JsonFieldType.STRING) + .description("REPLACEMENT 타입일 때 교체되어 IN 되는 선수") ) )); From dd9e9ca44bcafc07b8581912e4a92933377984d9 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 18:09:20 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[REFACTOR]=20=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EC=A1=B0=EC=9D=B8=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/repository/ReplacementRecordQueryRepository.java | 3 +-- .../server/query/repository/ScoreRecordQueryRepository.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java index 3206c3e4..84c72a46 100644 --- a/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java +++ b/src/main/java/com/sports/server/query/repository/ReplacementRecordQueryRepository.java @@ -13,11 +13,10 @@ public interface ReplacementRecordQueryRepository extends Repository findByGameId(@Param("gameId") Long gameId); } diff --git a/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java index ef8fad03..cad0efb4 100644 --- a/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java +++ b/src/main/java/com/sports/server/query/repository/ScoreRecordQueryRepository.java @@ -11,12 +11,11 @@ public interface ScoreRecordQueryRepository extends Repository findByGameId(@Param("gameId") Long gameId); } From c8e955e223e7dbc593ccc10ac0e9bf55094bac2b Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 20:03:56 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[REFACTOR]=20RecordQueryService=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EC=B2=B4=20=ED=83=80=EC=9E=85=20=EC=B6=94=EC=83=81?= =?UTF-8?q?=ED=99=94=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/application/RecordQueryService.java | 10 ++++++ .../ReplacementRecordQueryService.java | 3 +- .../application/ScoreRecordQueryService.java | 3 +- .../application/TimelineQueryService.java | 32 ++++++++++--------- 4 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/sports/server/query/application/RecordQueryService.java diff --git a/src/main/java/com/sports/server/query/application/RecordQueryService.java b/src/main/java/com/sports/server/query/application/RecordQueryService.java new file mode 100644 index 00000000..79ccb165 --- /dev/null +++ b/src/main/java/com/sports/server/query/application/RecordQueryService.java @@ -0,0 +1,10 @@ +package com.sports.server.query.application; + +import com.sports.server.query.dto.response.RecordResponse; + +import java.util.List; + +public interface RecordQueryService { + + List findByGameId(Long gameId); +} diff --git a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java index 366c08c8..9a55bab9 100644 --- a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java @@ -11,10 +11,11 @@ @Service @Transactional(readOnly = true) @RequiredArgsConstructor -public class ReplacementRecordQueryService { +public class ReplacementRecordQueryService implements RecordQueryService { private final ReplacementRecordQueryRepository replacementRecordQueryRepository; + @Override public List findByGameId(Long gameId) { return replacementRecordQueryRepository.findByGameId(gameId) .stream() diff --git a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java index f7008083..c2926e19 100644 --- a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java @@ -20,11 +20,12 @@ @Service @Transactional(readOnly = true) @RequiredArgsConstructor -public class ScoreRecordQueryService { +public class ScoreRecordQueryService implements RecordQueryService { private final ScoreRecordQueryRepository scoreRecordQueryRepository; private final GameTeamQueryRepository gameTeamQueryRepository; + @Override public List findByGameId(Long gameId) { List gameTeams = gameTeamQueryRepository.findAllByGameWithTeam(gameId); Map scores = gameTeams.stream() diff --git a/src/main/java/com/sports/server/query/application/TimelineQueryService.java b/src/main/java/com/sports/server/query/application/TimelineQueryService.java index f54a5474..ccb2aaf4 100644 --- a/src/main/java/com/sports/server/query/application/TimelineQueryService.java +++ b/src/main/java/com/sports/server/query/application/TimelineQueryService.java @@ -7,11 +7,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import java.util.Map; +import static java.util.Comparator.comparingInt; +import static java.util.Comparator.comparingLong; import static java.util.stream.Collectors.groupingBy; @Service @@ -19,22 +19,24 @@ @RequiredArgsConstructor public class TimelineQueryService { - private final ReplacementRecordQueryService replacementRecordQueryService; - private final ScoreRecordQueryService scoreRecordQueryService; + private final List recordQueryServices; public List getTimeline(final Long gameId) { - List records = new ArrayList<>(); - records.addAll(replacementRecordQueryService.findByGameId(gameId)); - records.addAll(scoreRecordQueryService.findByGameId(gameId)); - - Map> groupedByQuarter = records.stream() - .sorted(Comparator.comparingInt(RecordResponse::recordedAt).reversed()) - .collect(groupingBy(RecordResponse::quarter)); - return groupedByQuarter.keySet() + Map> records = getRecordsGroupByQuarter(gameId); + return records.keySet() .stream() - .sorted(Comparator.comparingLong(Quarter::getId).reversed()) - .map(quarter -> new TimelineResponse(quarter.getName(), groupedByQuarter.get(quarter))) - .toList(); + .sorted(comparingLong(Quarter::getId).reversed()) + .map(quarter -> new TimelineResponse( + quarter.getName(), + records.get(quarter) + )).toList(); } + + private Map> getRecordsGroupByQuarter(Long gameId) { + return recordQueryServices.stream() + .flatMap(recordQueryService -> recordQueryService.findByGameId(gameId).stream()) + .sorted(comparingInt(RecordResponse::recordedAt).reversed()) + .collect(groupingBy(RecordResponse::quarter)); + } } From ff3711b706da93e7949e0842f6a5ff29ef269807 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 20:32:22 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[REFACTOR]=20ScoreRecordQueryService=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ScoreRecordQueryService.java | 57 +++++++++++++------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java index c2926e19..e78453e5 100644 --- a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java @@ -10,11 +10,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @Service @@ -28,26 +28,47 @@ public class ScoreRecordQueryService implements RecordQueryService { @Override public List findByGameId(Long gameId) { List gameTeams = gameTeamQueryRepository.findAllByGameWithTeam(gameId); - Map scores = gameTeams.stream() - .collect(toMap(gameTeam -> gameTeam, gameTeam -> 0)); - List scoreRecords = scoreRecordQueryRepository.findByGameId(gameId); + return mapToResponses(scoreRecords, gameTeams); + } - List responses = new ArrayList<>(); - for (ScoreRecord scoreRecord : scoreRecords) { - GameTeam gameTeam = scoreRecord.getRecord().getGameTeam(); - int score = scoreRecord.getScore(); - scores.put(gameTeam, scores.get(gameTeam) + score); - List histories = gameTeams.stream() - .map(team -> new ScoreRecordResponse.History( - team.getLeagueTeam().getName(), - team.getLeagueTeam().getLogoImageUrl(), - scores.get(team))) - .toList(); - ScoreRecordResponse scoreRecordResponse = new ScoreRecordResponse(score, histories); - responses.add(RecordResponse.from(scoreRecord, scoreRecordResponse)); - } + private List mapToResponses(List scoreRecords, + List gameTeams) { + Map scores = initializeScores(gameTeams); + List responses = scoreRecords.stream() + .map(record -> mapToResponse(gameTeams, scores, record)) + .collect(toList()); Collections.reverse(responses); return responses; } + + private Map initializeScores(List gameTeams) { + return gameTeams.stream() + .collect(toMap(gameTeam -> gameTeam, gameTeam -> 0)); + } + + private RecordResponse mapToResponse(List gameTeams, + Map scores, + ScoreRecord scoreRecord) { + GameTeam gameTeam = scoreRecord.getRecord().getGameTeam(); + int score = scoreRecord.getScore(); + + scores.put(gameTeam, scores.get(gameTeam) + score); + + List histories = generateHistories(scores, gameTeams); + return RecordResponse.from( + scoreRecord, + new ScoreRecordResponse(score, histories) + ); + } + + private List generateHistories(Map scores, + List gameTeams) { + return gameTeams.stream() + .map(team -> new ScoreRecordResponse.History( + team.getLeagueTeam().getName(), + team.getLeagueTeam().getLogoImageUrl(), + scores.get(team))) + .toList(); + } } From ec413289e6e5b4fb553398518c290fd31544500e Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 20:39:39 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[REFACTOR]=20ReplacementRecord=20->=20Rec?= =?UTF-8?q?ordResponse=20=EB=A7=A4=ED=95=91=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReplacementRecordQueryService.java | 4 ++- .../server/query/dto/mapper/RecordMapper.java | 32 +++++++++++++++++++ .../query/dto/response/RecordResponse.java | 16 ---------- 3 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java diff --git a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java index 9a55bab9..bc862a64 100644 --- a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java @@ -1,5 +1,6 @@ package com.sports.server.query.application; +import com.sports.server.query.dto.mapper.RecordMapper; import com.sports.server.query.dto.response.RecordResponse; import com.sports.server.query.repository.ReplacementRecordQueryRepository; import lombok.RequiredArgsConstructor; @@ -14,12 +15,13 @@ public class ReplacementRecordQueryService implements RecordQueryService { private final ReplacementRecordQueryRepository replacementRecordQueryRepository; + private final RecordMapper recordMapper; @Override public List findByGameId(Long gameId) { return replacementRecordQueryRepository.findByGameId(gameId) .stream() - .map(RecordResponse::from) + .map(recordMapper::toRecordResponse) .toList(); } } diff --git a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java new file mode 100644 index 00000000..e55858c5 --- /dev/null +++ b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java @@ -0,0 +1,32 @@ +package com.sports.server.query.dto.mapper; + +import com.sports.server.command.leagueteam.LeagueTeam; +import com.sports.server.command.record.domain.Record; +import com.sports.server.command.record.domain.ReplacementRecord; +import com.sports.server.query.dto.response.RecordResponse; +import com.sports.server.query.dto.response.ReplacementRecordResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + + +@Component +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class RecordMapper { + + public RecordResponse toRecordResponse(ReplacementRecord replacementRecord) { + Record record = replacementRecord.getRecord(); + LeagueTeam team = record.getGameTeam().getLeagueTeam(); + return new RecordResponse( + record.getRecordedQuarter(), + record.getRecordType().name(), + record.getRecordedAt(), + replacementRecord.getOriginLineupPlayer().getName(), + team.getName(), + team.getLogoImageUrl(), + null, + new ReplacementRecordResponse(replacementRecord.getReplacedLineupPlayer().getName()) + ); + } +} diff --git a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java index be8a09a5..3a1a1522 100644 --- a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.sports.server.command.leagueteam.LeagueTeam; import com.sports.server.command.record.domain.Record; -import com.sports.server.command.record.domain.ReplacementRecord; import com.sports.server.command.record.domain.ScoreRecord; import com.sports.server.command.sport.domain.Quarter; @@ -19,21 +18,6 @@ public record RecordResponse( ReplacementRecordResponse replacement ) { - public static RecordResponse from(ReplacementRecord replacementRecord) { - Record record = replacementRecord.getRecord(); - LeagueTeam team = record.getGameTeam().getLeagueTeam(); - return new RecordResponse( - record.getRecordedQuarter(), - record.getRecordType().name(), - record.getRecordedAt(), - replacementRecord.getOriginLineupPlayer().getName(), - team.getName(), - team.getLogoImageUrl(), - null, - new ReplacementRecordResponse(replacementRecord.getReplacedLineupPlayer().getName()) - ); - } - public static RecordResponse from(ScoreRecord scoreRecord, ScoreRecordResponse scoreRecordResponse) { Record record = scoreRecord.getRecord(); LeagueTeam team = record.getGameTeam().getLeagueTeam(); From 2c50dd0b9ce96b2b676f023178d9aedbfdfb0cc5 Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 21:53:46 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[REFACTOR]=20ScoreHistory=EC=99=80=20Scor?= =?UTF-8?q?eSnapshot=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=84=B0?= =?UTF-8?q?=EB=A7=81=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/application/ScoreHistory.java | 57 +++++++++++++++++++ .../application/ScoreRecordQueryService.java | 57 +++---------------- .../query/application/ScoreSnapshot.java | 28 +++++++++ .../server/query/dto/mapper/RecordMapper.java | 41 +++++++++++++ .../dto/response/ScoreRecordResponse.java | 4 +- .../TimelineQueryAcceptanceTest.java | 8 +-- .../TimelineQueryControllerTest.java | 20 +++---- 7 files changed, 150 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/sports/server/query/application/ScoreHistory.java create mode 100644 src/main/java/com/sports/server/query/application/ScoreSnapshot.java diff --git a/src/main/java/com/sports/server/query/application/ScoreHistory.java b/src/main/java/com/sports/server/query/application/ScoreHistory.java new file mode 100644 index 00000000..b8495fb0 --- /dev/null +++ b/src/main/java/com/sports/server/query/application/ScoreHistory.java @@ -0,0 +1,57 @@ +package com.sports.server.query.application; + +import com.sports.server.command.game.domain.GameTeam; +import com.sports.server.command.record.domain.ScoreRecord; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.toMap; + +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class ScoreHistory { + + private final Map snapshots; + + public static ScoreHistory of(List scoreRecords, List gameTeams) { + Map values = new HashMap<>(); + Map scores = initializeScores(gameTeams); + for (ScoreRecord record : scoreRecords) { + applyScore(scores, record); + ScoreSnapshot snapshot = generateSnapshot(scores, gameTeams); + values.put(record, snapshot); + } + return new ScoreHistory(values); + } + + private static Map initializeScores(List gameTeams) { + return gameTeams.stream() + .collect(toMap(gameTeam -> gameTeam, gameTeam -> 0)); + } + + private static void applyScore(Map scores, ScoreRecord record) { + GameTeam gameTeam = record.getRecord().getGameTeam(); + int score = record.getScore(); + scores.put(gameTeam, scores.get(gameTeam) + score); + } + + private static ScoreSnapshot generateSnapshot(Map scores, + List gameTeams) { + Map snapshot = new HashMap<>(); + gameTeams.forEach(team -> snapshot.put(team, scores.get(team))); + return new ScoreSnapshot(snapshot); + } + + public List getScoreRecordsOrderByTimeDesc() { + return snapshots.keySet().stream() + .sorted((r1, r2) -> Integer.compare(r2.getRecord().getRecordedAt(), r1.getRecord().getRecordedAt())) + .toList(); + } + + public ScoreSnapshot getSnapshot(ScoreRecord scoreRecord) { + return snapshots.get(scoreRecord); + } +} diff --git a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java index e78453e5..5b829407 100644 --- a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java @@ -1,21 +1,14 @@ package com.sports.server.query.application; -import com.sports.server.command.game.domain.GameTeam; -import com.sports.server.command.record.domain.ScoreRecord; +import com.sports.server.query.dto.mapper.RecordMapper; import com.sports.server.query.dto.response.RecordResponse; -import com.sports.server.query.dto.response.ScoreRecordResponse; import com.sports.server.query.repository.GameTeamQueryRepository; import com.sports.server.query.repository.ScoreRecordQueryRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; import java.util.List; -import java.util.Map; - -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toMap; @Service @Transactional(readOnly = true) @@ -24,51 +17,17 @@ public class ScoreRecordQueryService implements RecordQueryService { private final ScoreRecordQueryRepository scoreRecordQueryRepository; private final GameTeamQueryRepository gameTeamQueryRepository; + private final RecordMapper recordMapper; @Override public List findByGameId(Long gameId) { - List gameTeams = gameTeamQueryRepository.findAllByGameWithTeam(gameId); - List scoreRecords = scoreRecordQueryRepository.findByGameId(gameId); - return mapToResponses(scoreRecords, gameTeams); - } - - private List mapToResponses(List scoreRecords, - List gameTeams) { - Map scores = initializeScores(gameTeams); - List responses = scoreRecords.stream() - .map(record -> mapToResponse(gameTeams, scores, record)) - .collect(toList()); - Collections.reverse(responses); - return responses; - } - - private Map initializeScores(List gameTeams) { - return gameTeams.stream() - .collect(toMap(gameTeam -> gameTeam, gameTeam -> 0)); - } - - private RecordResponse mapToResponse(List gameTeams, - Map scores, - ScoreRecord scoreRecord) { - GameTeam gameTeam = scoreRecord.getRecord().getGameTeam(); - int score = scoreRecord.getScore(); - - scores.put(gameTeam, scores.get(gameTeam) + score); - - List histories = generateHistories(scores, gameTeams); - return RecordResponse.from( - scoreRecord, - new ScoreRecordResponse(score, histories) + ScoreHistory scoreHistory = ScoreHistory.of( + scoreRecordQueryRepository.findByGameId(gameId), + gameTeamQueryRepository.findAllByGameWithTeam(gameId) ); - } - - private List generateHistories(Map scores, - List gameTeams) { - return gameTeams.stream() - .map(team -> new ScoreRecordResponse.History( - team.getLeagueTeam().getName(), - team.getLeagueTeam().getLogoImageUrl(), - scores.get(team))) + return scoreHistory.getScoreRecordsOrderByTimeDesc() + .stream() + .map(record -> recordMapper.toRecordResponse(record, scoreHistory.getSnapshot(record))) .toList(); } } diff --git a/src/main/java/com/sports/server/query/application/ScoreSnapshot.java b/src/main/java/com/sports/server/query/application/ScoreSnapshot.java new file mode 100644 index 00000000..198a8447 --- /dev/null +++ b/src/main/java/com/sports/server/query/application/ScoreSnapshot.java @@ -0,0 +1,28 @@ +package com.sports.server.query.application; + +import com.sports.server.command.game.domain.GameTeam; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; + + +public class ScoreSnapshot { + + private final Map values; + + public ScoreSnapshot(Map values) { + this.values = values; + } + + public Integer getScore(GameTeam team) { + return values.get(team); + } + + public List getTeamsOrderById() { + return values.keySet() + .stream() + .sorted(Comparator.comparingLong(GameTeam::getId)) + .toList(); + } +} diff --git a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java index e55858c5..456e3c80 100644 --- a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java +++ b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java @@ -1,14 +1,20 @@ package com.sports.server.query.dto.mapper; +import com.sports.server.command.game.domain.GameTeam; import com.sports.server.command.leagueteam.LeagueTeam; import com.sports.server.command.record.domain.Record; import com.sports.server.command.record.domain.ReplacementRecord; +import com.sports.server.command.record.domain.ScoreRecord; +import com.sports.server.query.application.ScoreSnapshot; import com.sports.server.query.dto.response.RecordResponse; import com.sports.server.query.dto.response.ReplacementRecordResponse; +import com.sports.server.query.dto.response.ScoreRecordResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Component @Transactional(readOnly = true) @@ -29,4 +35,39 @@ public RecordResponse toRecordResponse(ReplacementRecord replacementRecord) { new ReplacementRecordResponse(replacementRecord.getReplacedLineupPlayer().getName()) ); } + + public RecordResponse toRecordResponse(ScoreRecord scoreRecord, ScoreSnapshot snapshot) { + Record record = scoreRecord.getRecord(); + int score = scoreRecord.getScore(); + LeagueTeam team = record.getGameTeam().getLeagueTeam(); + + List histories = toHistoryResponses(snapshot); + return new RecordResponse( + record.getRecordedQuarter(), + record.getRecordType().name(), + record.getRecordedAt(), + scoreRecord.getLineupPlayer().getName(), + team.getName(), + team.getLogoImageUrl(), + new ScoreRecordResponse(score, histories), + null + ); + } + + private List toHistoryResponses(ScoreSnapshot snapshot) { + return snapshot.getTeamsOrderById() + .stream() + .map(gameTeam -> toHistoryResponse(snapshot, gameTeam)) + .toList(); + } + + private ScoreRecordResponse.Snapshot toHistoryResponse(ScoreSnapshot snapshot, + GameTeam gameTeam) { + LeagueTeam leagueTeam = gameTeam.getLeagueTeam(); + return new ScoreRecordResponse.Snapshot( + leagueTeam.getName(), + leagueTeam.getLogoImageUrl(), + snapshot.getScore(gameTeam) + ); + } } diff --git a/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java index f376f764..dbdd4412 100644 --- a/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java @@ -4,10 +4,10 @@ public record ScoreRecordResponse( Integer point, - List histories + List snapshot ) { - public record History( + public record Snapshot( String teamName, String teamImageUrl, Integer score diff --git a/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java b/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java index a9230aef..913d367d 100644 --- a/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java +++ b/src/test/java/com/sports/server/query/acceptance/TimelineQueryAcceptanceTest.java @@ -60,9 +60,9 @@ public class TimelineQueryAcceptanceTest extends AcceptanceTest { TEAM_B, TEAM_B_IMAGE_URL, new ScoreRecordResponse(3, List.of( - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_A, TEAM_A_IMAGE_URL, 2), - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_B, TEAM_B_IMAGE_URL, 3) )), null @@ -95,9 +95,9 @@ public class TimelineQueryAcceptanceTest extends AcceptanceTest { TEAM_A, TEAM_A_IMAGE_URL, new ScoreRecordResponse(2, List.of( - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_A, TEAM_A_IMAGE_URL, 2), - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_B, TEAM_B_IMAGE_URL, 0) )), null diff --git a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java index b9b3017a..3118ec8c 100644 --- a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java @@ -48,9 +48,9 @@ public class TimelineQueryControllerTest extends DocumentationTest { TEAM_B, TEAM_B_IMAGE_URL, new ScoreRecordResponse(3, List.of( - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_A, TEAM_A_IMAGE_URL, 2), - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_B, TEAM_B_IMAGE_URL, 3) )), new ReplacementRecordResponse("선수3") @@ -62,9 +62,9 @@ public class TimelineQueryControllerTest extends DocumentationTest { TEAM_A, TEAM_A_IMAGE_URL, new ScoreRecordResponse(2, List.of( - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_A, TEAM_A_IMAGE_URL, 2), - new ScoreRecordResponse.History( + new ScoreRecordResponse.Snapshot( TEAM_B, TEAM_B_IMAGE_URL, 0) )), new ReplacementRecordResponse("선수3") @@ -91,12 +91,12 @@ public class TimelineQueryControllerTest extends DocumentationTest { fieldWithPath("[].records[].teamName").type(JsonFieldType.STRING).description("기록의 대상 팀 이름"), fieldWithPath("[].records[].teamImageUrl").type(JsonFieldType.STRING).description("기록의 대상 팀 이미지"), fieldWithPath("[].records[].score.point").type(JsonFieldType.NUMBER).description("SCORE 타입일 때 득점한 점수"), - fieldWithPath("[].records[].score.histories[].teamName").type(JsonFieldType.STRING) - .description("SCORE 타입일 때 점수 히스토리에 표시할 팀 이름"), - fieldWithPath("[].records[].score.histories[].teamImageUrl").type(JsonFieldType.STRING) - .description("SCORE 타입일 때 점수 히스토리에 표시할 팀 이미지"), - fieldWithPath("[].records[].score.histories[].score").type(JsonFieldType.NUMBER) - .description("SCORE 타입일 때 점수 히스토리에 표시할 점수"), + fieldWithPath("[].records[].score.snapshot[].teamName").type(JsonFieldType.STRING) + .description("SCORE 타입일 때 점수 스냅샷에 표시할 팀 이름"), + fieldWithPath("[].records[].score.snapshot[].teamImageUrl").type(JsonFieldType.STRING) + .description("SCORE 타입일 때 점수 스냅샷에 표시할 팀 이미지"), + fieldWithPath("[].records[].score.snapshot[].score").type(JsonFieldType.NUMBER) + .description("SCORE 타입일 때 점수 스냅샷에 표시할 점수"), fieldWithPath("[].records[].replacement.replacedPlayerName").type(JsonFieldType.STRING) .description("REPLACEMENT 타입일 때 교체되어 IN 되는 선수") ) From f062d34848f572209048f79dbf72814d21b4a44b Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 21:54:54 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[DOCS]=20=EC=88=98=EC=A0=95=EB=90=9C=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20api=20=EB=AC=B8=EC=84=9C=EC=97=90=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/query/application/ScoreHistory.java | 8 ++++---- .../server/query/dto/mapper/RecordMapper.java | 11 +++++------ src/main/resources/static/docs/api.html | 18 +++++++++--------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/sports/server/query/application/ScoreHistory.java b/src/main/java/com/sports/server/query/application/ScoreHistory.java index b8495fb0..b72649db 100644 --- a/src/main/java/com/sports/server/query/application/ScoreHistory.java +++ b/src/main/java/com/sports/server/query/application/ScoreHistory.java @@ -17,14 +17,14 @@ public class ScoreHistory { private final Map snapshots; public static ScoreHistory of(List scoreRecords, List gameTeams) { - Map values = new HashMap<>(); + Map snapshots = new HashMap<>(); Map scores = initializeScores(gameTeams); for (ScoreRecord record : scoreRecords) { applyScore(scores, record); ScoreSnapshot snapshot = generateSnapshot(scores, gameTeams); - values.put(record, snapshot); + snapshots.put(record, snapshot); } - return new ScoreHistory(values); + return new ScoreHistory(snapshots); } private static Map initializeScores(List gameTeams) { @@ -39,7 +39,7 @@ private static void applyScore(Map scores, ScoreRecord record } private static ScoreSnapshot generateSnapshot(Map scores, - List gameTeams) { + List gameTeams) { Map snapshot = new HashMap<>(); gameTeams.forEach(team -> snapshot.put(team, scores.get(team))); return new ScoreSnapshot(snapshot); diff --git a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java index 456e3c80..06e30a9e 100644 --- a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java +++ b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java @@ -41,7 +41,6 @@ public RecordResponse toRecordResponse(ScoreRecord scoreRecord, ScoreSnapshot sn int score = scoreRecord.getScore(); LeagueTeam team = record.getGameTeam().getLeagueTeam(); - List histories = toHistoryResponses(snapshot); return new RecordResponse( record.getRecordedQuarter(), record.getRecordType().name(), @@ -49,20 +48,20 @@ public RecordResponse toRecordResponse(ScoreRecord scoreRecord, ScoreSnapshot sn scoreRecord.getLineupPlayer().getName(), team.getName(), team.getLogoImageUrl(), - new ScoreRecordResponse(score, histories), + new ScoreRecordResponse(score, toSnapshotResponses(snapshot)), null ); } - private List toHistoryResponses(ScoreSnapshot snapshot) { + private List toSnapshotResponses(ScoreSnapshot snapshot) { return snapshot.getTeamsOrderById() .stream() - .map(gameTeam -> toHistoryResponse(snapshot, gameTeam)) + .map(gameTeam -> toSnapshotResponse(snapshot, gameTeam)) .toList(); } - private ScoreRecordResponse.Snapshot toHistoryResponse(ScoreSnapshot snapshot, - GameTeam gameTeam) { + private ScoreRecordResponse.Snapshot toSnapshotResponse(ScoreSnapshot snapshot, + GameTeam gameTeam) { LeagueTeam leagueTeam = gameTeam.getLeagueTeam(); return new ScoreRecordResponse.Snapshot( leagueTeam.getName(), diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 64e959b8..e8333a8c 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1709,7 +1709,7 @@

SCORE 타입일 때 득점한 점수

-

[].records[].score.histories[].teamName

+

[].records[].score.snapshot[].teamName

String

-

SCORE 타입일 때 점수 히스토리에 표시할 팀 이름

+

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이름

-

[].records[].score.histories[].teamImageUrl

+

[].records[].score.snapshot[].teamImageUrl

String

-

SCORE 타입일 때 점수 히스토리에 표시할 팀 이미지

+

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이미지

-

[].records[].score.histories[].score

+

[].records[].score.snapshot[].score

Number

-

SCORE 타입일 때 점수 히스토리에 표시할 점수

+

SCORE 타입일 때 점수 스냅샷에 표시할 점수

[].records[].replacement.replacedPlayerName

From f34bae3d94a22adf3693a7eed26352b72b9ca71e Mon Sep 17 00:00:00 2001 From: does Date: Sun, 25 Feb 2024 22:16:25 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[REFACTOR]=20application.timeline=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=EC=97=90=20=ED=83=80=EC=9E=84?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/application/{ => timeline}/RecordQueryService.java | 2 +- .../{ => timeline}/ReplacementRecordQueryService.java | 2 +- .../server/query/application/{ => timeline}/ScoreHistory.java | 2 +- .../application/{ => timeline}/ScoreRecordQueryService.java | 2 +- .../server/query/application/{ => timeline}/ScoreSnapshot.java | 2 +- .../query/application/{ => timeline}/TimelineQueryService.java | 2 +- .../java/com/sports/server/query/dto/mapper/RecordMapper.java | 3 +-- .../server/query/presentation/TimelineQueryController.java | 2 +- src/test/java/com/sports/server/support/DocumentationTest.java | 1 + 9 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/com/sports/server/query/application/{ => timeline}/RecordQueryService.java (76%) rename src/main/java/com/sports/server/query/application/{ => timeline}/ReplacementRecordQueryService.java (94%) rename src/main/java/com/sports/server/query/application/{ => timeline}/ScoreHistory.java (97%) rename src/main/java/com/sports/server/query/application/{ => timeline}/ScoreRecordQueryService.java (95%) rename src/main/java/com/sports/server/query/application/{ => timeline}/ScoreSnapshot.java (91%) rename src/main/java/com/sports/server/query/application/{ => timeline}/TimelineQueryService.java (96%) diff --git a/src/main/java/com/sports/server/query/application/RecordQueryService.java b/src/main/java/com/sports/server/query/application/timeline/RecordQueryService.java similarity index 76% rename from src/main/java/com/sports/server/query/application/RecordQueryService.java rename to src/main/java/com/sports/server/query/application/timeline/RecordQueryService.java index 79ccb165..7bde246c 100644 --- a/src/main/java/com/sports/server/query/application/RecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/timeline/RecordQueryService.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.query.dto.response.RecordResponse; diff --git a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java b/src/main/java/com/sports/server/query/application/timeline/ReplacementRecordQueryService.java similarity index 94% rename from src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java rename to src/main/java/com/sports/server/query/application/timeline/ReplacementRecordQueryService.java index bc862a64..9d4186a0 100644 --- a/src/main/java/com/sports/server/query/application/ReplacementRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/timeline/ReplacementRecordQueryService.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.query.dto.mapper.RecordMapper; import com.sports.server.query.dto.response.RecordResponse; diff --git a/src/main/java/com/sports/server/query/application/ScoreHistory.java b/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java similarity index 97% rename from src/main/java/com/sports/server/query/application/ScoreHistory.java rename to src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java index b72649db..86ce1d91 100644 --- a/src/main/java/com/sports/server/query/application/ScoreHistory.java +++ b/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.command.game.domain.GameTeam; import com.sports.server.command.record.domain.ScoreRecord; diff --git a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java b/src/main/java/com/sports/server/query/application/timeline/ScoreRecordQueryService.java similarity index 95% rename from src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java rename to src/main/java/com/sports/server/query/application/timeline/ScoreRecordQueryService.java index 5b829407..f75a35f5 100644 --- a/src/main/java/com/sports/server/query/application/ScoreRecordQueryService.java +++ b/src/main/java/com/sports/server/query/application/timeline/ScoreRecordQueryService.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.query.dto.mapper.RecordMapper; import com.sports.server.query.dto.response.RecordResponse; diff --git a/src/main/java/com/sports/server/query/application/ScoreSnapshot.java b/src/main/java/com/sports/server/query/application/timeline/ScoreSnapshot.java similarity index 91% rename from src/main/java/com/sports/server/query/application/ScoreSnapshot.java rename to src/main/java/com/sports/server/query/application/timeline/ScoreSnapshot.java index 198a8447..5a027255 100644 --- a/src/main/java/com/sports/server/query/application/ScoreSnapshot.java +++ b/src/main/java/com/sports/server/query/application/timeline/ScoreSnapshot.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.command.game.domain.GameTeam; diff --git a/src/main/java/com/sports/server/query/application/TimelineQueryService.java b/src/main/java/com/sports/server/query/application/timeline/TimelineQueryService.java similarity index 96% rename from src/main/java/com/sports/server/query/application/TimelineQueryService.java rename to src/main/java/com/sports/server/query/application/timeline/TimelineQueryService.java index ccb2aaf4..aa18ed57 100644 --- a/src/main/java/com/sports/server/query/application/TimelineQueryService.java +++ b/src/main/java/com/sports/server/query/application/timeline/TimelineQueryService.java @@ -1,4 +1,4 @@ -package com.sports.server.query.application; +package com.sports.server.query.application.timeline; import com.sports.server.command.sport.domain.Quarter; import com.sports.server.query.dto.response.RecordResponse; diff --git a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java index 06e30a9e..6d1ebeea 100644 --- a/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java +++ b/src/main/java/com/sports/server/query/dto/mapper/RecordMapper.java @@ -5,7 +5,7 @@ import com.sports.server.command.record.domain.Record; import com.sports.server.command.record.domain.ReplacementRecord; import com.sports.server.command.record.domain.ScoreRecord; -import com.sports.server.query.application.ScoreSnapshot; +import com.sports.server.query.application.timeline.ScoreSnapshot; import com.sports.server.query.dto.response.RecordResponse; import com.sports.server.query.dto.response.ReplacementRecordResponse; import com.sports.server.query.dto.response.ScoreRecordResponse; @@ -40,7 +40,6 @@ public RecordResponse toRecordResponse(ScoreRecord scoreRecord, ScoreSnapshot sn Record record = scoreRecord.getRecord(); int score = scoreRecord.getScore(); LeagueTeam team = record.getGameTeam().getLeagueTeam(); - return new RecordResponse( record.getRecordedQuarter(), record.getRecordType().name(), diff --git a/src/main/java/com/sports/server/query/presentation/TimelineQueryController.java b/src/main/java/com/sports/server/query/presentation/TimelineQueryController.java index 14738b58..651b1b14 100644 --- a/src/main/java/com/sports/server/query/presentation/TimelineQueryController.java +++ b/src/main/java/com/sports/server/query/presentation/TimelineQueryController.java @@ -1,6 +1,6 @@ package com.sports.server.query.presentation; -import com.sports.server.query.application.TimelineQueryService; +import com.sports.server.query.application.timeline.TimelineQueryService; import com.sports.server.query.dto.response.TimelineResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/src/test/java/com/sports/server/support/DocumentationTest.java b/src/test/java/com/sports/server/support/DocumentationTest.java index 4d4ec822..945d5e24 100644 --- a/src/test/java/com/sports/server/support/DocumentationTest.java +++ b/src/test/java/com/sports/server/support/DocumentationTest.java @@ -9,6 +9,7 @@ import com.sports.server.command.report.presentation.ReportController; import com.sports.server.common.log.TimeLogTemplate; import com.sports.server.query.application.*; +import com.sports.server.query.application.timeline.TimelineQueryService; import com.sports.server.query.presentation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; From 385eb79134f8911e4be9f255ea85c9161a284e73 Mon Sep 17 00:00:00 2001 From: does Date: Mon, 26 Feb 2024 00:12:00 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[REFACTOR]=20for=20=EB=AC=B8=20foreach?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/query/application/timeline/ScoreHistory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java b/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java index 86ce1d91..9f9f310e 100644 --- a/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java +++ b/src/main/java/com/sports/server/query/application/timeline/ScoreHistory.java @@ -19,11 +19,11 @@ public class ScoreHistory { public static ScoreHistory of(List scoreRecords, List gameTeams) { Map snapshots = new HashMap<>(); Map scores = initializeScores(gameTeams); - for (ScoreRecord record : scoreRecords) { + scoreRecords.forEach(record -> { applyScore(scores, record); ScoreSnapshot snapshot = generateSnapshot(scores, gameTeams); snapshots.put(record, snapshot); - } + }); return new ScoreHistory(snapshots); } From 7a53dafca0788ad8c769346ea147b8d13557c6d9 Mon Sep 17 00:00:00 2001 From: does Date: Mon, 26 Feb 2024 00:16:42 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[DCOS]=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20=ED=9B=84=20api=20=EB=AC=B8=EC=84=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 252 +++++++++++++++++++++++- 1 file changed, 251 insertions(+), 1 deletion(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 208b133d..9d4658e7 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1662,6 +1662,91 @@

+
+

리그에 해당하는 리그팀 전체 조회

+
+

HTTP request

+
+
+
GET /leagues/1/teams HTTP/1.1
+Content-Type: application/json;charset=UTF-8
+Host: www.api.hufstreaming.site
+
+
+
+
+

Path parameters

+ + ++++ + + + + + + + + + + + + +
Table 1. /leagues/{leagueId}/teams
ParameterDescription

leagueId

리그의 ID

+
+
+

HTTP response

+
+
+
HTTP/1.1 200 OK
+Vary: Origin
+Vary: Access-Control-Request-Method
+Vary: Access-Control-Request-Headers
+Content-Type: application/json
+Content-Length: 124
+
+[ {
+  "leagueTeamId" : 1,
+  "teamName" : "경영 야생마"
+}, {
+  "leagueTeamId" : 2,
+  "teamName" : "서어 뻬데뻬"
+} ]
+
+
+
+
+

Response fields

+ +++++ + + + + + + + + + + + + + + + + + + + +
PathTypeDescription

[].leagueTeamId

Number

리그의 팀 ID

[].teamName

String

리그에 참여하는 팀의 이름

+
+
@@ -1669,7 +1754,172 @@

타임라

게임의 타임라인 조회

+
+

HTTP request

+
+
+
GET /games/1/timeline HTTP/1.1
+Content-Type: application/json;charset=UTF-8
+Host: www.api.hufstreaming.site
+
+
+
+
+

Path parameters

+ + ++++ + + + + + + + + + + + + +
Table 1. /games/{gameId}/timeline
ParameterDescription

gameId

게임의 ID

+
+
+

HTTP response

+
+
+
HTTP/1.1 200 OK
+Vary: Origin
+Vary: Access-Control-Request-Method
+Vary: Access-Control-Request-Headers
+Content-Type: application/json
+Content-Length: 1116
 
+[ {
+  "gameQuarter" : "2쿼터",
+  "records" : [ {
+    "type" : "SCORE",
+    "recordedAt" : 13,
+    "playerName" : "선수10",
+    "teamName" : "팀B",
+    "teamImageUrl" : "http://example.com/logo_b.png",
+    "score" : {
+      "point" : 3,
+      "snapshot" : [ {
+        "teamName" : "팀A",
+        "teamImageUrl" : "http://example.com/logo_a.png",
+        "score" : 2
+      }, {
+        "teamName" : "팀B",
+        "teamImageUrl" : "http://example.com/logo_b.png",
+        "score" : 3
+      } ]
+    },
+    "replacement" : {
+      "replacedPlayerName" : "선수3"
+    }
+  }, {
+    "type" : "REPLACEMENT",
+    "recordedAt" : 10,
+    "playerName" : "선수2",
+    "teamName" : "팀A",
+    "teamImageUrl" : "http://example.com/logo_a.png",
+    "score" : {
+      "point" : 2,
+      "snapshot" : [ {
+        "teamName" : "팀A",
+        "teamImageUrl" : "http://example.com/logo_a.png",
+        "score" : 2
+      }, {
+        "teamName" : "팀B",
+        "teamImageUrl" : "http://example.com/logo_b.png",
+        "score" : 0
+      } ]
+    },
+    "replacement" : {
+      "replacedPlayerName" : "선수3"
+    }
+  } ]
+} ]
+
+
+
+
+

Response fields

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PathTypeDescription

[].gameQuarter

String

쿼터의 이름

[].records[].type

String

기록의 타입

[].records[].recordedAt

Number

기록된 시간

[].records[].playerName

String

기록의 대상 선수 이름

[].records[].teamName

String

기록의 대상 팀 이름

[].records[].teamImageUrl

String

기록의 대상 팀 이미지

[].records[].score.point

Number

SCORE 타입일 때 득점한 점수

[].records[].score.snapshot[].teamName

String

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이름

[].records[].score.snapshot[].teamImageUrl

String

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이미지

[].records[].score.snapshot[].score

Number

SCORE 타입일 때 점수 스냅샷에 표시할 점수

[].records[].replacement.replacedPlayerName

String

REPLACEMENT 타입일 때 교체되어 IN 되는 선수

+

@@ -1703,7 +1953,7 @@

From d849c158ae0f1aa8e43257e8a4d7383f96ceb90f Mon Sep 17 00:00:00 2001 From: does Date: Tue, 27 Feb 2024 13:04:34 +0900 Subject: [PATCH 16/16] =?UTF-8?q?[FIX]=20=EC=9D=91=EB=8B=B5=20=EB=B3=B8?= =?UTF-8?q?=EB=AC=B8=20=ED=95=84=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20#107?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/dto/response/RecordResponse.java | 4 ++-- .../dto/response/ScoreRecordResponse.java | 2 +- src/main/resources/static/docs/api.html | 24 +++++++++---------- .../TimelineQueryControllerTest.java | 10 ++++---- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java index 3a1a1522..4f90fa00 100644 --- a/src/main/java/com/sports/server/query/dto/response/RecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/RecordResponse.java @@ -14,8 +14,8 @@ public record RecordResponse( String playerName, String teamName, String teamImageUrl, - ScoreRecordResponse score, - ReplacementRecordResponse replacement + ScoreRecordResponse scoreRecord, + ReplacementRecordResponse replacementRecord ) { public static RecordResponse from(ScoreRecord scoreRecord, ScoreRecordResponse scoreRecordResponse) { diff --git a/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java index dbdd4412..9e8f9d34 100644 --- a/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/ScoreRecordResponse.java @@ -3,7 +3,7 @@ import java.util.List; public record ScoreRecordResponse( - Integer point, + Integer score, List snapshot ) { diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 9d4658e7..ca471b26 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1795,7 +1795,7 @@

기록의 대상 팀 이미지

-

[].records[].score.point

+

[].records[].scoreRecord.score

Number

SCORE 타입일 때 득점한 점수

-

[].records[].score.snapshot[].teamName

+

[].records[].scoreRecord.snapshot[].teamName

String

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이름

-

[].records[].score.snapshot[].teamImageUrl

+

[].records[].scoreRecord.snapshot[].teamImageUrl

String

SCORE 타입일 때 점수 스냅샷에 표시할 팀 이미지

-

[].records[].score.snapshot[].score

+

[].records[].scoreRecord.snapshot[].score

Number

SCORE 타입일 때 점수 스냅샷에 표시할 점수

-

[].records[].replacement.replacedPlayerName

+

[].records[].replacementRecord.replacedPlayerName

String

REPLACEMENT 타입일 때 교체되어 IN 되는 선수

diff --git a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java index 3118ec8c..a96a91a6 100644 --- a/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/TimelineQueryControllerTest.java @@ -90,14 +90,14 @@ public class TimelineQueryControllerTest extends DocumentationTest { fieldWithPath("[].records[].playerName").type(JsonFieldType.STRING).description("기록의 대상 선수 이름"), fieldWithPath("[].records[].teamName").type(JsonFieldType.STRING).description("기록의 대상 팀 이름"), fieldWithPath("[].records[].teamImageUrl").type(JsonFieldType.STRING).description("기록의 대상 팀 이미지"), - fieldWithPath("[].records[].score.point").type(JsonFieldType.NUMBER).description("SCORE 타입일 때 득점한 점수"), - fieldWithPath("[].records[].score.snapshot[].teamName").type(JsonFieldType.STRING) + fieldWithPath("[].records[].scoreRecord.score").type(JsonFieldType.NUMBER).description("SCORE 타입일 때 득점한 점수"), + fieldWithPath("[].records[].scoreRecord.snapshot[].teamName").type(JsonFieldType.STRING) .description("SCORE 타입일 때 점수 스냅샷에 표시할 팀 이름"), - fieldWithPath("[].records[].score.snapshot[].teamImageUrl").type(JsonFieldType.STRING) + fieldWithPath("[].records[].scoreRecord.snapshot[].teamImageUrl").type(JsonFieldType.STRING) .description("SCORE 타입일 때 점수 스냅샷에 표시할 팀 이미지"), - fieldWithPath("[].records[].score.snapshot[].score").type(JsonFieldType.NUMBER) + fieldWithPath("[].records[].scoreRecord.snapshot[].score").type(JsonFieldType.NUMBER) .description("SCORE 타입일 때 점수 스냅샷에 표시할 점수"), - fieldWithPath("[].records[].replacement.replacedPlayerName").type(JsonFieldType.STRING) + fieldWithPath("[].records[].replacementRecord.replacedPlayerName").type(JsonFieldType.STRING) .description("REPLACEMENT 타입일 때 교체되어 IN 되는 선수") ) ));