From 296d29f7fd91b8ac6ca152c77cefe05b425c750b Mon Sep 17 00:00:00 2001 From: coli Date: Sun, 14 Sep 2025 17:45:51 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20403=EC=97=90=EB=9F=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facade/RepositoryFacadeService.java | 3 ++- .../facade/RepositoryFacadeServiceTest.java | 20 +++++++++++++++---- .../client/GithubExchangeFilterFunction.java | 4 ++++ .../exception/GithubForbiddenException.java | 8 ++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java 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 98ae987..8a8e78c 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 @@ -10,6 +10,7 @@ import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.event.AnalyzeMyPrEvent; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -42,7 +43,7 @@ public GithubRepository save(RepositorySaveRequest request, User user) { eventPublisher.publishEvent(new AnalyzeMyPrEvent(repoUrl, user, this)); return savedRepository; - } catch (GithubNotFoundException githubNotFoundException) { + } catch (GithubNotFoundException | GithubForbiddenException githubException) { throw new GssException(ErrorCode.REGISTRY_GITHUB_REPOSITORY_NOT_FOUND); } } 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 32ba568..1cf09b7 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 @@ -18,6 +18,7 @@ import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.dto.response.OwnerResponse; import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -59,10 +60,21 @@ class Save { } @Test - void 웹훅_등록_실패_시_애플리케이션_에러로_전환한다() { + void 웹훅_등록_시_404_에러가_발생하면_애플리케이션_에러로_전환한다() { User user = userGenerator.generate("김건우"); RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); - mockingErrorWhenCreateWebHook(); + mockingErrorWhenCreateWebHook(new GithubNotFoundException("mocking error")); + + assertThatThrownBy(() -> repositoryFacadeService.save(request, user)) + .isInstanceOf(GssException.class) + .hasMessage(ErrorCode.REGISTRY_GITHUB_REPOSITORY_NOT_FOUND.getMessage()); + } + + @Test + void 웹훅_등록_시_403_에러가_발생하면_애플리케이션_에러로_전환한다() { + User user = userGenerator.generate("김건우"); + RepositorySaveRequest request = new RepositorySaveRequest("https://github.com/octocat/Hello-World"); + mockingErrorWhenCreateWebHook(new GithubForbiddenException("mocking error")); assertThatThrownBy(() -> repositoryFacadeService.save(request, user)) .isInstanceOf(GssException.class) @@ -121,14 +133,14 @@ private void mockingGithubClient() { .thenReturn(mockWebHookCreateResponse); } - private void mockingErrorWhenCreateWebHook() { + private void mockingErrorWhenCreateWebHook(Exception exception) { GithubRepoInfoResponse mockResponse = new GithubRepoInfoResponse(123, "testName", "testUrl", new OwnerResponse("김건우")); WebHookCreateResponse mockWebHookCreateResponse = new WebHookCreateResponse(123); Mockito.when(gitHubClient.getRepositoryInfo(anyString(), anyString(), anyString())) .thenReturn(mockResponse); Mockito.when(gitHubClient.createWebhook(any(), any(), any(), any())) - .thenThrow(new GithubNotFoundException("mocking error")); + .thenThrow(exception); } } diff --git a/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java b/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java index ab85609..bcbb387 100644 --- a/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java +++ b/gss-client/gss-github-client/src/main/java/com/devoops/client/GithubExchangeFilterFunction.java @@ -1,5 +1,6 @@ package com.devoops.client; +import com.devoops.exception.GithubForbiddenException; import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; @@ -30,6 +31,9 @@ public ExchangeFilterFunction githubErrorLogger() { if (response.statusCode().isSameCodeAs(HttpStatusCode.valueOf(404))) { return Mono.error(new GithubNotFoundException("깃허브에서 자원을 찾을 수 없습니다.")); } + if(response.statusCode().isSameCodeAs(HttpStatusCode.valueOf(403))) { + return Mono.error(new GithubForbiddenException("깃허브 자원의 접근 권한이 없습니다")); + } return Mono.error(new GssException(ErrorCode.GITHUB_CLIENT_ERROR)); }); } diff --git a/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java new file mode 100644 index 0000000..387b6f8 --- /dev/null +++ b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubForbiddenException.java @@ -0,0 +1,8 @@ +package com.devoops.exception; + +public class GithubForbiddenException extends RuntimeException { + + public GithubForbiddenException(String message) { + super(message); + } +}