|
3 | 3 | import io.pakland.mdas.githubstats.application.exceptions.HttpException; |
4 | 4 | import io.pakland.mdas.githubstats.application.mappers.ReviewMapper; |
5 | 5 | import io.pakland.mdas.githubstats.domain.entity.UserReview; |
| 6 | +import io.pakland.mdas.githubstats.domain.lib.InternalCaching; |
6 | 7 | import io.pakland.mdas.githubstats.domain.repository.ReviewExternalRepository; |
7 | 8 | import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubReviewDTO; |
| 9 | +import java.util.List; |
8 | 10 | import org.slf4j.Logger; |
9 | 11 | import org.slf4j.LoggerFactory; |
10 | 12 | import org.springframework.web.reactive.function.client.WebClientResponseException; |
11 | 13 |
|
12 | | -import java.util.List; |
13 | | - |
14 | 14 | public class ReviewGitHubRepository implements ReviewExternalRepository { |
| 15 | + |
15 | 16 | private final WebClientConfiguration webClientConfiguration; |
16 | 17 | private final Logger logger = LoggerFactory.getLogger(ReviewGitHubRepository.class); |
17 | 18 |
|
| 19 | + private final InternalCaching<String, List<UserReview>> cache = new InternalCaching<>(); |
| 20 | + |
18 | 21 | public ReviewGitHubRepository(WebClientConfiguration webClientConfiguration) { |
19 | 22 | this.webClientConfiguration = webClientConfiguration; |
20 | 23 | } |
21 | 24 |
|
22 | 25 | @Override |
23 | | - public List<UserReview> fetchReviewsFromPullRequest(FetchReviewsFromPullRequestRequest request) throws HttpException { |
| 26 | + public List<UserReview> fetchReviewsFromPullRequest(FetchReviewsFromPullRequestRequest request) |
| 27 | + throws HttpException { |
| 28 | + String query = String.format("/repos/%s/%s/pulls/%s/reviews?%s", |
| 29 | + request.getRepositoryOwner(), |
| 30 | + request.getRepositoryName(), |
| 31 | + request.getPullRequestNumber(), |
| 32 | + getRequestParams(request.getPage(), request.getPerPage()) |
| 33 | + ); |
| 34 | + List<UserReview> maybeResult = cache.get(query); |
| 35 | + if (maybeResult != null) { |
| 36 | + return maybeResult; |
| 37 | + } |
| 38 | + |
24 | 39 | try { |
25 | 40 |
|
26 | | - return this.webClientConfiguration.getWebClient().get() |
27 | | - .uri(String.format("/repos/%s/%s/pulls/%s/reviews?%s", |
28 | | - request.getRepositoryOwner(), |
29 | | - request.getRepositoryName(), |
30 | | - request.getPullRequestNumber(), |
31 | | - getRequestParams(request.getPage(), request.getPerPage()) |
32 | | - )) |
33 | | - .retrieve() |
34 | | - .bodyToFlux(GitHubReviewDTO.class) |
35 | | - .map(ReviewMapper::dtoToEntity) |
36 | | - .collectList() |
37 | | - .block(); |
| 41 | + List<UserReview> result = this.webClientConfiguration.getWebClient().get() |
| 42 | + .uri(query) |
| 43 | + .retrieve() |
| 44 | + .bodyToFlux(GitHubReviewDTO.class) |
| 45 | + .map(ReviewMapper::dtoToEntity) |
| 46 | + .collectList() |
| 47 | + .block(); |
| 48 | + cache.add(query, result); |
38 | 49 |
|
| 50 | + return result; |
39 | 51 | } catch (WebClientResponseException ex) { |
40 | 52 | logger.error(ex.toString()); |
41 | 53 | throw new HttpException(ex.getRawStatusCode(), ex.getMessage()); |
|
0 commit comments