From a6bd0b3902db0236dcaab3d0331fc29ec1d3273b Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 28 Aug 2025 02:05:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20=EC=9E=AC=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facade/RepositoryFacadeService.java | 26 +++++++++---------- .../facade/RepositoryFacadeServiceTest.java | 24 ++++++++++++----- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java b/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java index 85d4608..7dca584 100644 --- a/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java +++ b/gss-api-app/src/main/java/com/devoops/service/facade/RepositoryFacadeService.java @@ -17,7 +17,6 @@ import com.devoops.service.github.WebHookService; import com.devoops.service.repository.RepositoryService; import java.util.List; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -36,8 +35,11 @@ public class RepositoryFacadeService { public GithubRepository save(RepositorySaveRequest request, User user) { try { GithubRepoUrl repoUrl = new GithubRepoUrl(request.url()); - GithubRepository savedRepository = saveRepository(repoUrl, user); - webHookService.registerWebhook(user, savedRepository.getId()); + GithubRepoInfoResponse repositoryInfo = gitHubService.getRepositoryInfo(repoUrl, user.getGithubToken()); + GithubRepository savedRepository = repositoryService.findByUserAndExternalId(user, repositoryInfo.id()) + .map(alreadyRegisteredRepo -> reTrackingOrThrowException(user, alreadyRegisteredRepo)) + .orElseGet(() -> registerNewRepo(repositoryInfo, repoUrl, user)); + eventPublisher.publishEvent(new AnalyzeMyPrEvent(repoUrl, user, this)); return savedRepository; } catch (GithubNotFoundException githubNotFoundException) { @@ -45,15 +47,11 @@ public GithubRepository save(RepositorySaveRequest request, User user) { } } - private GithubRepository saveRepository(GithubRepoUrl url, User user) { - GithubRepoInfoResponse repositoryInfo = gitHubService.getRepositoryInfo(url, user.getGithubToken()); - long externalId = repositoryInfo.id(); - Optional alreadyRegisteredRepo = repositoryService.findByUserAndExternalId(user, externalId); - - if(alreadyRegisteredRepo.isPresent()) { - return reTrackingOrThrowException(user, alreadyRegisteredRepo.get()); - } - + private GithubRepository registerNewRepo( + GithubRepoInfoResponse repositoryInfo, + GithubRepoUrl url, + User user + ) { RepositoryCreateCommand createCommand = new RepositoryCreateCommand( user.getId(), repositoryInfo.name(), @@ -62,7 +60,9 @@ private GithubRepository saveRepository(GithubRepoUrl url, User user) { INITIAL_PULL_REQUEST_COUNT, repositoryInfo.id() ); - return repositoryService.save(createCommand); + GithubRepository savedRepository = repositoryService.save(createCommand); + webHookService.registerWebhook(user, savedRepository.getId()); + return savedRepository; } private GithubRepository reTrackingOrThrowException(User user, GithubRepository registeredRepo) { diff --git a/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java index c99d69d..32ba568 100644 --- a/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/facade/RepositoryFacadeServiceTest.java @@ -1,6 +1,7 @@ package com.devoops.service.facade; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; @@ -69,7 +70,7 @@ class Save { } @Test - void 레포지토리를_중복_저장할_수_없다() { + void 동일_유저가_레포지토리를_중복_저장할_수_없다() { User user = userGenerator.generate("김건우"); RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); mockingGithubClient(); @@ -81,6 +82,19 @@ class Save { .hasMessage(ErrorCode.ALREADY_SAVED_REPOSITORY.getMessage()); } + @Test + void 다른_유저가_레포지토리를_중복_저장할_수_있다() { + User user1 = userGenerator.generate("김건우1"); + User user2 = userGenerator.generate("김건우2"); + RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); + mockingGithubClient(); + + assertThatCode(() -> { + repositoryFacadeService.save(request, user1); + repositoryFacadeService.save(request, user2); + }).doesNotThrowAnyException(); + } + @Test void 레포지토리를_재연결_할_수_있다() { User user = userGenerator.generate("김건우"); @@ -88,17 +102,13 @@ class Save { RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); mockingGithubClient(); - GithubRepository reTrackingRepository = repositoryFacadeService.save(request, user); + repositoryFacadeService.save(request, user); GithubRepository actual = githubRepoDomainRepository.findByIdAndUserId( unTrackingRepo.getId(), user.getId() ); - - assertAll( - () -> Mockito.verify(gitHubClient, times(1)).createWebhook(any(), any(), any(), any()), - () -> assertThat(actual.isTracking()).isTrue() - ); + assertThat(actual.isTracking()).isTrue(); } private void mockingGithubClient() { From 84745bdd7993858b9bec1c8d9972a2bc41a0cecc Mon Sep 17 00:00:00 2001 From: coli Date: Thu, 28 Aug 2025 02:07:12 +0900 Subject: [PATCH 2/2] =?UTF-8?q?style:=20=EC=98=A4=EB=B2=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=20=EC=95=A0=EB=84=88=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/devoops/domain/entity/analysis/ClaudeAiModel.java | 1 + .../java/com/devoops/domain/entity/analysis/OpenAiModel.java | 1 + 2 files changed, 2 insertions(+) diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/analysis/ClaudeAiModel.java b/gss-domain/src/main/java/com/devoops/domain/entity/analysis/ClaudeAiModel.java index d203ee2..977ed94 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/analysis/ClaudeAiModel.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/analysis/ClaudeAiModel.java @@ -15,6 +15,7 @@ public enum ClaudeAiModel implements AiModel { private final double inputTokenCharge; //달러 private final double outputTokenCharge; //달러 + @Override public double getCharge(int promptToken, int completionTokens) { double inputCharge = CurrencyUtil.usdToKrw(inputTokenCharge * promptToken); double outputCharge = CurrencyUtil.usdToKrw(outputTokenCharge * completionTokens); diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/analysis/OpenAiModel.java b/gss-domain/src/main/java/com/devoops/domain/entity/analysis/OpenAiModel.java index 12b4cf4..de57964 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/analysis/OpenAiModel.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/analysis/OpenAiModel.java @@ -36,6 +36,7 @@ private boolean isBetween(double currentUsage, double min, double max) { return currentUsage >= min && currentUsage <= max; } + @Override public double getCharge(int promptToken, int completionTokens) { double inputCharge = CurrencyUtil.usdToKrw(inputTokenCharge * promptToken); double outputCharge = CurrencyUtil.usdToKrw(outputTokenCharge * completionTokens);