diff --git a/gss-api-app/src/main/java/com/devoops/controller/GithubController.java b/gss-api-app/src/main/java/com/devoops/controller/GithubController.java deleted file mode 100644 index 5f33ed6f..00000000 --- a/gss-api-app/src/main/java/com/devoops/controller/GithubController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.devoops.controller; - -import com.devoops.controller.auth.AuthUser; -import com.devoops.domain.entity.user.User; -import com.devoops.service.GitHubService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/github") -public class GithubController { - - private final GitHubService gitHubService; - - @PostMapping("/repositories/{repositoryId}/webhooks") - public void registerWebhook( - @AuthUser User user, - @PathVariable long repositoryId - ) { - gitHubService.registerWebhook(user, repositoryId); - } -} diff --git a/gss-api-app/src/main/java/com/devoops/controller/docs/RepositoryControllerSwagger.java b/gss-api-app/src/main/java/com/devoops/controller/docs/RepositoryControllerSwagger.java index ec64081e..71303c13 100644 --- a/gss-api-app/src/main/java/com/devoops/controller/docs/RepositoryControllerSwagger.java +++ b/gss-api-app/src/main/java/com/devoops/controller/docs/RepositoryControllerSwagger.java @@ -1,11 +1,7 @@ package com.devoops.controller.docs; -import com.devoops.controller.auth.AuthUser; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequests; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.RepositorySaveRequest; -import com.devoops.dto.response.AnswerUpdateResponse; import com.devoops.dto.response.MyRepositoriesResponse; import com.devoops.dto.response.RepositoryPullRequestResponses; import com.devoops.dto.response.RepositorySaveResponse; @@ -17,10 +13,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; -import java.util.List; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "Repository API") @SecurityRequirement(name = "Authorization") diff --git a/gss-api-app/src/main/java/com/devoops/controller/pullrequests/PullRequestController.java b/gss-api-app/src/main/java/com/devoops/controller/pullrequests/PullRequestController.java index 957db701..4776519a 100644 --- a/gss-api-app/src/main/java/com/devoops/controller/pullrequests/PullRequestController.java +++ b/gss-api-app/src/main/java/com/devoops/controller/pullrequests/PullRequestController.java @@ -2,7 +2,7 @@ import com.devoops.controller.auth.AuthUser; import com.devoops.controller.docs.PullRequestControllerSwagger; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.dto.response.PullRequestDetailReadResponse; import com.devoops.dto.response.PullRequestRankingResponses; diff --git a/gss-api-app/src/main/java/com/devoops/controller/question/QuestionController.java b/gss-api-app/src/main/java/com/devoops/controller/question/QuestionController.java index d076e6de..1fb9bb0f 100644 --- a/gss-api-app/src/main/java/com/devoops/controller/question/QuestionController.java +++ b/gss-api-app/src/main/java/com/devoops/controller/question/QuestionController.java @@ -2,8 +2,8 @@ import com.devoops.controller.auth.AuthUser; import com.devoops.controller.docs.QuestionControllerSwagger; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Answers; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.Answers; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.AnswerPutRequests; import com.devoops.dto.request.AnswerUpdateRequest; diff --git a/gss-api-app/src/main/java/com/devoops/controller/repository/RepositoryController.java b/gss-api-app/src/main/java/com/devoops/controller/repository/RepositoryController.java index 818e0ea7..64265cad 100644 --- a/gss-api-app/src/main/java/com/devoops/controller/repository/RepositoryController.java +++ b/gss-api-app/src/main/java/com/devoops/controller/repository/RepositoryController.java @@ -2,8 +2,8 @@ import com.devoops.controller.auth.AuthUser; import com.devoops.controller.docs.RepositoryControllerSwagger; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequests; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequests; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.dto.response.MyRepositoriesResponse; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponse.java index a5eee1d6..85a608c8 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.Answer; +import com.devoops.domain.entity.github.answer.Answer; public record AnswerPutResponse( long answerId, diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponses.java b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponses.java index 83abbabb..27498f84 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponses.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerPutResponses.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.Answers; +import com.devoops.domain.entity.github.answer.Answers; import java.util.List; import java.util.stream.Collectors; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerSaveResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerSaveResponse.java index a35e333a..05ebe70e 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerSaveResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerSaveResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.Answer; +import com.devoops.domain.entity.github.answer.Answer; import io.swagger.v3.oas.annotations.media.Schema; public record AnswerSaveResponse( diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerUpdateResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerUpdateResponse.java index 15dede90..7fe05110 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/AnswerUpdateResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/AnswerUpdateResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.Answer; +import com.devoops.domain.entity.github.answer.Answer; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/MyRepositoriesResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/MyRepositoriesResponse.java index 080fb66c..5a315eba 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/MyRepositoriesResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/MyRepositoriesResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestDetailReadResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestDetailReadResponse.java index 83a63b43..fb360325 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestDetailReadResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestDetailReadResponse.java @@ -1,8 +1,8 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequest; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.RecordStatus; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponse.java index 276e99da..27c56cd5 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRanking; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponses.java b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponses.java index 2fc20a9f..279f58f8 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponses.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestRankingResponses.java @@ -1,7 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.dto.request.AnswerPutRequest; +import com.devoops.domain.entity.github.answer.AnswerRankings; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestReadResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestReadResponse.java index f837057a..df3ce658 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestReadResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/PullRequestReadResponse.java @@ -1,8 +1,8 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequest; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.RecordStatus; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponse.java index 07128723..590e9b2f 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponse.java @@ -1,7 +1,7 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponses.java b/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponses.java index 316fea3f..ea7c94a9 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponses.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/RepositoryPullRequestResponses.java @@ -1,7 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.dto.request.AnswerPutRequest; +import com.devoops.domain.entity.github.pr.PullRequests; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; diff --git a/gss-api-app/src/main/java/com/devoops/dto/response/RepositorySaveResponse.java b/gss-api-app/src/main/java/com/devoops/dto/response/RepositorySaveResponse.java index 0569d172..13db244e 100644 --- a/gss-api-app/src/main/java/com/devoops/dto/response/RepositorySaveResponse.java +++ b/gss-api-app/src/main/java/com/devoops/dto/response/RepositorySaveResponse.java @@ -1,6 +1,6 @@ package com.devoops.dto.response; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import io.swagger.v3.oas.annotations.media.Schema; public record RepositorySaveResponse( 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 d7ec08f7..a792ce15 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 @@ -1,27 +1,15 @@ package com.devoops.service; import com.devoops.client.GitHubClient; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.domain.entity.github.GithubWebhook; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; -import com.devoops.domain.repository.github.GithubTokenDomainRepository; -import com.devoops.domain.repository.github.GithubWebhookDomainRepository; -import com.devoops.dto.request.GitHubWebhookRequest; import com.devoops.dto.request.GithubRepoUrl; 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 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 @@ -33,32 +21,7 @@ public class GitHubService { private static final int MAX_PER_PAGE_PULL_REQUEST = 10; private static final String REQUEST_PULL_REQUEST_STATUS = "closed"; - @Value("${dev-oops.mcp.webhook-url}") - private String mcpWebhookUrl; - private final GitHubClient gitHubClient; - private final GithubRepoDomainRepository githubRepoDomainRepository; - private final GithubTokenDomainRepository githubTokenDomainRepository; - private final GithubWebhookDomainRepository githubWebhookDomainRepository; - - public void registerWebhook(User user, long repositoryId) { - - GithubRepository githubRepository = githubRepoDomainRepository.findByIdAndUserId(repositoryId, user.getId()); - GithubToken githubToken = githubTokenDomainRepository.findByUserId(user) - .orElseThrow(() -> new GssException(ErrorCode.NO_RESOURCE_FOUND)); - createWebHook(githubToken, githubRepository); - } - - private GithubWebhook createWebHook(GithubToken token, GithubRepository repo) { - WebHookCreateResponse webHookCreateResponse = gitHubClient.createWebhook( - BEARER_PREFIX + token.getToken(), - repo.getOwner(), - repo.getName(), - GitHubWebhookRequest.ofPullRequestEvent(mcpWebhookUrl) - ); - GithubWebhook webhook = new GithubWebhook(webHookCreateResponse.id(), repo.getId()); - return githubWebhookDomainRepository.save(webhook); - } public List getUserPullRequests( GithubRepoUrl repoUrl, @@ -86,27 +49,4 @@ public GithubRepoInfoResponse getRepositoryInfo(GithubRepoUrl repoUrl, GithubTok repoUrl.getRepoName() ); } - - @Transactional - public void deleteWebhook(User user, long repositoryId) { - GithubRepository repo = githubRepoDomainRepository.findByIdAndUserId(repositoryId, user.getId()); - GithubToken githubToken = githubTokenDomainRepository.findByUserId(user) - .orElseThrow(() -> new GssException(ErrorCode.NO_RESOURCE_FOUND)); - GithubWebhook webhook = githubWebhookDomainRepository.findByRepositoryId(repo.getId()); - 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/main/java/com/devoops/service/facade/AuthFacadeService.java b/gss-api-app/src/main/java/com/devoops/service/facade/AuthFacadeService.java index 4dc25689..41dead1e 100644 --- a/gss-api-app/src/main/java/com/devoops/service/facade/AuthFacadeService.java +++ b/gss-api-app/src/main/java/com/devoops/service/facade/AuthFacadeService.java @@ -1,6 +1,6 @@ package com.devoops.service.facade; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.UserSaveRequest; import com.devoops.dto.response.AuthResponse; diff --git a/gss-api-app/src/main/java/com/devoops/service/facade/PullRequestFacadeService.java b/gss-api-app/src/main/java/com/devoops/service/facade/PullRequestFacadeService.java index 3757c54e..a8ea780d 100644 --- a/gss-api-app/src/main/java/com/devoops/service/facade/PullRequestFacadeService.java +++ b/gss-api-app/src/main/java/com/devoops/service/facade/PullRequestFacadeService.java @@ -1,9 +1,9 @@ package com.devoops.service.facade; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.PullRequest; +import com.devoops.domain.entity.github.answer.AnswerRankings; +import com.devoops.domain.entity.github.pr.PullRequest; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.dto.response.PullRequestDetailReadResponse; import com.devoops.dto.response.PullRequestRankingResponses; import com.devoops.dto.response.PullRequestReadResponse; diff --git a/gss-api-app/src/main/java/com/devoops/service/facade/QuestionFacadeService.java b/gss-api-app/src/main/java/com/devoops/service/facade/QuestionFacadeService.java index 388fc01c..74473e83 100644 --- a/gss-api-app/src/main/java/com/devoops/service/facade/QuestionFacadeService.java +++ b/gss-api-app/src/main/java/com/devoops/service/facade/QuestionFacadeService.java @@ -1,10 +1,10 @@ package com.devoops.service.facade; import com.devoops.command.request.AnswerUpdateCommand; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Answers; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.Answers; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.AnswerPutRequests; import com.devoops.service.answer.AnswerService; 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 15fc84be..5df57cf8 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 @@ -3,14 +3,15 @@ import static com.devoops.Constants.INITIAL_PULL_REQUEST_COUNT; import com.devoops.command.request.RepositoryCreateCommand; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequests; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequests; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.GithubRepoUrl; import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.event.AnalyzeMyPrEvent; import com.devoops.service.GitHubService; +import com.devoops.service.github.WebHookService; import com.devoops.service.repository.RepositoryService; import java.util.List; import lombok.RequiredArgsConstructor; @@ -24,13 +25,14 @@ public class RepositoryFacadeService { private final RepositoryService repositoryService; private final GitHubService gitHubService; + private final WebHookService webHookService; private final ApplicationEventPublisher eventPublisher; @Transactional public GithubRepository save(RepositorySaveRequest request, User user) { GithubRepoUrl repoUrl = new GithubRepoUrl(request.url()); GithubRepository savedRepository = saveRepository(repoUrl, user); - gitHubService.registerWebhook(user, savedRepository.getId()); + webHookService.registerWebhook(user, savedRepository.getId()); eventPublisher.publishEvent(new AnalyzeMyPrEvent(repoUrl, user, this)); return savedRepository; } @@ -62,7 +64,8 @@ public List findMyRepositories(User user) { @Transactional public void deleteRepository(User user, long repositoryId) { - gitHubService.deleteWebhook(user, repositoryId); + //TODO 다른 유저로부터 등록된 상황 고려 repositoryService.stopTrackingRepository(user, repositoryId); + webHookService.deleteWebhook(user, repositoryId); } } diff --git a/gss-api-app/src/main/java/com/devoops/service/github/WebHookService.java b/gss-api-app/src/main/java/com/devoops/service/github/WebHookService.java new file mode 100644 index 00000000..232586ef --- /dev/null +++ b/gss-api-app/src/main/java/com/devoops/service/github/WebHookService.java @@ -0,0 +1,91 @@ +package com.devoops.service.github; + +import com.devoops.client.GitHubClient; +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.token.GithubToken; +import com.devoops.domain.entity.github.webhook.GithubWebhook; +import com.devoops.domain.entity.user.User; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.webhook.GithubRepoRegistryCountRepository; +import com.devoops.domain.repository.github.token.GithubTokenDomainRepository; +import com.devoops.domain.repository.github.webhook.GithubWebhookDomainRepository; +import com.devoops.dto.request.GitHubWebhookRequest; +import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.GithubNotFoundException; +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 WebHookService { + + private static final String BEARER_PREFIX = "Bearer "; + + @Value("${dev-oops.mcp.webhook-url}") + private String mcpWebhookUrl; + + private final GitHubClient gitHubClient; + private final GithubRepoDomainRepository githubRepoDomainRepository; + private final GithubTokenDomainRepository githubTokenDomainRepository; + private final GithubWebhookDomainRepository githubWebhookDomainRepository; + private final GithubRepoRegistryCountRepository registryCountRepository; + + @Transactional + public void registerWebhook(User user, long repositoryId) { + GithubRepository githubRepository = githubRepoDomainRepository.findByIdAndUserId(repositoryId, user.getId()); + long repoExternalId = githubRepository.getExternalId(); + if(registryCountRepository.existsByExternalId(repoExternalId)) { + registryCountRepository.plusCount(repoExternalId); + return; + } + registryCountRepository.save(new GithubRepoRegistryCount(repoExternalId, 1L)); + GithubToken githubToken = githubTokenDomainRepository.getByUserId(user.getId()); + createWebhook(githubToken, githubRepository); + } + + private void createWebhook(GithubToken token, GithubRepository repo) { + WebHookCreateResponse webHookCreateResponse = gitHubClient.createWebhook( + BEARER_PREFIX + token.getToken(), + repo.getOwner(), + repo.getName(), + GitHubWebhookRequest.ofPullRequestEvent(mcpWebhookUrl) + ); + GithubWebhook webhook = new GithubWebhook(webHookCreateResponse.id(), repo.getId()); + githubWebhookDomainRepository.save(webhook); + } + + @Transactional + public void deleteWebhook(User user, long repositoryId) { + GithubRepository repo = githubRepoDomainRepository.findByIdAndUserId(repositoryId, user.getId()); + long repoExternalId = repo.getExternalId(); + GithubRepoRegistryCount registryCount = registryCountRepository.getByExternalId(repoExternalId); + + if(registryCount.greaterThan(1L)) { + registryCountRepository.minusCount(repoExternalId); + return; + } + GithubToken githubToken = githubTokenDomainRepository.getByUserId(user.getId()); + GithubWebhook webhook = githubWebhookDomainRepository.findByRepositoryId(repo.getId()); + tryDeleteWebhook(githubToken, webhook, repo); + githubWebhookDomainRepository.deleteById(webhook.getId()); + registryCountRepository.deleteByExternalId(repoExternalId); + } + + 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/controller/question/QuestionControllerTest.java b/gss-api-app/src/test/java/com/devoops/controller/question/QuestionControllerTest.java index 6bb89425..901bcd7c 100644 --- a/gss-api-app/src/test/java/com/devoops/controller/question/QuestionControllerTest.java +++ b/gss-api-app/src/test/java/com/devoops/controller/question/QuestionControllerTest.java @@ -4,11 +4,11 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.devoops.BaseControllerTest; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.AnswerPutRequest; import com.devoops.dto.request.AnswerPutRequests; diff --git a/gss-api-app/src/test/java/com/devoops/controller/repository/RepositoryControllerTest.java b/gss-api-app/src/test/java/com/devoops/controller/repository/RepositoryControllerTest.java index 43b19d2e..768be5f3 100644 --- a/gss-api-app/src/test/java/com/devoops/controller/repository/RepositoryControllerTest.java +++ b/gss-api-app/src/test/java/com/devoops/controller/repository/RepositoryControllerTest.java @@ -1,9 +1,9 @@ package com.devoops.controller.repository; import com.devoops.BaseControllerTest; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.service.auth.jwt.AccessToken; diff --git a/gss-api-app/src/test/java/com/devoops/service/GitHubServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/GitHubServiceTest.java deleted file mode 100644 index df76cae2..00000000 --- a/gss-api-app/src/test/java/com/devoops/service/GitHubServiceTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.devoops.service; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; - -import com.devoops.BaseServiceTest; -import com.devoops.client.GitHubClient; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.GithubWebhook; -import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubWebhookDomainRepository; -import com.devoops.exception.custom.GssException; -import com.devoops.exception.errorcode.ErrorCode; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; - -class GitHubServiceTest extends BaseServiceTest { - - @MockitoBean - private GitHubClient gitHubClient; - - @Autowired - private GitHubService gitHubService; - - @Autowired - private GithubWebhookDomainRepository webhookDomainRepository; - - - @Nested - class DeleteWebHook { - - @Test - void 웹_훅을_삭제_할_수_있다() { - User user = userGenerator.generate("김건우"); - GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); - GithubWebhook webhook = webhookGenerator.generate(user, repo); - - gitHubService.deleteWebhook(user, repo.getId()); - - assertThatThrownBy(() -> webhookDomainRepository.findByRepositoryId(repo.getId())) - .isInstanceOf(GssException.class) - .hasMessage(ErrorCode.WEBHOOK_NOT_FOUND.getMessage()); - } - } -} diff --git a/gss-api-app/src/test/java/com/devoops/service/answerranking/AnswerRankingServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/answerranking/AnswerRankingServiceTest.java index 83cb3f26..77546953 100644 --- a/gss-api-app/src/test/java/com/devoops/service/answerranking/AnswerRankingServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/answerranking/AnswerRankingServiceTest.java @@ -4,15 +4,15 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRankings; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.AnswerRankingDomainRepository; +import com.devoops.domain.repository.github.answer.AnswerRankingDomainRepository; import java.time.LocalDateTime; import java.util.List; import org.junit.jupiter.api.Nested; diff --git a/gss-api-app/src/test/java/com/devoops/service/facade/PullRequestFacadeServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/facade/PullRequestFacadeServiceTest.java index 7540ecd6..376bcff3 100644 --- a/gss-api-app/src/test/java/com/devoops/service/facade/PullRequestFacadeServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/facade/PullRequestFacadeServiceTest.java @@ -4,16 +4,14 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.dto.response.PullRequestReadResponse; import java.time.LocalDateTime; -import java.util.List; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/gss-api-app/src/test/java/com/devoops/service/facade/QuestionFacadeServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/facade/QuestionFacadeServiceTest.java index fb2ce78a..de0b5e77 100644 --- a/gss-api-app/src/test/java/com/devoops/service/facade/QuestionFacadeServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/facade/QuestionFacadeServiceTest.java @@ -4,13 +4,13 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.PullRequestDomainRepository; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; import com.devoops.dto.request.AnswerPutRequest; import com.devoops.dto.request.AnswerPutRequests; import java.time.LocalDateTime; 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 3599bbd1..347e5372 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 @@ -10,9 +10,9 @@ import com.devoops.BaseServiceTest; import com.devoops.client.GitHubClient; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; import com.devoops.dto.request.RepositorySaveRequest; import com.devoops.dto.response.GithubRepoInfoResponse; import com.devoops.dto.response.OwnerResponse; @@ -88,7 +88,7 @@ class Delete { void 웹훅을_찾지_못해도_레포지토리_트래킹을_끊을_수_있다() { User user = userGenerator.generate("김건우"); GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); - webhookGenerator.generate(user, repo); + webhookGenerator.generate(user, repo, 1L); Mockito.doThrow(new GithubNotFoundException("mocking error")) .when(gitHubClient) .deleteWebhook(anyString(), anyString(), anyString(), anyLong()); diff --git a/gss-api-app/src/test/java/com/devoops/service/github/WebHookServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/github/WebHookServiceTest.java new file mode 100644 index 00000000..ab16d368 --- /dev/null +++ b/gss-api-app/src/test/java/com/devoops/service/github/WebHookServiceTest.java @@ -0,0 +1,115 @@ +package com.devoops.service.github; + +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; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; + +import com.devoops.BaseServiceTest; +import com.devoops.client.GitHubClient; +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.user.User; +import com.devoops.domain.repository.github.webhook.GithubRepoRegistryCountRepository; +import com.devoops.domain.repository.github.webhook.GithubWebhookDomainRepository; +import com.devoops.dto.response.WebHookCreateResponse; +import com.devoops.exception.custom.GssException; +import com.devoops.exception.errorcode.ErrorCode; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.bean.override.mockito.MockitoBean; + +class WebHookServiceTest extends BaseServiceTest { + + @MockitoBean + private GitHubClient gitHubClient; + + @Autowired + private WebHookService webHookService; + + @Autowired + private GithubWebhookDomainRepository webhookDomainRepository; + + @Autowired + private GithubRepoRegistryCountRepository registryCountRepository; + + @Nested + class RegisterWebHook { + + @Test + void 웹훅을_최초_등록할_수_있다() { + User user = userGenerator.generate("김건우"); + GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); + Mockito.when(gitHubClient.createWebhook(anyString(), anyString(), anyString(), any())) + .thenReturn(new WebHookCreateResponse(1234L)); + + webHookService.registerWebhook(user, repo.getId()); + + Mockito.verify(gitHubClient, Mockito.times(1)) + .createWebhook(anyString(), anyString(), anyString(), any()); + } + + @Test + void 이미_웹훅이_등록된_레포지토리는_등록_카운트를_증가시킨다() { + User user = userGenerator.generate("김건우"); + User user2 = userGenerator.generate("콜리"); + GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); + Mockito.when(gitHubClient.createWebhook(anyString(), anyString(), anyString(), any())) + .thenReturn(new WebHookCreateResponse(1234L)); + webhookGenerator.generate(user2, repo, 1L); + + webHookService.registerWebhook(user, repo.getId()); + + GithubRepoRegistryCount registryCount = registryCountRepository.getByExternalId(repo.getExternalId()); + assertAll( + () -> Mockito.verify(gitHubClient, never()) + .createWebhook(anyString(), anyString(), anyString(), any()), + () -> assertThat(registryCount.getReposCount()).isEqualTo(2L) + ); + } + } + + + @Nested + class DeleteWebHook { + + @Test + void 웹_훅을_삭제_할_수_있다() { + User user = userGenerator.generate("김건우"); + GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); + webhookGenerator.generate(user, repo, 1L); + + webHookService.deleteWebhook(user, repo.getId()); + + boolean isExists = registryCountRepository.existsByExternalId(repo.getExternalId()); + assertAll( + () -> assertThatThrownBy(() -> webhookDomainRepository.findByRepositoryId(repo.getId())) + .isInstanceOf(GssException.class) + .hasMessage(ErrorCode.WEBHOOK_NOT_FOUND.getMessage()), + () -> assertThat(isExists).isFalse() + ); + } + + @Test + void 여러_유저가_트래킹하는_경우_웹훅_등록_카운트를_감소시킨다() { + User user = userGenerator.generate("김건우"); + GithubRepository repo = repoGenerator.generate(user, "건우의 레포"); + webhookGenerator.generate(user, repo, 2L); + + webHookService.deleteWebhook(user, repo.getId()); + + GithubRepoRegistryCount registryCount = registryCountRepository.getByExternalId(repo.getExternalId()); + assertAll( + () -> assertThatCode(() -> webhookDomainRepository.findByRepositoryId(repo.getId())) + .doesNotThrowAnyException(), + () -> assertThat(registryCount.getReposCount()).isEqualTo(1L) + ); + } + } +} + diff --git a/gss-api-app/src/test/java/com/devoops/service/pullrequests/PullRequestServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/pullrequests/PullRequestServiceTest.java index 2813d5b4..9222b31b 100644 --- a/gss-api-app/src/test/java/com/devoops/service/pullrequests/PullRequestServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/pullrequests/PullRequestServiceTest.java @@ -3,9 +3,9 @@ import static org.assertj.core.api.Assertions.assertThat; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; import com.devoops.service.pullrequest.PullRequestService; import java.time.LocalDateTime; diff --git a/gss-api-app/src/test/java/com/devoops/service/question/QuestionServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/question/QuestionServiceTest.java index a91c4659..411bf4ec 100644 --- a/gss-api-app/src/test/java/com/devoops/service/question/QuestionServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/question/QuestionServiceTest.java @@ -5,17 +5,14 @@ import com.devoops.BaseServiceTest; import com.devoops.command.request.AnswerUpdateCommand; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Answers; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; -import com.devoops.dto.request.AnswerPutRequest; -import com.devoops.dto.request.AnswerPutRequests; -import com.devoops.jpa.repository.github.AnswerJpaRepository; +import com.devoops.jpa.repository.github.answer.AnswerJpaRepository; import java.time.LocalDateTime; import java.util.List; import org.junit.jupiter.api.Nested; diff --git a/gss-api-app/src/test/java/com/devoops/service/repository/RepositoryServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/repository/RepositoryServiceTest.java index d037d4de..2d25b073 100644 --- a/gss-api-app/src/test/java/com/devoops/service/repository/RepositoryServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/repository/RepositoryServiceTest.java @@ -5,21 +5,15 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.AnswerDomainRepository; -import com.devoops.domain.repository.github.AnswerRankingDomainRepository; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; -import com.devoops.domain.repository.github.PullRequestDomainRepository; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.repository.github.answer.AnswerDomainRepository; +import com.devoops.domain.repository.github.answer.AnswerRankingDomainRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; import java.time.LocalDateTime; diff --git a/gss-api-app/src/test/java/com/devoops/service/user/UserServiceTest.java b/gss-api-app/src/test/java/com/devoops/service/user/UserServiceTest.java index 16a54bd5..9095ef9c 100644 --- a/gss-api-app/src/test/java/com/devoops/service/user/UserServiceTest.java +++ b/gss-api-app/src/test/java/com/devoops/service/user/UserServiceTest.java @@ -3,7 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import com.devoops.BaseServiceTest; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; import com.devoops.domain.repository.user.UserDomainRepository; import org.junit.jupiter.api.Nested; diff --git a/gss-common/src/main/java/com/devoops/exception/errorcode/ErrorCode.java b/gss-common/src/main/java/com/devoops/exception/errorcode/ErrorCode.java index 67a62c48..3f80dc0c 100644 --- a/gss-common/src/main/java/com/devoops/exception/errorcode/ErrorCode.java +++ b/gss-common/src/main/java/com/devoops/exception/errorcode/ErrorCode.java @@ -26,6 +26,8 @@ public enum ErrorCode { //5XX INTERNAL_SERVER_ERROR(500, "서버 오류가 발생했습니다. 관리자에게 문의하세요."), GITHUB_REPOSITORY_NOT_FOUND(500, "찾는 레포지토리가 존재하지 않습니다"), + GITHUB_REPOSITORY_REGISTRY_COUNT_NOT_FOUND(500, "찾는 레포지토리 등록 카운트가 존재하지 않습니다"), + INVALID_GITHUB_REPOSITORY_REGISTRY_COUNT(500, "레포지토리 등록 카운트가 0이하입니다"), GITHUB_TOKEN_NOT_FOUND(500, "찾는 깃허브 토큰이 존재하지 않습니다"), PULL_REQUEST_NOT_FOUND(500, "찾는 풀 리퀘스트가 존재하지 않습니다"), QUESTION_NOT_FOUND(500, "찾는 질문이 존재하지 않습니다"), diff --git a/gss-domain/src/main/java/com/devoops/command/request/PullRequestCreateCommand.java b/gss-domain/src/main/java/com/devoops/command/request/PullRequestCreateCommand.java index 8b02549f..50af3f4b 100644 --- a/gss-domain/src/main/java/com/devoops/command/request/PullRequestCreateCommand.java +++ b/gss-domain/src/main/java/com/devoops/command/request/PullRequestCreateCommand.java @@ -1,7 +1,7 @@ package com.devoops.command.request; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import java.time.LocalDateTime; diff --git a/gss-domain/src/main/java/com/devoops/command/request/QuestionCreateCommand.java b/gss-domain/src/main/java/com/devoops/command/request/QuestionCreateCommand.java index 24e25f4b..cbc38faa 100644 --- a/gss-domain/src/main/java/com/devoops/command/request/QuestionCreateCommand.java +++ b/gss-domain/src/main/java/com/devoops/command/request/QuestionCreateCommand.java @@ -1,6 +1,6 @@ package com.devoops.command.request; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.question.Question; public record QuestionCreateCommand( Long pullRequestId, diff --git a/gss-domain/src/main/java/com/devoops/command/request/RepositoryCreateCommand.java b/gss-domain/src/main/java/com/devoops/command/request/RepositoryCreateCommand.java index 636f7464..aa271691 100644 --- a/gss-domain/src/main/java/com/devoops/command/request/RepositoryCreateCommand.java +++ b/gss-domain/src/main/java/com/devoops/command/request/RepositoryCreateCommand.java @@ -1,6 +1,6 @@ package com.devoops.command.request; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; public record RepositoryCreateCommand( long userId, diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/Answer.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answer.java similarity index 89% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/Answer.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answer.java index b7c45b45..e4695cae 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/Answer.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answer.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.answer; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRanking.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRanking.java similarity index 89% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRanking.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRanking.java index 17a8d746..653b39db 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRanking.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRanking.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.answer; import java.time.LocalDateTime; import lombok.Getter; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRankings.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRankings.java similarity index 94% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRankings.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRankings.java index 1a762e77..8cc4bce7 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/AnswerRankings.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/AnswerRankings.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.answer; import java.util.Comparator; import java.util.List; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/Answers.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answers.java similarity index 78% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/Answers.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answers.java index bf6d6872..d163f061 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/Answers.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/answer/Answers.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.answer; import java.util.List; import lombok.Getter; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequest.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequest.java similarity index 93% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequest.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequest.java index 564b8f35..008eda0f 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequest.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequest.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.pr; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequests.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequests.java similarity index 81% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequests.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequests.java index 81d57471..ced28cb1 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/PullRequests.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/PullRequests.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.pr; import java.util.List; import lombok.Getter; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/RecordStatus.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/RecordStatus.java similarity index 62% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/RecordStatus.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/pr/RecordStatus.java index e4c309a4..c485d334 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/RecordStatus.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/pr/RecordStatus.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.pr; public enum RecordStatus { diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/Question.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/question/Question.java similarity index 89% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/Question.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/question/Question.java index 6e9c0998..d58d4de5 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/Question.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/question/Question.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.question; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubRepository.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/repo/GithubRepository.java similarity index 94% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/GithubRepository.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/repo/GithubRepository.java index 6aa85850..68ff9ae8 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/repo/GithubRepository.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.repo; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubToken.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/token/GithubToken.java similarity index 76% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/GithubToken.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/token/GithubToken.java index 9bab6be2..f6744935 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubToken.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/token/GithubToken.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.token; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubRepoRegistryCount.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubRepoRegistryCount.java new file mode 100644 index 00000000..27a4ad68 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubRepoRegistryCount.java @@ -0,0 +1,16 @@ +package com.devoops.domain.entity.github.webhook; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class GithubRepoRegistryCount { + + private final long externalId; + private final long reposCount; + + public boolean greaterThan(long reposCount) { + return this.reposCount > reposCount; + } +} diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubWebhook.java b/gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubWebhook.java similarity index 87% rename from gss-domain/src/main/java/com/devoops/domain/entity/github/GithubWebhook.java rename to gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubWebhook.java index 5be3fe32..f5aeedb9 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/github/GithubWebhook.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/github/webhook/GithubWebhook.java @@ -1,4 +1,4 @@ -package com.devoops.domain.entity.github; +package com.devoops.domain.entity.github.webhook; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/entity/user/User.java b/gss-domain/src/main/java/com/devoops/domain/entity/user/User.java index e68342a9..275190a4 100644 --- a/gss-domain/src/main/java/com/devoops/domain/entity/user/User.java +++ b/gss-domain/src/main/java/com/devoops/domain/entity/user/User.java @@ -1,6 +1,6 @@ package com.devoops.domain.entity.user; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubTokenDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubTokenDomainRepository.java deleted file mode 100644 index 1b6540eb..00000000 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubTokenDomainRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.devoops.domain.repository.github; - -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.domain.entity.user.User; - -import java.util.Optional; - -public interface GithubTokenDomainRepository { - - GithubToken save(GithubToken token, User user); - - Optional findByUserId(User owner); -} diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerDomainRepository.java similarity index 72% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerDomainRepository.java index f4a35764..50da0e7c 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerDomainRepository.java @@ -1,7 +1,7 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.question.Question; import java.util.List; import java.util.Optional; diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerRankingDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerRankingDomainRepository.java similarity index 51% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerRankingDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerRankingDomainRepository.java index 3a0ff5d0..d25296dd 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/AnswerRankingDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/answer/AnswerRankingDomainRepository.java @@ -1,9 +1,9 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.PullRequests; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRankings; +import com.devoops.domain.entity.github.pr.PullRequests; public interface AnswerRankingDomainRepository { diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/PullRequestDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/pr/PullRequestDomainRepository.java similarity index 74% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/PullRequestDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/pr/PullRequestDomainRepository.java index 71311db7..74cd3571 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/PullRequestDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/pr/PullRequestDomainRepository.java @@ -1,9 +1,8 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.pr; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.RecordStatus; -import java.util.List; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.entity.github.pr.RecordStatus; public interface PullRequestDomainRepository { diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/QuestionDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/question/QuestionDomainRepository.java similarity index 72% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/QuestionDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/question/QuestionDomainRepository.java index 1fe67f79..1ca59cdb 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/QuestionDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/question/QuestionDomainRepository.java @@ -1,7 +1,7 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.question; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.entity.github.question.Question; import com.devoops.domain.entity.github.QuestionAnswer; import java.util.List; diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubRepoDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/repo/GithubRepoDomainRepository.java similarity index 63% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/GithubRepoDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/repo/GithubRepoDomainRepository.java index 36cd935c..25a60eaf 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubRepoDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/repo/GithubRepoDomainRepository.java @@ -1,6 +1,6 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.repo; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import java.util.List; @@ -16,9 +16,11 @@ public interface GithubRepoDomainRepository { List findByUserId(long userId); - boolean existsByExternalId(long externalId); + boolean existsByExternalIdAndUserId(long externalId, long userId); GithubRepository findByExternalId(long externalId); + GithubRepository findByExternalIdAndUserId(long externalId, long userId); + void deleteById(long id); } diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/token/GithubTokenDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/token/GithubTokenDomainRepository.java new file mode 100644 index 00000000..07062ad0 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/token/GithubTokenDomainRepository.java @@ -0,0 +1,11 @@ +package com.devoops.domain.repository.github.token; + +import com.devoops.domain.entity.github.token.GithubToken; +import com.devoops.domain.entity.user.User; + +public interface GithubTokenDomainRepository { + + GithubToken save(GithubToken token, User user); + + GithubToken getByUserId(long userId); +} diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubRepoRegistryCountRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubRepoRegistryCountRepository.java new file mode 100644 index 00000000..a9d28b74 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubRepoRegistryCountRepository.java @@ -0,0 +1,18 @@ +package com.devoops.domain.repository.github.webhook; + +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; + +public interface GithubRepoRegistryCountRepository { + + GithubRepoRegistryCount save(GithubRepoRegistryCount githubRepoRegistryCount); + + GithubRepoRegistryCount getByExternalId(long externalId); + + boolean existsByExternalId(long externalId); + + void plusCount(long externalId); + + void minusCount(long externalId); + + void deleteByExternalId(long repoExternalId); +} diff --git a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubWebhookDomainRepository.java b/gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubWebhookDomainRepository.java similarity index 63% rename from gss-domain/src/main/java/com/devoops/domain/repository/github/GithubWebhookDomainRepository.java rename to gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubWebhookDomainRepository.java index d85a3292..1794f784 100644 --- a/gss-domain/src/main/java/com/devoops/domain/repository/github/GithubWebhookDomainRepository.java +++ b/gss-domain/src/main/java/com/devoops/domain/repository/github/webhook/GithubWebhookDomainRepository.java @@ -1,6 +1,6 @@ -package com.devoops.domain.repository.github; +package com.devoops.domain.repository.github.webhook; -import com.devoops.domain.entity.github.GithubWebhook; +import com.devoops.domain.entity.github.webhook.GithubWebhook; public interface GithubWebhookDomainRepository { diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerEntity.java similarity index 83% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerEntity.java index 0ecf3aee..da1ce828 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerEntity.java @@ -1,17 +1,12 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.answer; -import com.devoops.domain.entity.github.Answer; +import com.devoops.domain.entity.github.answer.Answer; import com.devoops.jpa.entity.BaseTimeEntity; import jakarta.persistence.Column; -import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerRankingEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerRankingEntity.java similarity index 91% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerRankingEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerRankingEntity.java index b0bc46e8..c16b88b1 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/AnswerRankingEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/answer/AnswerRankingEntity.java @@ -1,7 +1,7 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.jpa.entity.github.question.QuestionEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/PullRequestEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/pr/PullRequestEntity.java similarity index 94% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/PullRequestEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/pr/PullRequestEntity.java index 084aa2cd..81b48f2b 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/PullRequestEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/pr/PullRequestEntity.java @@ -1,7 +1,7 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.pr; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; import com.devoops.jpa.entity.BaseTimeEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/QuestionEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/question/QuestionEntity.java similarity index 82% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/QuestionEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/question/QuestionEntity.java index 033b7561..5862d05f 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/QuestionEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/question/QuestionEntity.java @@ -1,17 +1,12 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.question; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.question.Question; import com.devoops.jpa.entity.BaseTimeEntity; import jakarta.persistence.Column; -import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubRepositoryEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/repo/GithubRepositoryEntity.java similarity index 95% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubRepositoryEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/repo/GithubRepositoryEntity.java index 8f06c25d..cb19269d 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubRepositoryEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/repo/GithubRepositoryEntity.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.repo; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import com.devoops.jpa.entity.BaseTimeEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubTokenEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/token/GithubTokenEntity.java similarity index 77% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubTokenEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/token/GithubTokenEntity.java index e20ddb04..5cc3e2e8 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubTokenEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/token/GithubTokenEntity.java @@ -1,17 +1,12 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.token; -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.jpa.entity.user.UserEntity; +import com.devoops.domain.entity.github.token.GithubToken; import jakarta.annotation.Nonnull; import jakarta.persistence.Column; -import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; -import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubRepoRegistryCountEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubRepoRegistryCountEntity.java new file mode 100644 index 00000000..c12816c3 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubRepoRegistryCountEntity.java @@ -0,0 +1,40 @@ +package com.devoops.jpa.entity.github.webhook; + +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Table(name = "github_repo_registry_count") +@Entity +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GithubRepoRegistryCountEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private long externalId; + + private long registryCount; + + public static GithubRepoRegistryCountEntity from(GithubRepoRegistryCount githubRepoRegistryCount) { + return new GithubRepoRegistryCountEntity( + null, + githubRepoRegistryCount.getExternalId(), + githubRepoRegistryCount.getReposCount() + ); + } + + public GithubRepoRegistryCount toDomainEntity() { + return new GithubRepoRegistryCount(this.externalId, this.registryCount); + } +} diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubWebhookEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubWebhookEntity.java similarity index 89% rename from gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubWebhookEntity.java rename to gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubWebhookEntity.java index 76f6a65c..243a6d3c 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/github/GithubWebhookEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/github/webhook/GithubWebhookEntity.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.entity.github; +package com.devoops.jpa.entity.github.webhook; -import com.devoops.domain.entity.github.GithubWebhook; +import com.devoops.domain.entity.github.webhook.GithubWebhook; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; diff --git a/gss-domain/src/main/java/com/devoops/jpa/entity/user/UserEntity.java b/gss-domain/src/main/java/com/devoops/jpa/entity/user/UserEntity.java index 6475c488..6ea042d4 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/entity/user/UserEntity.java +++ b/gss-domain/src/main/java/com/devoops/jpa/entity/user/UserEntity.java @@ -1,6 +1,6 @@ package com.devoops.jpa.entity.user; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerDomainRepositoryImpl.java similarity index 87% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerDomainRepositoryImpl.java index e6ec8e8a..786ed4e1 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerDomainRepositoryImpl.java @@ -1,14 +1,13 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.repository.github.AnswerDomainRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.repository.github.answer.AnswerDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.AnswerEntity; +import com.devoops.jpa.entity.github.answer.AnswerEntity; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerJpaRepository.java similarity index 89% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerJpaRepository.java index e03c604e..592ccba0 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.answer; -import com.devoops.jpa.entity.github.AnswerEntity; +import com.devoops.jpa.entity.github.answer.AnswerEntity; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingDomainRepositoryImpl.java similarity index 80% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingDomainRepositoryImpl.java index 25d58fe4..55679d49 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingDomainRepositoryImpl.java @@ -1,16 +1,18 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.repository.github.AnswerRankingDomainRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRankings; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.repository.github.answer.AnswerRankingDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.AnswerRankingEntity; -import com.devoops.jpa.entity.github.PullRequestEntity; -import com.devoops.jpa.entity.github.QuestionEntity; +import com.devoops.jpa.entity.github.answer.AnswerRankingEntity; +import com.devoops.jpa.entity.github.pr.PullRequestEntity; +import com.devoops.jpa.entity.github.question.QuestionEntity; +import com.devoops.jpa.repository.github.pr.PullRequestJpaRepository; +import com.devoops.jpa.repository.github.question.QuestionJpaRepository; import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingJpaRepository.java similarity index 78% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingJpaRepository.java index daa300e4..4fe95a4c 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/AnswerRankingJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/answer/AnswerRankingJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.answer; -import com.devoops.jpa.entity.github.AnswerRankingEntity; +import com.devoops.jpa.entity.github.answer.AnswerRankingEntity; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestDomainRepositoryImpl.java similarity index 88% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestDomainRepositoryImpl.java index 01ffa800..6b990595 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestDomainRepositoryImpl.java @@ -1,14 +1,16 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.pr; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.RecordStatus; -import com.devoops.domain.repository.github.PullRequestDomainRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.entity.github.pr.RecordStatus; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.GithubRepositoryEntity; -import com.devoops.jpa.entity.github.PullRequestEntity; -import com.devoops.jpa.entity.github.QuestionEntity; +import com.devoops.jpa.entity.github.repo.GithubRepositoryEntity; +import com.devoops.jpa.entity.github.pr.PullRequestEntity; +import com.devoops.jpa.entity.github.question.QuestionEntity; +import com.devoops.jpa.repository.github.question.QuestionJpaRepository; +import com.devoops.jpa.repository.github.repo.GithubRepoJpaRepository; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestJpaRepository.java similarity index 84% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestJpaRepository.java index c4a2d75b..911df779 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/PullRequestJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/pr/PullRequestJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.pr; -import com.devoops.jpa.entity.github.PullRequestEntity; +import com.devoops.jpa.entity.github.pr.PullRequestEntity; import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionDomainRepositoryImpl.java similarity index 86% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionDomainRepositoryImpl.java index e2e996db..39e23896 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionDomainRepositoryImpl.java @@ -1,13 +1,13 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.question; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.entity.github.question.Question; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.QuestionEntity; +import com.devoops.jpa.entity.github.question.QuestionEntity; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionJpaRepository.java similarity index 91% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionJpaRepository.java index 1636ba55..2dd0d921 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/QuestionJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/question/QuestionJpaRepository.java @@ -1,7 +1,7 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.question; import com.devoops.domain.entity.github.QuestionAnswer; -import com.devoops.jpa.entity.github.QuestionEntity; +import com.devoops.jpa.entity.github.question.QuestionEntity; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoDomainRepositoryImpl.java similarity index 76% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoDomainRepositoryImpl.java index 6b1171c8..99339572 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoDomainRepositoryImpl.java @@ -1,11 +1,10 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.repo; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.GithubRepositoryEntity; -import java.util.Optional; +import com.devoops.jpa.entity.github.repo.GithubRepositoryEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -41,6 +40,12 @@ public boolean existsByIdAndUserId(long id, long userId) { return repoJpaRepository.existsByIdAndUserId(id, userId); } + @Override + @Transactional(readOnly = true) + public boolean existsByExternalIdAndUserId(long externalId, long userId) { + return repoJpaRepository.existsByGithubRepositoryIdAndUserId(externalId, userId); + } + @Override @Transactional(readOnly = true) public GithubRepository findByIdAndUserId(long id, long userId) { @@ -61,14 +66,17 @@ public List findByUserId(long userId) { @Override @Transactional(readOnly = true) - public boolean existsByExternalId(long externalId) { - return repoJpaRepository.existsByGithubRepositoryId(externalId); + public GithubRepository findByExternalId(long externalId) { + return repoJpaRepository.findByGithubRepositoryId(externalId) + .orElseThrow(() -> new GssException(ErrorCode.GITHUB_REPOSITORY_NOT_FOUND)) + .toDomainEntity(); + } @Override @Transactional(readOnly = true) - public GithubRepository findByExternalId(long externalId) { - return repoJpaRepository.findByGithubRepositoryId(externalId) + public GithubRepository findByExternalIdAndUserId(long externalId, long userId) { + return repoJpaRepository.findByGithubRepositoryIdAndUserId(externalId, userId) .orElseThrow(() -> new GssException(ErrorCode.GITHUB_REPOSITORY_NOT_FOUND)) .toDomainEntity(); diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoJpaRepository.java similarity index 62% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoJpaRepository.java index ffda064b..f7cc064b 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubRepoJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/repo/GithubRepoJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.repo; -import com.devoops.jpa.entity.github.GithubRepositoryEntity; +import com.devoops.jpa.entity.github.repo.GithubRepositoryEntity; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -13,7 +13,9 @@ public interface GithubRepoJpaRepository extends JpaRepository findAllByUserId(Long userId); - boolean existsByGithubRepositoryId(long externalId); + boolean existsByGithubRepositoryIdAndUserId(long externalId, long userId); Optional findByGithubRepositoryId(long externalId); + + Optional findByGithubRepositoryIdAndUserId(long externalId, long userId); } diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenDomainRepositoryImpl.java similarity index 50% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenDomainRepositoryImpl.java index 28d09320..f80e2eb3 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenDomainRepositoryImpl.java @@ -1,10 +1,11 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.token; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubTokenDomainRepository; -import com.devoops.jpa.entity.github.GithubTokenEntity; -import java.util.Optional; +import com.devoops.domain.repository.github.token.GithubTokenDomainRepository; +import com.devoops.exception.custom.GssException; +import com.devoops.exception.errorcode.ErrorCode; +import com.devoops.jpa.entity.github.token.GithubTokenEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -23,9 +24,10 @@ public GithubToken save(GithubToken token, User owner) { } @Override - public Optional findByUserId(User owner) { - - return githubTokenJpaRepository.findByUserId(owner.getId()) - .map(GithubTokenEntity::toDomainEntity); + @Transactional(readOnly = true) + public GithubToken getByUserId(long userId) { + return githubTokenJpaRepository.findByUserId(userId) + .map(GithubTokenEntity::toDomainEntity) + .orElseThrow(() -> new GssException(ErrorCode.GITHUB_TOKEN_NOT_FOUND)); } } diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenJpaRepository.java similarity index 68% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenJpaRepository.java index 144eb23c..26087f2a 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubTokenJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/token/GithubTokenJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.token; -import com.devoops.jpa.entity.github.GithubTokenEntity; +import com.devoops.jpa.entity.github.token.GithubTokenEntity; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountJpaRepository.java new file mode 100644 index 00000000..e9ee4822 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountJpaRepository.java @@ -0,0 +1,25 @@ +package com.devoops.jpa.repository.github.webhook; + +import com.devoops.jpa.entity.github.webhook.GithubRepoRegistryCountEntity; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface GithubRepoRegistryCountJpaRepository extends JpaRepository { + + Optional findByExternalId(long externalId); + + boolean existsByExternalId(long externalId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("update GithubRepoRegistryCountEntity e set e.registryCount = e.registryCount + 1 where e.externalId = :externalId") + int incrementByExternalId(@Param("externalId") long externalId); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("update GithubRepoRegistryCountEntity e set e.registryCount = e.registryCount - 1 where e.externalId = :externalId and e.registryCount > 0") + int decrementByExternalIdIfPositive(@Param("externalId") long externalId); + + void deleteByExternalId(long repoExternalId); +} diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountRepositoryImpl.java new file mode 100644 index 00000000..ca46ef58 --- /dev/null +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubRepoRegistryCountRepositoryImpl.java @@ -0,0 +1,66 @@ +package com.devoops.jpa.repository.github.webhook; + +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; +import com.devoops.domain.repository.github.webhook.GithubRepoRegistryCountRepository; +import com.devoops.exception.custom.GssException; +import com.devoops.exception.errorcode.ErrorCode; +import com.devoops.jpa.entity.github.webhook.GithubRepoRegistryCountEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +@Repository +@RequiredArgsConstructor +public class GithubRepoRegistryCountRepositoryImpl implements GithubRepoRegistryCountRepository { + + private final GithubRepoRegistryCountJpaRepository githubRepoRegistryCountJpaRepository; + + @Override + public GithubRepoRegistryCount save(GithubRepoRegistryCount githubRepoRegistryCount) { + GithubRepoRegistryCountEntity registryCountEntity = GithubRepoRegistryCountEntity.from(githubRepoRegistryCount); + return githubRepoRegistryCountJpaRepository.save(registryCountEntity) + .toDomainEntity(); + } + + @Override + @Transactional(readOnly = true) + public GithubRepoRegistryCount getByExternalId(long externalId) { + return findRegistryEntityByExternalId(externalId) + .toDomainEntity(); + } + + @Override + @Transactional(readOnly = true) + public boolean existsByExternalId(long externalId) { + return githubRepoRegistryCountJpaRepository.existsByExternalId(externalId); + } + + @Override + @Transactional + public void plusCount(long externalId) { + int updatedRow = githubRepoRegistryCountJpaRepository.incrementByExternalId(externalId); + if (updatedRow == 0) { + throw new GssException(ErrorCode.GITHUB_REPOSITORY_REGISTRY_COUNT_NOT_FOUND); + } + } + + @Override + @Transactional + public void minusCount(long externalId) { + int updatedRow = githubRepoRegistryCountJpaRepository.decrementByExternalIdIfPositive(externalId); + if (updatedRow == 0) { + throw new GssException(ErrorCode.GITHUB_REPOSITORY_REGISTRY_COUNT_NOT_FOUND); + } + } + + @Override + @Transactional + public void deleteByExternalId(long repoExternalId) { + githubRepoRegistryCountJpaRepository.deleteByExternalId(repoExternalId); + } + + private GithubRepoRegistryCountEntity findRegistryEntityByExternalId(long externalId) { + return githubRepoRegistryCountJpaRepository.findByExternalId(externalId) + .orElseThrow(() -> new GssException(ErrorCode.GITHUB_REPOSITORY_REGISTRY_COUNT_NOT_FOUND)); + } +} diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookDomainRepositoryImpl.java similarity index 81% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookDomainRepositoryImpl.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookDomainRepositoryImpl.java index 1d62d1f5..a6d09123 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookDomainRepositoryImpl.java @@ -1,10 +1,10 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.webhook; -import com.devoops.domain.entity.github.GithubWebhook; -import com.devoops.domain.repository.github.GithubWebhookDomainRepository; +import com.devoops.domain.entity.github.webhook.GithubWebhook; +import com.devoops.domain.repository.github.webhook.GithubWebhookDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.GithubWebhookEntity; +import com.devoops.jpa.entity.github.webhook.GithubWebhookEntity; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookJpaRepository.java b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookJpaRepository.java similarity index 69% rename from gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookJpaRepository.java rename to gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookJpaRepository.java index c09c53d8..5a4b6231 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/github/GithubWebHookJpaRepository.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/github/webhook/GithubWebHookJpaRepository.java @@ -1,6 +1,6 @@ -package com.devoops.jpa.repository.github; +package com.devoops.jpa.repository.github.webhook; -import com.devoops.jpa.entity.github.GithubWebhookEntity; +import com.devoops.jpa.entity.github.webhook.GithubWebhookEntity; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/gss-domain/src/main/java/com/devoops/jpa/repository/user/UserDomainRepositoryImpl.java b/gss-domain/src/main/java/com/devoops/jpa/repository/user/UserDomainRepositoryImpl.java index a3a58626..48775fe9 100644 --- a/gss-domain/src/main/java/com/devoops/jpa/repository/user/UserDomainRepositoryImpl.java +++ b/gss-domain/src/main/java/com/devoops/jpa/repository/user/UserDomainRepositoryImpl.java @@ -1,14 +1,14 @@ package com.devoops.jpa.repository.user; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; import com.devoops.domain.repository.user.UserDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; -import com.devoops.jpa.entity.github.GithubTokenEntity; +import com.devoops.jpa.entity.github.token.GithubTokenEntity; import com.devoops.jpa.entity.user.UserEntity; -import com.devoops.jpa.repository.github.GithubTokenJpaRepository; +import com.devoops.jpa.repository.github.token.GithubTokenJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/gss-domain/src/main/java/com/devoops/service/answer/AnswerService.java b/gss-domain/src/main/java/com/devoops/service/answer/AnswerService.java index 8f059f62..010ff100 100644 --- a/gss-domain/src/main/java/com/devoops/service/answer/AnswerService.java +++ b/gss-domain/src/main/java/com/devoops/service/answer/AnswerService.java @@ -1,7 +1,7 @@ package com.devoops.service.answer; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.repository.github.AnswerDomainRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.repository.github.answer.AnswerDomainRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/gss-domain/src/main/java/com/devoops/service/answerranking/AnswerRankingService.java b/gss-domain/src/main/java/com/devoops/service/answerranking/AnswerRankingService.java index efc02642..1b1b2b73 100644 --- a/gss-domain/src/main/java/com/devoops/service/answerranking/AnswerRankingService.java +++ b/gss-domain/src/main/java/com/devoops/service/answerranking/AnswerRankingService.java @@ -1,11 +1,11 @@ package com.devoops.service.answerranking; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.AnswerRankings; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.repository.github.AnswerRankingDomainRepository; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.domain.entity.github.answer.AnswerRankings; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.repository.github.answer.AnswerRankingDomainRepository; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/gss-domain/src/main/java/com/devoops/service/pullrequest/PullRequestService.java b/gss-domain/src/main/java/com/devoops/service/pullrequest/PullRequestService.java index 4249a180..8fb4549d 100644 --- a/gss-domain/src/main/java/com/devoops/service/pullrequest/PullRequestService.java +++ b/gss-domain/src/main/java/com/devoops/service/pullrequest/PullRequestService.java @@ -1,10 +1,10 @@ package com.devoops.service.pullrequest; import com.devoops.command.request.PullRequestCreateCommand; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.RecordStatus; -import com.devoops.domain.repository.github.PullRequestDomainRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.PullRequests; +import com.devoops.domain.entity.github.pr.RecordStatus; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -34,9 +34,5 @@ public PullRequest findByQuestionId(long questionId) { public PullRequest getPullRequest(long pullRequestId) { return pullRequestRepository.findById(pullRequestId); } - - public PullRequests findByRepositoryId(long repositoryId) { - return pullRequestRepository.findByRepositoryId(repositoryId); - } } diff --git a/gss-domain/src/main/java/com/devoops/service/question/QuestionService.java b/gss-domain/src/main/java/com/devoops/service/question/QuestionService.java index 0b20203d..110166b5 100644 --- a/gss-domain/src/main/java/com/devoops/service/question/QuestionService.java +++ b/gss-domain/src/main/java/com/devoops/service/question/QuestionService.java @@ -1,16 +1,15 @@ package com.devoops.service.question; import com.devoops.command.request.AnswerUpdateCommand; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Answers; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.Answers; +import com.devoops.domain.entity.github.question.Question; import com.devoops.domain.entity.github.QuestionAnswer; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.AnswerDomainRepository; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.repository.github.answer.AnswerDomainRepository; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/gss-domain/src/main/java/com/devoops/service/repository/RepositoryService.java b/gss-domain/src/main/java/com/devoops/service/repository/RepositoryService.java index acaa400d..4755b2ad 100644 --- a/gss-domain/src/main/java/com/devoops/service/repository/RepositoryService.java +++ b/gss-domain/src/main/java/com/devoops/service/repository/RepositoryService.java @@ -1,21 +1,16 @@ package com.devoops.service.repository; import com.devoops.command.request.RepositoryCreateCommand; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequests; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequests; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.AnswerDomainRepository; -import com.devoops.domain.repository.github.AnswerRankingDomainRepository; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; -import com.devoops.domain.repository.github.PullRequestDomainRepository; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; import com.devoops.exception.custom.GssException; import com.devoops.exception.errorcode.ErrorCode; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; - -import java.util.List; import org.springframework.transaction.annotation.Transactional; @Service @@ -24,12 +19,9 @@ public class RepositoryService { private final GithubRepoDomainRepository repoRepository; private final PullRequestDomainRepository pullRequestRepository; - private final AnswerRankingDomainRepository answerRankingRepository; - private final AnswerDomainRepository answerRepository; - private final QuestionDomainRepository questionRepository; public GithubRepository save(RepositoryCreateCommand command) { - if(repoRepository.existsByExternalId(command.externalId())) { + if (repoRepository.existsByExternalIdAndUserId(command.externalId(), command.userId())) { throw new GssException(ErrorCode.ALREADY_SAVED_REPOSITORY); } return repoRepository.save(command.toDomainEntity()); diff --git a/gss-domain/src/main/resources/application-db.yml b/gss-domain/src/main/resources/application-db.yml index 416bab1c..2d8d2fa6 100644 --- a/gss-domain/src/main/resources/application-db.yml +++ b/gss-domain/src/main/resources/application-db.yml @@ -3,33 +3,33 @@ spring: config: activate: on-profile: local - datasource: - url: jdbc:mysql://localhost:3306/gss?useSSL=false&allowPublicKeyRetrieval=true - username: root - password: - jpa: - hibernate: - ddl-auto: create-drop - properties: - hibernate: - dialect: org.hibernate.dialect.MySQL8Dialect # datasource: -# driver-class-name: org.h2.Driver -# url: jdbc:h2:mem:database -# username: sa +# url: jdbc:mysql://localhost:3306/gss?useSSL=false&allowPublicKeyRetrieval=true +# username: root # password: -# h2: -# console: -# enabled: true -# path: /h2-console # jpa: -# show-sql: true -# properties: -# hibernate: -# format_sql: true # hibernate: # ddl-auto: create-drop -# defer-datasource-initialization: false +# properties: +# hibernate: +# dialect: org.hibernate.dialect.MySQL8Dialect + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:database + username: sa + password: + h2: + console: + enabled: true + path: /h2-console + jpa: + show-sql: true + properties: + hibernate: + format_sql: true + hibernate: + ddl-auto: create-drop + defer-datasource-initialization: false --- spring: diff --git a/gss-domain/src/testFixtures/java/com/devoops/BaseRepositoryTest.java b/gss-domain/src/testFixtures/java/com/devoops/BaseRepositoryTest.java index 31e46045..8dfa388d 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/BaseRepositoryTest.java +++ b/gss-domain/src/testFixtures/java/com/devoops/BaseRepositoryTest.java @@ -1,7 +1,7 @@ package com.devoops; -import com.devoops.jpa.repository.github.GithubRepoJpaRepository; -import com.devoops.jpa.repository.github.PullRequestJpaRepository; +import com.devoops.jpa.repository.github.repo.GithubRepoJpaRepository; +import com.devoops.jpa.repository.github.pr.PullRequestJpaRepository; import com.devoops.jpa.repository.user.UserJpaRepository; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerGenerator.java index aef91870..0bd6c43b 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerGenerator.java @@ -1,8 +1,8 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.repository.github.AnswerDomainRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.repository.github.answer.AnswerDomainRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerRankingGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerRankingGenerator.java index 6150bd90..595cf4d9 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerRankingGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/AnswerRankingGenerator.java @@ -1,11 +1,11 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.Answer; -import com.devoops.domain.entity.github.AnswerRanking; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.jpa.entity.github.AnswerRankingEntity; -import com.devoops.jpa.repository.github.AnswerRankingJpaRepository; +import com.devoops.domain.entity.github.answer.Answer; +import com.devoops.domain.entity.github.answer.AnswerRanking; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.jpa.entity.github.answer.AnswerRankingEntity; +import com.devoops.jpa.repository.github.answer.AnswerRankingJpaRepository; import java.time.LocalDateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/GithubRepoGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/GithubRepoGenerator.java index 41b8a16f..eb2fcc0e 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/GithubRepoGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/GithubRepoGenerator.java @@ -1,8 +1,8 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.GithubRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; import java.util.concurrent.ThreadLocalRandom; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/PullRequestGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/PullRequestGenerator.java index add1fc4f..718f0050 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/PullRequestGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/PullRequestGenerator.java @@ -1,9 +1,9 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.RecordStatus; -import com.devoops.domain.repository.github.PullRequestDomainRepository; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.pr.RecordStatus; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/QuestionGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/QuestionGenerator.java index b136e78c..a1f10157 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/QuestionGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/QuestionGenerator.java @@ -1,8 +1,8 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/UserGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/UserGenerator.java index 0f974782..816e74b4 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/UserGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/UserGenerator.java @@ -1,6 +1,6 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.GithubToken; +import com.devoops.domain.entity.github.token.GithubToken; import com.devoops.domain.entity.user.User; import com.devoops.domain.repository.user.UserDomainRepository; import java.util.concurrent.ThreadLocalRandom; diff --git a/gss-domain/src/testFixtures/java/com/devoops/generator/WebhookGenerator.java b/gss-domain/src/testFixtures/java/com/devoops/generator/WebhookGenerator.java index 0fe239b4..077555c1 100644 --- a/gss-domain/src/testFixtures/java/com/devoops/generator/WebhookGenerator.java +++ b/gss-domain/src/testFixtures/java/com/devoops/generator/WebhookGenerator.java @@ -1,9 +1,11 @@ package com.devoops.generator; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.GithubWebhook; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.webhook.GithubRepoRegistryCount; +import com.devoops.domain.entity.github.webhook.GithubWebhook; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubWebhookDomainRepository; +import com.devoops.domain.repository.github.webhook.GithubRepoRegistryCountRepository; +import com.devoops.domain.repository.github.webhook.GithubWebhookDomainRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -13,8 +15,12 @@ public class WebhookGenerator { @Autowired private GithubWebhookDomainRepository githubWebhookDomainRepository; - public GithubWebhook generate(User user, GithubRepository repository) { + @Autowired + private GithubRepoRegistryCountRepository githubRepoRegistryCountRepository; + + public GithubWebhook generate(User user, GithubRepository repository, long trackingCount) { GithubWebhook webHook = new GithubWebhook(101L, repository.getId()); + githubRepoRegistryCountRepository.save(new GithubRepoRegistryCount(repository.getExternalId(), trackingCount)); return githubWebhookDomainRepository.save(webHook); } } diff --git a/gss-mcp-app/src/main/java/com/devoops/controller/webhook/WebhookController.java b/gss-mcp-app/src/main/java/com/devoops/controller/webhook/WebhookController.java index 1064a711..1ea77b84 100644 --- a/gss-mcp-app/src/main/java/com/devoops/controller/webhook/WebhookController.java +++ b/gss-mcp-app/src/main/java/com/devoops/controller/webhook/WebhookController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/gss-mcp-app/src/main/java/com/devoops/dto/request/GitHubWebhookEventRequest.java b/gss-mcp-app/src/main/java/com/devoops/dto/request/GitHubWebhookEventRequest.java index 29a6bef3..9ab5268d 100644 --- a/gss-mcp-app/src/main/java/com/devoops/dto/request/GitHubWebhookEventRequest.java +++ b/gss-mcp-app/src/main/java/com/devoops/dto/request/GitHubWebhookEventRequest.java @@ -89,7 +89,7 @@ public LocalDateTime getMergedAt() { return pullRequest.mergedAt; } - public Boolean isMerged() { + public boolean isMerged() { if ("closed".equals(action) && pullRequest != null && pullRequest.merged != null diff --git a/gss-mcp-app/src/main/java/com/devoops/event/QuestionCreateEvent.java b/gss-mcp-app/src/main/java/com/devoops/event/QuestionCreateEvent.java index f5de0764..b64c92f1 100644 --- a/gss-mcp-app/src/main/java/com/devoops/event/QuestionCreateEvent.java +++ b/gss-mcp-app/src/main/java/com/devoops/event/QuestionCreateEvent.java @@ -1,7 +1,7 @@ package com.devoops.event; -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.domain.entity.github.PullRequest; +import com.devoops.domain.entity.github.token.GithubToken; +import com.devoops.domain.entity.github.pr.PullRequest; import com.devoops.dto.AppWebhookEventRequest; import lombok.Getter; import org.springframework.context.ApplicationEvent; diff --git a/gss-mcp-app/src/main/java/com/devoops/event/QuestionEventListener.java b/gss-mcp-app/src/main/java/com/devoops/event/QuestionEventListener.java index 028bfc7d..595375db 100644 --- a/gss-mcp-app/src/main/java/com/devoops/event/QuestionEventListener.java +++ b/gss-mcp-app/src/main/java/com/devoops/event/QuestionEventListener.java @@ -3,9 +3,9 @@ import com.devoops.adaptor.GithubAdaptor; import com.devoops.adaptor.PrAnalysisAdapter; import com.devoops.command.request.QuestionCreateCommand; -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.domain.entity.github.PullRequest; -import com.devoops.domain.entity.github.Question; +import com.devoops.domain.entity.github.token.GithubToken; +import com.devoops.domain.entity.github.pr.PullRequest; +import com.devoops.domain.entity.github.question.Question; import com.devoops.dto.AppWebhookEventRequest; import com.devoops.dto.request.AdaptedAnalyzePrResponse; import com.devoops.dto.response.AnalyzePrResponse; diff --git a/gss-mcp-app/src/main/java/com/devoops/service/webhook/WebhookFacadeService.java b/gss-mcp-app/src/main/java/com/devoops/service/webhook/WebhookFacadeService.java index 43d21de5..fe1dbe5e 100644 --- a/gss-mcp-app/src/main/java/com/devoops/service/webhook/WebhookFacadeService.java +++ b/gss-mcp-app/src/main/java/com/devoops/service/webhook/WebhookFacadeService.java @@ -1,15 +1,16 @@ package com.devoops.service.webhook; import com.devoops.command.request.PullRequestCreateCommand; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.GithubToken; -import com.devoops.domain.entity.github.PullRequest; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.token.GithubToken; +import com.devoops.domain.entity.github.pr.PullRequest; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.GithubRepoDomainRepository; +import com.devoops.domain.repository.github.repo.GithubRepoDomainRepository; import com.devoops.dto.AppWebhookEventRequest; import com.devoops.event.QuestionCreateEvent; import com.devoops.service.pullrequest.PullRequestService; import com.devoops.service.user.UserService; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; @@ -33,21 +34,24 @@ public void createQuestionWithWebhookEvent(AppWebhookEventRequest request) { log.info("request : {}", request); User triggerUser = userService.findByProviderId(request.userId()); - GithubToken githubToken = triggerUser.getGithubToken(); - // 레포 아이디를 기반으로 찾기 -> 풀리퀘 생성 -> prCount 올리기 - PullRequest readyPullRequest = savePullRequest( - triggerUser.getId(), - request - ); + GithubRepository githubRepository = githubRepoDomainRepository.findByExternalIdAndUserId(request.repositoryId(), triggerUser.getId()); - eventPublisher.publishEvent(new QuestionCreateEvent(this, request, readyPullRequest, githubToken)); + if(githubRepository.isTracking()) { + PullRequest readyPullRequest = savePullRequest( + triggerUser.getId(), + request + ); + QuestionCreateEvent questionCreateEvent = new QuestionCreateEvent(this, request, readyPullRequest, triggerUser.getGithubToken()); + eventPublisher.publishEvent(questionCreateEvent); + } } private PullRequest savePullRequest( long userId, AppWebhookEventRequest request ) { - GithubRepository githubRepository = githubRepoDomainRepository.findByExternalId(request.repositoryId()); + // 레포 아이디를 기반으로 찾기 -> 풀리퀘 생성 -> prCount 올리기 + GithubRepository githubRepository = githubRepoDomainRepository.findByExternalIdAndUserId(request.repositoryId(), userId); PullRequestCreateCommand prCreateCommand = resolvePRCreateCommand(request, githubRepository.getId(), userId); return pullRequestService.save(prCreateCommand); } diff --git a/gss-mcp-app/src/test/java/com/devoops/service/webhook/WebhookFacadeServiceTest.java b/gss-mcp-app/src/test/java/com/devoops/service/webhook/WebhookFacadeServiceTest.java index 8fea513b..d7575352 100644 --- a/gss-mcp-app/src/test/java/com/devoops/service/webhook/WebhookFacadeServiceTest.java +++ b/gss-mcp-app/src/test/java/com/devoops/service/webhook/WebhookFacadeServiceTest.java @@ -4,12 +4,12 @@ import com.devoops.BaseMcpTest; import com.devoops.adaptor.GithubAdaptor; -import com.devoops.domain.entity.github.GithubRepository; -import com.devoops.domain.entity.github.PullRequests; +import com.devoops.domain.entity.github.repo.GithubRepository; +import com.devoops.domain.entity.github.pr.PullRequests; import com.devoops.domain.entity.github.QuestionAnswer; import com.devoops.domain.entity.user.User; -import com.devoops.domain.repository.github.PullRequestDomainRepository; -import com.devoops.domain.repository.github.QuestionDomainRepository; +import com.devoops.domain.repository.github.pr.PullRequestDomainRepository; +import com.devoops.domain.repository.github.question.QuestionDomainRepository; import com.devoops.dto.AppWebhookEventRequest; import com.devoops.dto.request.GitHubWebhookEventRequest; import java.time.LocalDateTime;