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() { 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);