Skip to content

Commit cb1c3b5

Browse files
committed
feat: add internal caching on fetching user reviews
1 parent dd48c84 commit cb1c3b5

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

src/main/java/io/pakland/mdas/githubstats/infrastructure/github/repository/ReviewGitHubRepository.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,51 @@
33
import io.pakland.mdas.githubstats.application.exceptions.HttpException;
44
import io.pakland.mdas.githubstats.application.mappers.ReviewMapper;
55
import io.pakland.mdas.githubstats.domain.entity.UserReview;
6+
import io.pakland.mdas.githubstats.domain.lib.InternalCaching;
67
import io.pakland.mdas.githubstats.domain.repository.ReviewExternalRepository;
78
import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubReviewDTO;
9+
import java.util.List;
810
import org.slf4j.Logger;
911
import org.slf4j.LoggerFactory;
1012
import org.springframework.web.reactive.function.client.WebClientResponseException;
1113

12-
import java.util.List;
13-
1414
public class ReviewGitHubRepository implements ReviewExternalRepository {
15+
1516
private final WebClientConfiguration webClientConfiguration;
1617
private final Logger logger = LoggerFactory.getLogger(ReviewGitHubRepository.class);
1718

19+
private final InternalCaching<String, List<UserReview>> cache = new InternalCaching<>();
20+
1821
public ReviewGitHubRepository(WebClientConfiguration webClientConfiguration) {
1922
this.webClientConfiguration = webClientConfiguration;
2023
}
2124

2225
@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+
2439
try {
2540

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);
3849

50+
return result;
3951
} catch (WebClientResponseException ex) {
4052
logger.error(ex.toString());
4153
throw new HttpException(ex.getRawStatusCode(), ex.getMessage());

0 commit comments

Comments
 (0)