From a7ae04decbef11356d452dbd55a9b50ec5d74d57 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 11 Sep 2024 17:26:03 +0900 Subject: [PATCH 01/22] =?UTF-8?q?[FEAT]=20=EA=B2=BD=EA=B8=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/game/application/GameService.java | 12 ++++++++++++ .../sports/server/command/game/domain/Game.java | 15 +++++++++++++++ .../server/command/game/dto/GameRequestDto.java | 10 ++++++++++ .../command/game/presentation/GameController.java | 15 ++++++++++----- 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/sports/server/command/game/application/GameService.java b/src/main/java/com/sports/server/command/game/application/GameService.java index e20353e6..b4bef7c2 100644 --- a/src/main/java/com/sports/server/command/game/application/GameService.java +++ b/src/main/java/com/sports/server/command/game/application/GameService.java @@ -3,9 +3,11 @@ import com.sports.server.auth.exception.AuthorizationErrorMessages; import com.sports.server.command.game.domain.Game; import com.sports.server.command.game.domain.GameRepository; +import com.sports.server.command.game.domain.GameState; import com.sports.server.command.game.domain.GameTeam; import com.sports.server.command.game.dto.GameRequestDto; import com.sports.server.command.league.domain.League; +import com.sports.server.command.league.domain.Round; import com.sports.server.command.leagueteam.domain.LeagueTeam; import com.sports.server.command.member.domain.Member; import com.sports.server.command.sport.domain.Sport; @@ -69,4 +71,14 @@ private League getLeagueAndCheckPermission(final Long leagueId, final Member man return league; } + + @Transactional + public void updateGame(Long leagueId, Long gameId, GameRequestDto.Update request, Member manager) { + League league = entityUtils.getEntity(leagueId, League.class); + if (!league.isManagedBy(manager)) { + throw new UnauthorizedException(AuthorizationErrorMessages.PERMISSION_DENIED); + } + Game game = entityUtils.getEntity(gameId, Game.class); + game.update(request.name(), request.startTime(), request.videoId(), request.quarter(), GameState.from(request.state()), Round.from(request.round())); + } } \ No newline at end of file diff --git a/src/main/java/com/sports/server/command/game/domain/Game.java b/src/main/java/com/sports/server/command/game/domain/Game.java index 5f4a6187..2f8258d7 100644 --- a/src/main/java/com/sports/server/command/game/domain/Game.java +++ b/src/main/java/com/sports/server/command/game/domain/Game.java @@ -22,6 +22,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.util.StringUtils; @Entity @Getter @@ -112,6 +113,20 @@ public void cancelScore(LineupPlayer scorer) { scoredTeam.cancelScore(); } + public void update(String name, LocalDateTime startTime, + String videoId, String gameQuarter, GameState state, Round round) { + if (StringUtils.hasText(name)) { + this.name = name; + } + this.startTime = startTime; + this.videoId = videoId; + if (StringUtils.hasText(name)) { + this.gameQuarter = gameQuarter; + } + this.state = state; + this.round = round; + } + public Game(Sport sport, Member manager, League league, String name, LocalDateTime startTime, String videoId, String gameQuarter, GameState state, Round round) { this.sport = sport; diff --git a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java index 61f45c07..7a35d0a3 100644 --- a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java +++ b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java @@ -24,4 +24,14 @@ public Game toEntity(Sport sport, Member manager, League league) { Round.from(round)); } } + + public record Update( + String name, + String round, + String quarter, + String state, + LocalDateTime startTime, + String videoId + ) { + } } diff --git a/src/main/java/com/sports/server/command/game/presentation/GameController.java b/src/main/java/com/sports/server/command/game/presentation/GameController.java index 2184788a..dbf61040 100644 --- a/src/main/java/com/sports/server/command/game/presentation/GameController.java +++ b/src/main/java/com/sports/server/command/game/presentation/GameController.java @@ -10,11 +10,7 @@ import java.net.URI; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -52,4 +48,13 @@ public ResponseEntity registerGame(@PathVariable final Long leagueId, gameService.register(leagueId, requestDto, member); return ResponseEntity.created(URI.create("")).build(); } + + @PutMapping("/leagues/{leagueId}/{gameId}") + public ResponseEntity updateGame(@PathVariable final Long leagueId, + @PathVariable final Long gameId, + @RequestBody final GameRequestDto.Update requestDto, + final Member member) { + gameService.updateGame(leagueId, gameId, requestDto, member); + return ResponseEntity.ok().build(); + } } From 3ee97b1dc96a7a701ddc62ae02c8779865f0917d Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 11 Sep 2024 17:27:02 +0900 Subject: [PATCH 02/22] =?UTF-8?q?[TEST]=20=EA=B2=BD=EA=B8=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/application/GameServiceTest.java | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java index b13765dc..b6e9dca9 100644 --- a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java +++ b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java @@ -1,10 +1,11 @@ package com.sports.server.command.game.application; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; +import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertAll; import com.sports.server.command.game.domain.Game; +import com.sports.server.command.game.domain.GameState; import com.sports.server.command.game.domain.GameTeam; import com.sports.server.command.game.domain.LineupPlayer; import com.sports.server.command.game.dto.GameRequestDto; @@ -27,6 +28,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.jdbc.Sql; +import org.testcontainers.shaded.org.checkerframework.checker.units.qual.K; @Sql("/game-fixture.sql") public class GameServiceTest extends ServiceTest { @@ -136,5 +138,50 @@ private void assertLineupPlayers(List gameTeams) { } } + @Nested + @DisplayName("게임을 수정할 때") + class updateGameTest { + + private GameRequestDto.Update updateDto; + private Long leagueId; + private Long gameId; + private Member manager; + + @BeforeEach + void setUp() { + updateDto = new GameRequestDto.Update(nameOfGame, "8강", "후반전", "PLAYING", + LocalDateTime.now(), "videoId"); + leagueId = 1L; + gameId = 1L; + manager = entityUtils.getEntity(1L, Member.class); + } + + @Test + void 정상적으로_게임이_수정된다() { + // when + gameService.updateGame(leagueId, gameId, updateDto, manager); + + // then + Game game = entityUtils.getEntity(gameId, Game.class); + assertThat(game.getGameQuarter()).isEqualTo(updateDto.quarter()); + assertThat(game.getRound()).isEqualTo(Round.from(updateDto.round())); + assertThat(game.getName()).isEqualTo(updateDto.name()); + assertThat(game.getStartTime()).isEqualTo(updateDto.startTime()); + assertThat(game.getState()).isEqualTo(GameState.from(updateDto.state())); + assertThat(game.getVideoId()).isEqualTo(updateDto.videoId()); + } + + @Test + void 게임이_속한_리그의_매니저가_아닌_회원이_게임을_수정하려고_하면_예외가_발생한다() { + // given + Member nonManager = entityUtils.getEntity(2L, Member.class); + + // when & then + assertThrows(UnauthorizedException.class, () -> { + gameService.updateGame(leagueId, gameId, updateDto, nonManager); + }); + } + + } } From 888f13afa9cc21b3fd636c0e2f8985e2d9abf475 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 11 Sep 2024 17:27:25 +0900 Subject: [PATCH 03/22] =?UTF-8?q?[TEST]=20=EA=B2=BD=EA=B8=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=9D=B8=EC=88=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/acceptance/GameAcceptanceTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java index b0830a09..03032a36 100644 --- a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java +++ b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java @@ -159,4 +159,31 @@ public class GameAcceptanceTest extends AcceptanceTest { // then AssertionsForClassTypes.assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); } + + @Test + void 경기_정보를_수정한다() throws Exception { + + // given + Long leagueId = 1L; + Long gameId = 1L; + GameRequestDto.Update request = new GameRequestDto.Update("경기 이름", "16강", "후반전", "PLAYING", + LocalDateTime.now(), "videoId"); + + configureMockJwtForEmail("john.doe@example.com"); + + // when + ExtractableResponse response = RestAssured.given().log().all() + .cookie(COOKIE_NAME, mockToken) + .pathParam("leagueId", leagueId) + .pathParam("gameId", gameId) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .body(request) + .put("/leagues/{leagueId}/{gameId}", leagueId, gameId) + .then().log().all() + .extract(); + + // then + assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); + + } } From 4bb45524b79130ee9425e6dcabeb29da358f5a61 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 11 Sep 2024 17:40:45 +0900 Subject: [PATCH 04/22] =?UTF-8?q?[DOCS]=20=EA=B2=BD=EA=B8=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EB=AC=B8=EC=84=9C=ED=99=94=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/api.adoc | 4 + src/main/resources/static/docs/api.html | 172 +++++++++++++++++- .../game/presentation/GameControllerTest.java | 42 ++++- 3 files changed, 211 insertions(+), 7 deletions(-) diff --git a/src/docs/asciidoc/api.adoc b/src/docs/asciidoc/api.adoc index 496b848c..759e3a69 100644 --- a/src/docs/asciidoc/api.adoc +++ b/src/docs/asciidoc/api.adoc @@ -42,6 +42,10 @@ operation::game-query-controller-test/라인업을_조회한다[snippets='http-r operation::game-controller-test/경기를_등록한다[snippets='http-request,path-parameters,http-response'] +=== 게임 수정 + +operation::game-controller-test/경기를_수정한다[snippets='http-request,path-parameters,http-response'] + == 라인업 API === 라인업 선수 선발로 변경 diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index d4c71b2a..3158553b 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -461,6 +461,7 @@

훕치치 서버 API 문서

  • 게임 응원 횟수 조회
  • 게임 라인업 조회
  • 게임 등록
  • +
  • 게임 수정
  • 라인업 API @@ -482,6 +483,7 @@

    훕치치 서버 API 문서

  • 리그 API
  • @@ -1396,7 +1399,7 @@

    POST /leagues/1/games HTTP/1.1
     Content-Type: application/json
    -Content-Length: 212
    +Content-Length: 211
     Host: www.api.hufstreaming.site
     Cookie: HCC_SES=temp-cookie
     
    @@ -1405,7 +1408,7 @@ 

    +

    게임 수정

    +
    +

    HTTP request

    +
    +
    +
    PUT /leagues/1/1 HTTP/1.1
    +Content-Type: application/json
    +Content-Length: 172
    +Host: www.api.hufstreaming.site
    +Cookie: HCC_SES=temp-cookie
    +
    +{
    +  "name" : "게임 이름",
    +  "round" : "16강",
    +  "quarter" : "전반전",
    +  "state" : "PLAYING",
    +  "startTime" : "2024-09-11T17:39:40.691981",
    +  "videoId" : "videoId"
    +}
    +
    +
    +
    +
    +

    Path parameters

    +
    +

    Snippet path-parameters not found for operation::game-controller-test/경기를_수정한다

    +
    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +
    +
    +
    +
    @@ -1654,13 +1698,57 @@

    +

    Request fields

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

    organizationId

    Number

    조직 id

    name

    String

    대회 이름

    maxRound

    String

    대회 진행 라운드 수

    startAt

    String

    대회 시작 시간

    endAt

    String

    대회 종료 시간

    +
    +

    HTTP response

    @@ -1673,6 +1761,78 @@

    +

    리그 수정

    +
    +

    HTTP request

    +
    +
    +
    PUT /leagues/5124 HTTP/1.1
    +Content-Type: application/json
    +Content-Length: 166
    +Host: www.api.hufstreaming.site
    +Cookie: HCC_SES=temp-cookie
    +
    +{
    +  "name" : "훕치치배 망고 빨리먹기 대회",
    +  "startAt" : "2024-09-11T17:39:41.603027",
    +  "endAt" : "2024-09-11T17:39:41.603035",
    +  "maxRound" : "16강"
    +}
    +
    +
    +
    +
    +

    Request fields

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

    name

    String

    변경할 대회의 이름

    startAt

    String

    변경할 대회 시작시간

    endAt

    String

    변경할 대회 종료시간

    maxRound

    String

    변경할 대회의 총 라운드 수

    +
    +
    +

    HTTP response

    +
    +
    +
    HTTP/1.1 200 OK
    +Vary: Origin
    +Vary: Access-Control-Request-Method
    +Vary: Access-Control-Request-Headers
    +
    +
    +
    +

    +

    리그 전체 조회

    diff --git a/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java index 42ac3b55..d498e4f1 100644 --- a/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java +++ b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java @@ -1,6 +1,8 @@ package com.sports.server.command.game.presentation; - +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doNothing; import static org.springframework.restdocs.cookies.CookieDocumentation.cookieWithName; import static org.springframework.restdocs.cookies.CookieDocumentation.requestCookies; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; @@ -9,10 +11,12 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.requestFields; import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.sports.server.command.game.dto.CheerCountUpdateRequest; import com.sports.server.command.game.dto.GameRequestDto; +import com.sports.server.command.member.domain.Member; import com.sports.server.support.DocumentationTest; import jakarta.servlet.http.Cookie; import java.time.LocalDateTime; @@ -140,5 +144,41 @@ public class GameControllerTest extends DocumentationTest { )); } + @Test + void 경기를_수정한다() throws Exception { + + // given + Long leagueId = 1L; + Long gameId = 1L; + GameRequestDto.Update requestDto = new GameRequestDto.Update( + "게임 이름", "16강", "전반전", "PLAYING", LocalDateTime.now(), "videoId" + ); + + doNothing().when(gameService).updateGame(anyLong(), anyLong(), any(GameRequestDto.Update.class), any(Member.class)); + + // when + ResultActions result = mockMvc.perform(put("/leagues/{leagueId}/{gameId}", leagueId, gameId) + .contentType(MediaType.APPLICATION_JSON_VALUE) + .content(objectMapper.writeValueAsString(requestDto)) + .cookie(new Cookie(COOKIE_NAME, "temp-cookie"))); + + // then + result.andExpect(status().isOk()) + .andDo(restDocsHandler.document( + requestFields( + fieldWithPath("name").type(JsonFieldType.STRING).description("변경할 경기의 이름"), + fieldWithPath("round").type(JsonFieldType.STRING).description("변경할 경기의 라운드 ex. 16강, 결승"), + fieldWithPath("quarter").type(JsonFieldType.STRING).description("쿼터"), + fieldWithPath("state").type(JsonFieldType.STRING).description("경기의 상태"), + fieldWithPath("startTime").type(JsonFieldType.STRING).description("시작 날짜 및 시각"), + fieldWithPath("videoId").type(JsonFieldType.STRING) + .description("경기 영상 링크") + ), + requestCookies( + cookieWithName(COOKIE_NAME).description("로그인을 통해 얻은 토큰") + ) + )); + } + } From 6c51383412f31e1c14f88d6bd44c32168fe060b5 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 11 Sep 2024 19:10:43 +0900 Subject: [PATCH 05/22] =?UTF-8?q?[DOCS]=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 44 ++++++++++++++----- .../game/presentation/GameControllerTest.java | 6 ++- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 3158553b..d0fddd56 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1399,7 +1399,7 @@

    POST /leagues/1/games HTTP/1.1
     Content-Type: application/json
    -Content-Length: 211
    +Content-Length: 212
     Host: www.api.hufstreaming.site
     Cookie: HCC_SES=temp-cookie
     
    @@ -1408,7 +1408,7 @@ 

    @@ -1476,9 +1476,29 @@

    Path parameters

    -
    -

    Snippet path-parameters not found for operation::game-controller-test/경기를_수정한다

    -
    + + ++++ + + + + + + + + + + + + + + + + +
    Table 1. /leagues/{leagueId}/{gameId}
    ParameterDescription

    leagueId

    리그의 ID

    gameId

    경기의 ID

    @@ -1774,8 +1794,8 @@

    @@ -3198,7 +3218,7 @@

    Date: Wed, 11 Sep 2024 19:39:31 +0900 Subject: [PATCH 06/22] =?UTF-8?q?[TEST]=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=97=90=EC=84=9C=20LocalDateTime.n?= =?UTF-8?q?ow()=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/command/game/application/GameServiceTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java index b6e9dca9..1aecbae7 100644 --- a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java +++ b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java @@ -149,8 +149,9 @@ class updateGameTest { @BeforeEach void setUp() { + LocalDateTime fixedLocalDateTime = LocalDateTime.of(2024, 9, 11, 12, 0, 0); updateDto = new GameRequestDto.Update(nameOfGame, "8강", "후반전", "PLAYING", - LocalDateTime.now(), "videoId"); + fixedLocalDateTime, "videoId"); leagueId = 1L; gameId = 1L; manager = entityUtils.getEntity(1L, Member.class); From f4551e30adb417b19bb56cd6561b9fdcf332717b Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Thu, 12 Sep 2024 17:02:41 +0900 Subject: [PATCH 07/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81=20?= =?UTF-8?q?#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/application/GameServiceTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java index 1aecbae7..ae3a6460 100644 --- a/src/test/java/com/sports/server/command/game/application/GameServiceTest.java +++ b/src/test/java/com/sports/server/command/game/application/GameServiceTest.java @@ -1,7 +1,6 @@ package com.sports.server.command.game.application; import static org.assertj.core.api.Assertions.*; -import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertAll; import com.sports.server.command.game.domain.Game; @@ -164,12 +163,14 @@ void setUp() { // then Game game = entityUtils.getEntity(gameId, Game.class); - assertThat(game.getGameQuarter()).isEqualTo(updateDto.quarter()); - assertThat(game.getRound()).isEqualTo(Round.from(updateDto.round())); - assertThat(game.getName()).isEqualTo(updateDto.name()); - assertThat(game.getStartTime()).isEqualTo(updateDto.startTime()); - assertThat(game.getState()).isEqualTo(GameState.from(updateDto.state())); - assertThat(game.getVideoId()).isEqualTo(updateDto.videoId()); + assertAll( + () -> assertThat(game.getGameQuarter()).isEqualTo(updateDto.quarter()), + () -> assertThat(game.getRound()).isEqualTo(Round.from(updateDto.round())), + () -> assertThat(game.getName()).isEqualTo(updateDto.name()), + () -> assertThat(game.getStartTime()).isEqualTo(updateDto.startTime()), + () -> assertThat(game.getState()).isEqualTo(GameState.from(updateDto.state())), + () -> assertThat(game.getVideoId()).isEqualTo(updateDto.videoId()) + ); } @Test @@ -178,9 +179,8 @@ void setUp() { Member nonManager = entityUtils.getEntity(2L, Member.class); // when & then - assertThrows(UnauthorizedException.class, () -> { - gameService.updateGame(leagueId, gameId, updateDto, nonManager); - }); + assertThatThrownBy(() -> gameService.updateGame(leagueId, gameId, updateDto, nonManager)) + .isInstanceOf(UnauthorizedException.class); } } From c37a689a556580fe300fc542b4ff63973616eb87 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Thu, 12 Sep 2024 17:05:23 +0900 Subject: [PATCH 08/22] =?UTF-8?q?[FEAT]=20security=20config=EC=97=90=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=88=98=EC=A0=95=20Url=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/sports/server/auth/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/sports/server/auth/config/SecurityConfig.java b/src/main/java/com/sports/server/auth/config/SecurityConfig.java index 1fd9cc7a..8749b6e9 100644 --- a/src/main/java/com/sports/server/auth/config/SecurityConfig.java +++ b/src/main/java/com/sports/server/auth/config/SecurityConfig.java @@ -43,6 +43,7 @@ SecurityFilterChain filterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc mvc.pattern(HttpMethod.GET, "/members/info"), mvc.pattern(HttpMethod.POST, "/leagues"), mvc.pattern(HttpMethod.PUT, "/leagues/{leagueId}"), + mvc.pattern(HttpMethod.PUT, "/leagues/{leagueId}/{gameId}"), mvc.pattern(HttpMethod.POST, "/leagues/*/teams"), mvc.pattern(HttpMethod.POST, "/leagues/{leagueId}/teams"), mvc.pattern(HttpMethod.PUT, "/leagues/{leagueId}/teams/{teamId}"), From 86617cfdeb4906e6f78c89b3f36727ca4b60ca4c Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Thu, 12 Sep 2024 17:54:55 +0900 Subject: [PATCH 09/22] =?UTF-8?q?[TEST]=20=EA=B2=8C=EC=9E=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=9D=B8=EC=88=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/acceptance/GameAcceptanceTest.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java index 03032a36..5174160a 100644 --- a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java +++ b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java @@ -3,9 +3,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import com.sports.server.command.game.domain.GameState; import com.sports.server.command.game.domain.LineupPlayerState; import com.sports.server.command.game.dto.CheerCountUpdateRequest; import com.sports.server.command.game.dto.GameRequestDto; +import com.sports.server.command.league.domain.Round; import com.sports.server.query.dto.response.GameTeamCheerResponseDto; import com.sports.server.query.dto.response.LineupPlayerResponse; import com.sports.server.support.AcceptanceTest; @@ -166,8 +168,13 @@ public class GameAcceptanceTest extends AcceptanceTest { // given Long leagueId = 1L; Long gameId = 1L; - GameRequestDto.Update request = new GameRequestDto.Update("경기 이름", "16강", "후반전", "PLAYING", - LocalDateTime.now(), "videoId"); + String name = "경기 이름"; + String round = "16깅"; + String quarter = "후반전"; + String state = "PLAYING"; + LocalDateTime fixedLocalDateTime = LocalDateTime.of(2024, 9, 11, 12, 0, 0); + String videoId = "videoId"; + GameRequestDto.Update request = new GameRequestDto.Update(name, round, quarter, state, fixedLocalDateTime, videoId); configureMockJwtForEmail("john.doe@example.com"); @@ -183,7 +190,15 @@ public class GameAcceptanceTest extends AcceptanceTest { .extract(); // then - assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); - + GameRequestDto.Update update = toResponses(response, GameRequestDto.Update.class).get(0); + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(update.quarter()).isEqualTo(quarter), + () -> assertThat(update.round()).isEqualTo(Round.from(round)), + () -> assertThat(update.name()).isEqualTo(name), + () -> assertThat(update.startTime()).isEqualTo(fixedLocalDateTime), + () -> assertThat(update.state()).isEqualTo(GameState.from(state)), + () -> assertThat(update.videoId()).isEqualTo(videoId) + ); } } From 09b53bac7a7e84ce621a63a57e872cb2184ff76b Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Sat, 14 Sep 2024 00:59:32 +0900 Subject: [PATCH 10/22] =?UTF-8?q?[REFACTOR]=20=EC=BA=A1=EC=8A=90=ED=99=94?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=B4=20=EC=84=9C=EB=B9=84=EC=8A=A4?= =?UTF-8?q?=EB=8B=A8=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=8C=EC=9E=84=20=EC=88=98=EC=A0=95=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=B3=80=EA=B2=BD=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sports/server/command/game/application/GameService.java | 5 ++++- .../com/sports/server/command/game/dto/GameRequestDto.java | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sports/server/command/game/application/GameService.java b/src/main/java/com/sports/server/command/game/application/GameService.java index b4bef7c2..95713663 100644 --- a/src/main/java/com/sports/server/command/game/application/GameService.java +++ b/src/main/java/com/sports/server/command/game/application/GameService.java @@ -79,6 +79,9 @@ public void updateGame(Long leagueId, Long gameId, GameRequestDto.Update request throw new UnauthorizedException(AuthorizationErrorMessages.PERMISSION_DENIED); } Game game = entityUtils.getEntity(gameId, Game.class); - game.update(request.name(), request.startTime(), request.videoId(), request.quarter(), GameState.from(request.state()), Round.from(request.round())); + Sport sport = sportRepository.findByName(NAME_OF_SPORT) + .orElseThrow(() -> new NotFoundException("해당 이름을 가진 스포츠가 존재하지 않습니다.")); + Game updatedGame = request.toEntity(sport, manager, league); + game.updateAll(updatedGame); } } \ No newline at end of file diff --git a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java index 7a35d0a3..0a3053bb 100644 --- a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java +++ b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java @@ -33,5 +33,9 @@ public record Update( LocalDateTime startTime, String videoId ) { + public Game toEntity(Sport sport, Member manager, League league) { + return new Game(sport, manager, league, name, startTime, videoId, quarter, GameState.from(state), + Round.from(round)); + } } } From 846e3249545daf36cb02c08a23881a3602cd7f68 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Sat, 14 Sep 2024 00:59:56 +0900 Subject: [PATCH 11/22] =?UTF-8?q?[REFACTOR]=20=EC=9C=A0=EC=A7=80=EB=B3=B4?= =?UTF-8?q?=EC=88=98=EC=84=B1=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20update=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=93=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/command/game/domain/Game.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/sports/server/command/game/domain/Game.java b/src/main/java/com/sports/server/command/game/domain/Game.java index 1319a22d..d02caf4f 100644 --- a/src/main/java/com/sports/server/command/game/domain/Game.java +++ b/src/main/java/com/sports/server/command/game/domain/Game.java @@ -115,20 +115,45 @@ public void cancelScore(LineupPlayer scorer) { scoredTeam.cancelScore(); } - public void update(String name, LocalDateTime startTime, - String videoId, String gameQuarter, GameState state, Round round) { + public void updateName(String name) { if (StringUtils.hasText(name)) { this.name = name; } + } + + public void updateStartTime(LocalDateTime startTime) { this.startTime = startTime; - this.videoId = videoId; - if (StringUtils.hasText(name)) { + } + + public void updateVideoId(String videoId) { + if (StringUtils.hasText(videoId)) { + this.videoId = videoId; + } + } + + public void updateGameQuarter(String gameQuarter) { + if (StringUtils.hasText(gameQuarter)) { this.gameQuarter = gameQuarter; } + } + + public void updateState(GameState state) { this.state = state; + } + + public void updateRound(Round round) { this.round = round; } + public void updateAll(Game updatedGame) { + updateName(updatedGame.name); + updateStartTime(updatedGame.startTime); + updateVideoId(updatedGame.videoId); + updateGameQuarter(updatedGame.gameQuarter); + updateState(updatedGame.state); + updateRound(updatedGame.round); + } + public Game(Sport sport, Member manager, League league, String name, LocalDateTime startTime, String videoId, String gameQuarter, GameState state, Round round) { this.sport = sport; From 82ae0a8bd6aa547d5257287d1e10d97d1e7744c5 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Sat, 14 Sep 2024 01:00:49 +0900 Subject: [PATCH 12/22] =?UTF-8?q?[TEST]=20=EC=9D=B8=EC=88=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=97=90=EC=84=9C=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=9B=84=20=EB=8B=A4=EC=8B=9C=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=99=80=20=EC=A0=95=EB=B3=B4=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/acceptance/GameAcceptanceTest.java | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java index 6669c393..bdca0b65 100644 --- a/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java +++ b/src/test/java/com/sports/server/command/game/acceptance/GameAcceptanceTest.java @@ -8,6 +8,7 @@ import com.sports.server.command.game.dto.CheerCountUpdateRequest; import com.sports.server.command.game.dto.GameRequestDto; import com.sports.server.command.league.domain.Round; +import com.sports.server.query.dto.response.GameDetailResponse; import com.sports.server.query.dto.response.GameTeamCheerResponseDto; import com.sports.server.query.dto.response.LineupPlayerResponse; import com.sports.server.support.AcceptanceTest; @@ -162,41 +163,48 @@ public class GameAcceptanceTest extends AcceptanceTest { } @Test - void 경기_정보를_수정한다() throws Exception { + void 경기_정보를_수정한_후_다시_가져와_확인한다() throws Exception { // given Long leagueId = 1L; Long gameId = 1L; String name = "경기 이름"; - String round = "16깅"; + String round = "16강"; String quarter = "후반전"; String state = "PLAYING"; LocalDateTime fixedLocalDateTime = LocalDateTime.of(2024, 9, 11, 12, 0, 0); String videoId = "videoId"; GameRequestDto.Update request = new GameRequestDto.Update(name, round, quarter, state, fixedLocalDateTime, videoId); - configureMockJwtForEmail("john.doe@example.com"); + configureMockJwtForEmail(MOCK_EMAIL); // when - ExtractableResponse response = RestAssured.given().log().all() + ExtractableResponse putResponse = RestAssured.given().log().all() .cookie(COOKIE_NAME, mockToken) .pathParam("leagueId", leagueId) .pathParam("gameId", gameId) .contentType(MediaType.APPLICATION_JSON_VALUE) .body(request) - .put("/leagues/{leagueId}/{gameId}", leagueId, gameId) + .put("/leagues/{leagueId}/{gameId}") + .then().log().all() + .extract(); + ExtractableResponse getResponse = RestAssured.given().log().all() + .when() + .contentType(MediaType.APPLICATION_JSON_VALUE) + .get("/games/{gameId}", gameId) .then().log().all() .extract(); - GameRequestDto.Update update = toResponses(response, GameRequestDto.Update.class).get(0); + // then + GameDetailResponse updatedGame = toResponse(getResponse, GameDetailResponse.class); assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(update.quarter()).isEqualTo(quarter), - () -> assertThat(update.round()).isEqualTo(Round.from(round)), - () -> assertThat(update.name()).isEqualTo(name), - () -> assertThat(update.startTime()).isEqualTo(fixedLocalDateTime), - () -> assertThat(update.state()).isEqualTo(GameState.from(state)), - () -> assertThat(update.videoId()).isEqualTo(videoId) + () -> assertThat(putResponse.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(updatedGame.gameQuarter()).isEqualTo(quarter), + () -> assertThat(updatedGame.round()).isEqualTo(Round.from(round).name()), + () -> assertThat(updatedGame.gameName()).isEqualTo(name), + () -> assertThat(updatedGame.startTime()).isEqualTo(fixedLocalDateTime), + () -> assertThat(updatedGame.state()).isEqualTo(state), + () -> assertThat(updatedGame.videoId()).isEqualTo(videoId) ); } @@ -207,12 +215,6 @@ public class GameAcceptanceTest extends AcceptanceTest { Long gameId = 1L; Long gameTeamId = 1L; Long lineupPlayerId = 2L; - String name = "경기 이름"; - String round = "16깅"; - String quarter = "후반전"; - String state = "PLAYING"; - LocalDateTime fixedLocalDateTime = LocalDateTime.of(2024, 9, 11, 12, 0, 0); - String videoId = "videoId"; // when RestAssured.given().log().all() @@ -232,15 +234,18 @@ public class GameAcceptanceTest extends AcceptanceTest { .extract(); // then - GameRequestDto.Update update = toResponses(response, GameRequestDto.Update.class).get(0); + List lineupPlayerResponses = toResponses(response, LineupPlayerResponse.class).stream() + .filter(lineupPlayerResponse -> lineupPlayerResponse.gameTeamId().equals(gameTeamId)) + .toList(); + + List actual = lineupPlayerResponses.get(0).gameTeamPlayers().stream() + .filter(playerResponse -> playerResponse.id().equals(lineupPlayerId)) + .toList(); + assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(update.quarter()).isEqualTo(quarter), - () -> assertThat(update.round()).isEqualTo(Round.from(round)), - () -> assertThat(update.name()).isEqualTo(name), - () -> assertThat(update.startTime()).isEqualTo(fixedLocalDateTime), - () -> assertThat(update.state()).isEqualTo(GameState.from(state)), - () -> assertThat(update.videoId()).isEqualTo(videoId) + () -> assertThat(lineupPlayerResponses.get(0).gameTeamId().equals(gameTeamId)), + () -> assertThat(actual.get(0).id().equals(lineupPlayerId)), + () -> assertThat(actual.get(0).isCaptain()).isEqualTo(true) ); } From 2db3e1b3c6e8aef982eb058d479ddc6f5bbb2dac Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Sat, 14 Sep 2024 01:02:36 +0900 Subject: [PATCH 13/22] =?UTF-8?q?[FEAT]=20=EA=B2=8C=EC=9E=84=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=9C=20round=20=EC=B6=94=EA=B0=80=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/query/dto/response/GameDetailResponse.java | 6 ++++-- .../server/query/presentation/GameQueryControllerTest.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/sports/server/query/dto/response/GameDetailResponse.java b/src/main/java/com/sports/server/query/dto/response/GameDetailResponse.java index b4ee2d03..aa8e0a15 100644 --- a/src/main/java/com/sports/server/query/dto/response/GameDetailResponse.java +++ b/src/main/java/com/sports/server/query/dto/response/GameDetailResponse.java @@ -13,7 +13,8 @@ public record GameDetailResponse( String gameName, String sportName, List gameTeams, - String state + String state, + String round ) { public GameDetailResponse(Game game, List gameTeams) { @@ -27,7 +28,8 @@ public GameDetailResponse(Game game, List gameTeams) { .sorted(Comparator.comparingLong(GameTeam::getId)) .map(TeamResponse::new) .toList(), - game.getState().name() + game.getState().name(), + game.getRound().name() ); } diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 8b3a2c42..3292693d 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -38,7 +38,7 @@ class GameQueryControllerTest extends DocumentationTest { ); LocalDateTime startTime = LocalDateTime.of(2024, 1, 19, 13, 0, 0); GameDetailResponse response = new GameDetailResponse( - startTime, "videoId", "전반전", "4강", "축구", gameTeams, "PLAYING" + startTime, "videoId", "전반전", "여름축구", "축구", gameTeams, "PLAYING", "4강" ); given(gameQueryService.getGameDetail(gameId)) .willReturn(response); From 1c69fc78f8e60579795ca909bb2887c046b4e31a Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Sat, 14 Sep 2024 01:15:55 +0900 Subject: [PATCH 14/22] =?UTF-8?q?[DOCS]=20=EA=B2=8C=EC=9E=84=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95=ED=95=9C=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EB=AC=B8=EC=84=9C=ED=99=94=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 46 ++++++++----------- .../presentation/GameQueryControllerTest.java | 2 +- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 7078eb42..e10d92a9 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -493,8 +493,6 @@

    훕치치 서버 API 문서

  • 리그팀 수정
  • 리그팀 삭제
  • 리그 상세 조회
  • -
  • 리그 삭제
  • -
  • 리그팀 상세 조회
  • 매니저가 생성한 리그 전체 조회
  • 리그 삭제
  • 리그팀 상세 조회
  • @@ -765,13 +763,13 @@

    @@ -831,9 +830,9 @@

    종목

    -

    sportName

    +

    round

    String

    -

    종목

    +

    게임의 라운드

    gameTeams[].gameTeamId

    @@ -1414,8 +1413,7 @@

    @@ -1791,10 +1789,8 @@

    @@ -1863,16 +1859,14 @@

    PUT /leagues/5124 HTTP/1.1
     Content-Type: application/json
    -Content-Length: 166
    +Content-Length: 165
     Host: www.api.hufstreaming.site
     Cookie: HCC_SES=temp-cookie
     
     {
       "name" : "훕치치배 망고 빨리먹기 대회",
    -  "startAt" : "2024-09-11T19:10:13.188636",
    -  "endAt" : "2024-09-11T19:10:13.188641",
    -  "startAt" : "2024-09-10T21:21:15.472437",
    -  "endAt" : "2024-09-10T21:21:15.472445",
    +  "startAt" : "2024-09-14T01:15:12.60881",
    +  "endAt" : "2024-09-14T01:15:12.608815",
       "maxRound" : "16강"
     }
    @@ -2645,7 +2639,7 @@

    diff --git a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java index 3292693d..b7e75e77 100644 --- a/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java +++ b/src/test/java/com/sports/server/query/presentation/GameQueryControllerTest.java @@ -60,7 +60,7 @@ class GameQueryControllerTest extends DocumentationTest { fieldWithPath("gameQuarter").type(JsonFieldType.STRING).description("게임 쿼터"), fieldWithPath("gameName").type(JsonFieldType.STRING).description("게임 이름"), fieldWithPath("sportName").type(JsonFieldType.STRING).description("종목"), - fieldWithPath("sportName").type(JsonFieldType.STRING).description("종목"), + fieldWithPath("round").type(JsonFieldType.STRING).description("게임의 라운드"), fieldWithPath("gameTeams[].gameTeamId").type(JsonFieldType.NUMBER) .description("게임팀의 ID"), fieldWithPath("gameTeams[].gameTeamName").type(JsonFieldType.STRING) From 725ac4fa1166cea7e089f40e5fd190db13b067c6 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 18 Sep 2024 17:22:03 +0900 Subject: [PATCH 15/22] =?UTF-8?q?[REFACTOR]=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=8B=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EA=B0=80=20DTO=EC=97=90=20=EC=9D=98=EC=A1=B4=ED=95=98=EA=B1=B0?= =?UTF-8?q?=EB=82=98=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20#208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/command/game/application/GameService.java | 10 ++++++---- .../com/sports/server/command/game/domain/Game.java | 9 +-------- .../sports/server/command/game/dto/GameRequestDto.java | 6 +----- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/sports/server/command/game/application/GameService.java b/src/main/java/com/sports/server/command/game/application/GameService.java index 95713663..4b7de20e 100644 --- a/src/main/java/com/sports/server/command/game/application/GameService.java +++ b/src/main/java/com/sports/server/command/game/application/GameService.java @@ -79,9 +79,11 @@ public void updateGame(Long leagueId, Long gameId, GameRequestDto.Update request throw new UnauthorizedException(AuthorizationErrorMessages.PERMISSION_DENIED); } Game game = entityUtils.getEntity(gameId, Game.class); - Sport sport = sportRepository.findByName(NAME_OF_SPORT) - .orElseThrow(() -> new NotFoundException("해당 이름을 가진 스포츠가 존재하지 않습니다.")); - Game updatedGame = request.toEntity(sport, manager, league); - game.updateAll(updatedGame); + game.updateName(request.name()); + game.updateStartTime(request.startTime()); + game.updateVideoId(request.videoId()); + game.updateGameQuarter(request.quarter()); + game.updateState(GameState.from(request.state())); + game.updateRound(Round.from(request.round())); } } \ No newline at end of file diff --git a/src/main/java/com/sports/server/command/game/domain/Game.java b/src/main/java/com/sports/server/command/game/domain/Game.java index d02caf4f..08df3588 100644 --- a/src/main/java/com/sports/server/command/game/domain/Game.java +++ b/src/main/java/com/sports/server/command/game/domain/Game.java @@ -1,5 +1,6 @@ package com.sports.server.command.game.domain; +import com.sports.server.command.game.dto.GameRequestDto; import com.sports.server.command.league.domain.League; import com.sports.server.command.league.domain.Round; import com.sports.server.command.member.domain.Member; @@ -145,14 +146,6 @@ public void updateRound(Round round) { this.round = round; } - public void updateAll(Game updatedGame) { - updateName(updatedGame.name); - updateStartTime(updatedGame.startTime); - updateVideoId(updatedGame.videoId); - updateGameQuarter(updatedGame.gameQuarter); - updateState(updatedGame.state); - updateRound(updatedGame.round); - } public Game(Sport sport, Member manager, League league, String name, LocalDateTime startTime, String videoId, String gameQuarter, GameState state, Round round) { diff --git a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java index 0a3053bb..c9032206 100644 --- a/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java +++ b/src/main/java/com/sports/server/command/game/dto/GameRequestDto.java @@ -33,9 +33,5 @@ public record Update( LocalDateTime startTime, String videoId ) { - public Game toEntity(Sport sport, Member manager, League league) { - return new Game(sport, manager, league, name, startTime, videoId, quarter, GameState.from(state), - Round.from(round)); - } } -} +} \ No newline at end of file From afdb5e7d1f2886a0cad6d04bdf246cfb391d5ab1 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Sat, 14 Sep 2024 16:15:08 +0900 Subject: [PATCH 16/22] =?UTF-8?q?[MERGE]=20=EB=A9=94=EC=9D=B8=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EB=B3=80=EA=B2=BD=20=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20#215?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/presentation/GameControllerTest.java | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java index 1ddf8be0..e7ddc5bf 100644 --- a/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java +++ b/src/test/java/com/sports/server/command/game/presentation/GameControllerTest.java @@ -185,58 +185,4 @@ public class GameControllerTest extends DocumentationTest { } - @Test - void 라인업_선수를_주장으로_등록한다() throws Exception { - - //given - Long gameId = 1L; - Long gameTeamId = 1L; - Long lineupPlayerId = 1L; - - //when - ResultActions result = mockMvc.perform( - patch("/games/{gameId}/{gameTeamId}/lineup-players/{lineupPlayerId}/captain/register", gameId, - gameTeamId, - lineupPlayerId) - .contentType(MediaType.APPLICATION_JSON) - ); - - //then - result.andExpect((status().isOk())) - .andDo(restDocsHandler.document( - pathParameters( - parameterWithName("gameId").description("게임의 ID"), - parameterWithName("gameTeamId").description("게임팀의 ID"), - parameterWithName("lineupPlayerId").description("라인업 선수의 ID") - ) - )); - } - - @Test - void 라인업_선수를_주장에서_해제한다() throws Exception { - - //given - Long gameId = 1L; - Long gameTeamId = 1L; - Long lineupPlayerId = 1L; - - //when - ResultActions result = mockMvc.perform( - patch("/games/{gameId}/{gameTeamId}/lineup-players/{lineupPlayerId}/captain/revoke", gameId, - gameTeamId, - lineupPlayerId) - .contentType(MediaType.APPLICATION_JSON) - ); - - //then - result.andExpect((status().isOk())) - .andDo(restDocsHandler.document( - pathParameters( - parameterWithName("gameId").description("게임의 ID"), - parameterWithName("gameTeamId").description("게임팀의 ID"), - parameterWithName("lineupPlayerId").description("라인업 선수의 ID") - ) - )); - } - } From d155abc052bffa52d4c40fa18b85d19e7e0e82a4 Mon Sep 17 00:00:00 2001 From: Jin409 Date: Sat, 14 Sep 2024 16:15:33 +0900 Subject: [PATCH 17/22] =?UTF-8?q?[FEAT]=20=EC=B6=9C=EC=A0=84=20=EC=84=A0?= =?UTF-8?q?=EC=88=98=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#215?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/LineupPlayerQueryService.java | 14 ++++++++++++++ .../query/presentation/GameQueryController.java | 5 +++++ .../repository/LineupPlayerQueryRepository.java | 11 +++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/sports/server/query/application/LineupPlayerQueryService.java b/src/main/java/com/sports/server/query/application/LineupPlayerQueryService.java index c3b621ca..8516372b 100644 --- a/src/main/java/com/sports/server/query/application/LineupPlayerQueryService.java +++ b/src/main/java/com/sports/server/query/application/LineupPlayerQueryService.java @@ -34,4 +34,18 @@ public List getLineup(final Long gameId) { groupByTeam.getOrDefault(gameTeam, new ArrayList<>()))) .toList(); } + + public List getPlayingLineup(final Long gameId) { + Map> groupByTeam = lineupPlayerQueryRepository.findPlayingPlayersByGameId(gameId) + .stream() + .collect(groupingBy(LineupPlayer::getGameTeam)); + + List gameTeams = groupByTeam.keySet().stream().toList(); + + return gameTeams.stream() + .sorted(Comparator.comparingLong(GameTeam::getId)) + .map(gameTeam -> new LineupPlayerResponse(gameTeam, + groupByTeam.getOrDefault(gameTeam, new ArrayList<>()))) + .toList(); + } } diff --git a/src/main/java/com/sports/server/query/presentation/GameQueryController.java b/src/main/java/com/sports/server/query/presentation/GameQueryController.java index 764c33da..17ee4075 100644 --- a/src/main/java/com/sports/server/query/presentation/GameQueryController.java +++ b/src/main/java/com/sports/server/query/presentation/GameQueryController.java @@ -56,4 +56,9 @@ public ResponseEntity> getCheerCountOfGameTeams( public ResponseEntity> getGameLineup(@PathVariable final Long gameId) { return ResponseEntity.ok(lineupPlayerQueryService.getLineup(gameId)); } + + @GetMapping("/{gameId}/lineup/playing") + public ResponseEntity> getGamePlayingLineup(@PathVariable final Long gameId) { + return ResponseEntity.ok(lineupPlayerQueryService.getPlayingLineup(gameId)); + } } diff --git a/src/main/java/com/sports/server/query/repository/LineupPlayerQueryRepository.java b/src/main/java/com/sports/server/query/repository/LineupPlayerQueryRepository.java index 2287e9e5..6caa8849 100644 --- a/src/main/java/com/sports/server/query/repository/LineupPlayerQueryRepository.java +++ b/src/main/java/com/sports/server/query/repository/LineupPlayerQueryRepository.java @@ -2,12 +2,11 @@ import com.sports.server.command.game.domain.LineupPlayer; +import java.util.List; 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 LineupPlayerQueryRepository extends Repository { @Query("select lp from LineupPlayer lp " + @@ -16,4 +15,12 @@ public interface LineupPlayerQueryRepository extends Repository findPlayersByGameId(@Param("gameId") final Long gameId); + + @Query("select lp from LineupPlayer lp " + + "join fetch lp.gameTeam gt " + + "join fetch gt.leagueTeam " + + "where gt.game.id = :gameId " + + "and lp.isPlaying = true " + + "order by lp.number asc") + List findPlayingPlayersByGameId(@Param("gameId") final Long gameId); } From e943348d3a5591ca2be78b8848876bf7ae727227 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 18 Sep 2024 17:37:11 +0900 Subject: [PATCH 18/22] =?UTF-8?q?[MERGE]=20=EB=A9=94=EC=9D=B8=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LineupPlayerQueryServiceTest.java | 22 +++++++++++++++++++ .../LineupPlayerFixtureRepository.java | 16 ++++++++++++++ src/test/resources/game-fixture.sql | 4 ++-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java diff --git a/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java b/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java index 26508dde..aa84020c 100644 --- a/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java +++ b/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java @@ -2,8 +2,11 @@ import static org.junit.Assert.assertEquals; +import com.sports.server.command.game.domain.LineupPlayer; import com.sports.server.query.dto.response.LineupPlayerResponse; +import com.sports.server.query.dto.response.LineupPlayerResponse.PlayerResponse; import com.sports.server.support.ServiceTest; +import com.sports.server.support.fixture.LineupPlayerFixtureRepository; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -17,6 +20,9 @@ public class LineupPlayerQueryServiceTest extends ServiceTest { @Autowired private LineupPlayerQueryService lineupPlayerQueryService; + @Autowired + private LineupPlayerFixtureRepository lineupPlayerFixtureRepository; + @Test void 라인업_조회시_게임팀_아이디의_오름차순으로_반환된다() { @@ -37,4 +43,20 @@ public class LineupPlayerQueryServiceTest extends ServiceTest { ); } + + @Test + void 출전_선수_조회시_출전상태인_선수들만_조회된다() { + + // given + Long gameId = 1L; + List playingPlayers = lineupPlayerFixtureRepository.findPlayingPlayersByGameId(gameId); + + // when + List responses = lineupPlayerQueryService.getPlayingLineup(gameId); + + // then + assertEquals(playingPlayers.stream().map(LineupPlayer::getId).toList(), responses.stream() + .flatMap(lp -> lp.gameTeamPlayers().stream().map(PlayerResponse::id)) + .collect(Collectors.toList())); + } } diff --git a/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java b/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java new file mode 100644 index 00000000..e9212341 --- /dev/null +++ b/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java @@ -0,0 +1,16 @@ +package com.sports.server.support.fixture; + +import com.sports.server.command.game.domain.LineupPlayer; +import java.util.List; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; + + +public interface LineupPlayerFixtureRepository extends Repository { + + @Query("select lp from LineupPlayer lp " + + "join fetch lp.gameTeam gt " + + "where gt.game.id = :gameId " + + "and lp.isPlaying = true ") + List findPlayingPlayersByGameId(Long gameId); +} diff --git a/src/test/resources/game-fixture.sql b/src/test/resources/game-fixture.sql index 410ce110..c1a41b52 100644 --- a/src/test/resources/game-fixture.sql +++ b/src/test/resources/game-fixture.sql @@ -97,7 +97,7 @@ VALUES (1, 1, '선수1', '센터', 1, false, 1, 'CANDIDATE', false), (2, 1, '선수2', '파워 포워드', 2, false, 2, 'STARTER', false), (3, 1, '선수3', '슈팅 가드', 3, false, 3, 'STARTER', false), (4, 1, '선수4', '포인트 가드', 4, false, 4, 'STARTER', false), - (5, 1, '선수5', '스몰 포워드', 5, false, 5, 'STARTER', false); + (5, 1, '선수5', '스몰 포워드', 5, false, 5, 'STARTER', true); -- 농구 대전(game_id = 1) B팀 선수 @@ -107,7 +107,7 @@ VALUES (6, 2, '선수6', '센터', 1, true, 1, 'CANDIDATE', false), (7, 2, '선수7', '파워 포워드', 2, false, 1, 'STARTER', false), (8, 2, '선수8', '슈팅 가드', 3, false, 1, 'STARTER', false), (9, 2, '선수9', '포인트 가드', 4, false, 1, 'STARTER', false), - (10, 2, '선수10', '스몰 포워드', 5, false, 1, 'STARTER', false); + (10, 2, '선수10', '스몰 포워드', 5, false, 1, 'STARTER', true); -- 농구 대전 (game_id = 1) A팀 vs B팀 -- User From f362032d5d9c2ced05afd25dddfb7775c370b803 Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 18 Sep 2024 17:44:43 +0900 Subject: [PATCH 19/22] =?UTF-8?q?[MERGE]=20=EB=A9=94=EC=9D=B8=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 26 ++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 6e6c503c..12e11925 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1602,7 +1602,7 @@

    @@ -2048,14 +2048,14 @@

    PUT /leagues/5124 HTTP/1.1
     Content-Type: application/json
    -Content-Length: 165
    +Content-Length: 166
     Host: www.api.hufstreaming.site
     Cookie: HCC_SES=temp-cookie
     
     {
       "name" : "훕치치배 망고 빨리먹기 대회",
    -  "startAt" : "2024-09-18T14:45:04.67925",
    -  "endAt" : "2024-09-18T14:45:04.679256",
    +  "startAt" : "2024-09-14T16:10:17.966513",
    +  "endAt" : "2024-09-14T16:10:17.966519",
       "maxRound" : "16강"
     }
    @@ -2927,7 +2927,11 @@

    From 002ad86dda70ea724a0a5c5a49dde706f2f8f7ca Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 16 Sep 2024 20:12:56 +0900 Subject: [PATCH 20/22] =?UTF-8?q?[TEST]=20=EB=9D=BC=EC=9D=B8=EC=97=85=20?= =?UTF-8?q?=EC=84=A0=EC=88=98=EA=B0=80=20=EC=B6=9C=EC=A0=84=20=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?#215?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/query/application/LineupPlayerQueryServiceTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java b/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java index cdca6036..ace5a0b6 100644 --- a/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java +++ b/src/test/java/com/sports/server/query/application/LineupPlayerQueryServiceTest.java @@ -5,9 +5,7 @@ import com.sports.server.command.game.domain.LineupPlayer; import com.sports.server.common.application.EntityUtils; import com.sports.server.query.dto.response.LineupPlayerResponse; -import com.sports.server.query.dto.response.LineupPlayerResponse.PlayerResponse; import com.sports.server.support.ServiceTest; -import com.sports.server.support.fixture.LineupPlayerFixtureRepository; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; From f699b620b33270e208c801d152a663f689fcc94b Mon Sep 17 00:00:00 2001 From: Jin409 Date: Mon, 16 Sep 2024 20:13:39 +0900 Subject: [PATCH 21/22] =?UTF-8?q?[TEST]=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20fixture=20=EC=9A=A9=20reposito?= =?UTF-8?q?ry=20=EC=82=AD=EC=A0=9C=20#215?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fixture/LineupPlayerFixtureRepository.java | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java diff --git a/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java b/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java deleted file mode 100644 index e9212341..00000000 --- a/src/test/java/com/sports/server/support/fixture/LineupPlayerFixtureRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sports.server.support.fixture; - -import com.sports.server.command.game.domain.LineupPlayer; -import java.util.List; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.Repository; - - -public interface LineupPlayerFixtureRepository extends Repository { - - @Query("select lp from LineupPlayer lp " + - "join fetch lp.gameTeam gt " + - "where gt.game.id = :gameId " + - "and lp.isPlaying = true ") - List findPlayingPlayersByGameId(Long gameId); -} From 2498d4d4f16bb7baa8d6e9f453ddc13cf02a60bd Mon Sep 17 00:00:00 2001 From: Zena0128 <0128ja@gmail.com> Date: Wed, 18 Sep 2024 17:46:43 +0900 Subject: [PATCH 22/22] =?UTF-8?q?[MERGE]=20=EB=A9=94=EC=9D=B8=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/docs/api.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/resources/static/docs/api.html b/src/main/resources/static/docs/api.html index 12e11925..d6938182 100644 --- a/src/main/resources/static/docs/api.html +++ b/src/main/resources/static/docs/api.html @@ -1602,7 +1602,7 @@

    @@ -2048,14 +2048,14 @@

    PUT /leagues/5124 HTTP/1.1
     Content-Type: application/json
    -Content-Length: 166
    +Content-Length: 165
     Host: www.api.hufstreaming.site
     Cookie: HCC_SES=temp-cookie
     
     {
       "name" : "훕치치배 망고 빨리먹기 대회",
    -  "startAt" : "2024-09-14T16:10:17.966513",
    -  "endAt" : "2024-09-14T16:10:17.966519",
    +  "startAt" : "2024-09-18T14:45:04.67925",
    +  "endAt" : "2024-09-18T14:45:04.679256",
       "maxRound" : "16강"
     }
    @@ -2939,12 +2939,12 @@