From b2688b6db2eecaabca31ca29bf9d6fed8a7af9ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=A4=80=EC=98=81?= Date: Fri, 4 Sep 2026 19:25:54 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20PROCESSING=20=EB=B9=8C=EB=93=9C=EB=8F=84?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=86=A0=ED=81=B0=20=EC=9E=AC?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 홈페이지 서버가 처리 도중 죽거나 웹훅 호출 자체가 실패하면 빌드가 PROCESSING에서 영영 못 벗어나 재시도가 막히는 사각지대가 있었다. 재업로드는 멱등하므로 PROCESSING에서도 재발급을 허용한다. --- .../game/service/AdminGameBuildService.java | 4 +++- .../game/AdminGameBuildIntegrationTest.java | 11 +++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameBuildService.java b/src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameBuildService.java index c5af3c5..158ac7c 100644 --- a/src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameBuildService.java +++ b/src/main/java/com/bcsdlab/bcsdinternalapiv2/game/service/AdminGameBuildService.java @@ -31,8 +31,10 @@ @Transactional(readOnly = true) public class AdminGameBuildService { + // PROCESSING도 포함한다 — 홈페이지 서버가 죽거나 웹훅 호출 자체가 실패하면 빌드가 + // PROCESSING에서 영영 못 벗어나 재시도가 막히는 사각지대가 생긴다(재업로드는 멱등하다). private static final Set TOKEN_ISSUABLE_STATUSES = Set.of( - GameBuildStatus.PENDING, GameBuildStatus.FAILED); + GameBuildStatus.PENDING, GameBuildStatus.PROCESSING, GameBuildStatus.FAILED); private final GameRepository gameRepository; private final GameBuildRepository gameBuildRepository; diff --git a/src/test/java/com/bcsdlab/bcsdinternalapiv2/game/AdminGameBuildIntegrationTest.java b/src/test/java/com/bcsdlab/bcsdinternalapiv2/game/AdminGameBuildIntegrationTest.java index 5c5f044..92e0d43 100644 --- a/src/test/java/com/bcsdlab/bcsdinternalapiv2/game/AdminGameBuildIntegrationTest.java +++ b/src/test/java/com/bcsdlab/bcsdinternalapiv2/game/AdminGameBuildIntegrationTest.java @@ -145,8 +145,8 @@ void setUp() throws Exception { } @Test - @DisplayName("AC-9.15 PENDING 빌드에 업로드 토큰을 발급하면 status가 PROCESSING이 되고, 다시 발급하면 409다") - void 업로드_토큰_발급은_상태를_PROCESSING으로_바꾸고_재발급은_409() throws Exception { + @DisplayName("AC-9.15 PENDING 빌드에 업로드 토큰을 발급하면 status가 PROCESSING이 되고, PROCESSING에도 재발급할 수 있지만 ACTIVE에는 409다") + void 업로드_토큰_발급은_상태를_PROCESSING으로_바꾸고_ACTIVE_재발급은_409() throws Exception { long buildId = createBuild("1.0.0"); mockMvc.perform(post("/v1/admin/games/" + game.getId() + "/builds/" + buildId + "/upload-token") @@ -159,6 +159,13 @@ void setUp() throws Exception { .header("Authorization", "Bearer " + adminToken)) .andExpect(jsonPath("$[0].status").value("PROCESSING")); + // PROCESSING에서도 재발급 가능 — 홈페이지 서버가 죽거나 웹훅 호출이 실패해도 재시도 경로가 막히지 않는다. + mockMvc.perform(post("/v1/admin/games/" + game.getId() + "/builds/" + buildId + "/upload-token") + .header("Authorization", "Bearer " + adminToken)) + .andExpect(status().isOk()); + + activateBuild(buildId, "https://bcsdlab.com/games/neon-drift/index.html"); + mockMvc.perform(post("/v1/admin/games/" + game.getId() + "/builds/" + buildId + "/upload-token") .header("Authorization", "Bearer " + adminToken)) .andExpect(status().isConflict());