diff --git a/gss-api-app/src/main/java/com/devoops/service/GitHubService.java b/gss-api-app/src/main/java/com/devoops/service/GitHubService.java index cf611d7e..d7ec08f7 100644 --- a/gss-api-app/src/main/java/com/devoops/service/GitHubService.java +++ b/gss-api-app/src/main/java/com/devoops/service/GitHubService.java @@ -13,15 +13,17 @@ import com.devoops.dto.response.GithubPrResponse; import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.repository.github.GithubWebHookDomainRepositoryImpl; import java.util.List; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +@Slf4j @Service @RequiredArgsConstructor public class GitHubService { @@ -91,12 +93,20 @@ public void deleteWebhook(User user, long repositoryId) { GithubToken githubToken = githubTokenDomainRepository.findByUserId(user) .orElseThrow(() -> new GssException(ErrorCode.NO_RESOURCE_FOUND)); GithubWebhook webhook = githubWebhookDomainRepository.findByRepositoryId(repo.getId()); - gitHubClient.deleteWebhook( - BEARER_PREFIX + githubToken.getToken(), - repo.getOwner(), - repo.getName(), - webhook.getExternalId() - ); + tryDeleteWebhook(githubToken, webhook, repo); githubWebhookDomainRepository.deleteById(webhook.getId()); } + + private void tryDeleteWebhook(GithubToken githubToken, GithubWebhook webhook, GithubRepository repo) { + try { + gitHubClient.deleteWebhook( + BEARER_PREFIX + githubToken.getToken(), + repo.getOwner(), + repo.getName(), + webhook.getExternalId() + ); + } catch (GithubNotFoundException githubNotFoundException) { + log.error("깃허브 레포에서 웹훅을 찾을 수 없습니다 : {}, repo : {} ", githubNotFoundException, repo.getName()); + } + } } 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 0802bd2f..3599bbd1 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 @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.times; @@ -16,6 +17,7 @@ import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.dto.response.OwnerResponse; import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; import org.junit.jupiter.api.Nested; @@ -78,4 +80,23 @@ private void mockingGithubClient() { .thenReturn(mockWebHookCreateResponse); } } + + @Nested + class Delete { + + @Test + void 웹훅을_찾지_못해도_레포지토리_트래킹을_끊을_수_있다() { + User user = userGenerator.generate("김건우"); + GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); + webhookGenerator.generate(user, repo); + Mockito.doThrow(new GithubNotFoundException("mocking error")) + .when(gitHubClient) + .deleteWebhook(anyString(), anyString(), anyString(), anyLong()); + + repositoryFacadeService.deleteRepository(user, repo.getId()); + + GithubRepository foundRepo = githubRepoDomainRepository.findByIdAndUserId(repo.getId(), user.getId()); + assertThat(foundRepo.isTracking()).isFalse(); + } + } } 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 5293c56e..ab856094 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.GithubNotFoundException; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; import java.util.Map; @@ -27,7 +28,7 @@ public ExchangeFilterFunction githubErrorLogger() { "response", body )); if (response.statusCode().isSameCodeAs(HttpStatusCode.valueOf(404))) { - return Mono.error(new GssException(ErrorCode.MALFORMED_GITHUB_REPOSITORY_URL)); + return Mono.error(new GithubNotFoundException("깃허브에서 자원을 찾을 수 없습니다.")); } return Mono.error(new GssException(ErrorCode.GITHUB_CLIENT_ERROR)); }); diff --git a/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubNotFoundException.java b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubNotFoundException.java new file mode 100644 index 00000000..0f25124a --- /dev/null +++ b/gss-client/gss-github-client/src/main/java/com/devoops/exception/GithubNotFoundException.java @@ -0,0 +1,7 @@ +package com.devoops.exception; + +public class GithubNotFoundException extends RuntimeException { + public GithubNotFoundException(String message) { + super(message); + } +}