-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRepositoryFacadeService.java
More file actions
94 lines (82 loc) · 4.01 KB
/
Copy pathRepositoryFacadeService.java
File metadata and controls
94 lines (82 loc) · 4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package com.devoops.service.facade;
import static com.devoops.Constants.INITIAL_PULL_REQUEST_COUNT;
import com.devoops.command.request.RepositoryCreateCommand;
import com.devoops.domain.entity.github.pr.PullRequests;
import com.devoops.domain.entity.github.repo.GithubRepository;
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.exception.GithubForbiddenException;
import com.devoops.exception.GithubNotFoundException;
import com.devoops.exception.custom.GssException;
import com.devoops.exception.errorcode.ErrorCode;
import com.devoops.service.GitHubService;
import com.devoops.service.github.WebHookService;
import com.devoops.service.repository.RepositoryService;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
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) {
try {
GithubRepoUrl repoUrl = new GithubRepoUrl(request.url());
GithubRepoInfoResponse repositoryInfo = gitHubService.getRepositoryInfo(repoUrl, user.getGithubToken());
GithubRepository savedRepository = repositoryService.findByUserAndExternalId(user, repositoryInfo.id())
.map(alreadyRegisteredRepo -> reTrackingOrThrowException(user, alreadyRegisteredRepo))
.orElseGet(() -> registerNewRepo(repositoryInfo, repoUrl, user));
eventPublisher.publishEvent(new AnalyzeMyPrEvent(repoUrl, user, this));
return savedRepository;
} catch (GithubNotFoundException | GithubForbiddenException githubException) {
throw new GssException(ErrorCode.REGISTRY_GITHUB_REPOSITORY_NOT_FOUND);
}
}
private GithubRepository registerNewRepo(
GithubRepoInfoResponse repositoryInfo,
GithubRepoUrl url,
User user
) {
RepositoryCreateCommand createCommand = new RepositoryCreateCommand(
user.getId(),
repositoryInfo.name(),
url.getUrl(),
repositoryInfo.getOwnerName(),
INITIAL_PULL_REQUEST_COUNT,
repositoryInfo.id()
);
GithubRepository savedRepository = repositoryService.save(createCommand);
webHookService.registerWebhook(user, savedRepository.getId());
return savedRepository;
}
private GithubRepository reTrackingOrThrowException(User user, GithubRepository registeredRepo) {
if(registeredRepo.isTracking()) {
throw new GssException(ErrorCode.ALREADY_SAVED_REPOSITORY);
}
return repositoryService.reTracking(user, registeredRepo.getExternalId());
}
public PullRequests findAllPullRequestsByRepository(User user, long repositoryId, int size, int page) {
return repositoryService.getProcessedPullRequestsByRepository(user, repositoryId, size, page);
}
public PullRequests findAllPullRequests(User user, int size, int page) {
return repositoryService.getProcessedPullRequests(user, size, page);
}
public List<GithubRepository> findMyRepositories(User user) {
return repositoryService.getMyRepositories(user);
}
@Transactional
public void deleteRepository(User user, long repositoryId) {
//TODO 다른 유저로부터 등록된 상황 고려
repositoryService.stopTrackingRepository(user, repositoryId);
webHookService.deleteWebhook(user, repositoryId);
}
}