in dashboard/server/src/main/java/build/bazel/dashboard/github/issue/GithubIssueService.java [57:139]
public Single<FetchResult> fetchAndSave(String owner, String repo, int issueNumber) {
return githubIssueRepo
.findOne(owner, repo, issueNumber)
.switchIfEmpty(Single.just(GithubIssue.empty(owner, repo, issueNumber)))
.flatMap(
existed -> {
FetchIssueRequest request =
FetchIssueRequest.builder()
.owner(owner)
.repo(repo)
.issueNumber(issueNumber)
.etag(existed.getEtag())
.build();
boolean exists = existed.getTimestamp().isAfter(Instant.EPOCH);
return githubApi
.fetchIssue(request)
.flatMap(
response -> {
if (response.getStatus().is2xxSuccessful()) {
GithubIssue githubIssue =
GithubIssue.builder()
.owner(owner)
.repo(repo)
.issueNumber(issueNumber)
.timestamp(Instant.now())
.etag(response.getEtag())
.data(response.getBody())
.build();
return githubIssueRepo
.save(githubIssue)
.andThen(githubIssueStatusService.check(githubIssue, Instant.now()))
.map(
status ->
FetchResult.create(
githubIssue, status, !exists, exists, false, null))
.switchIfEmpty(
Single.just(
FetchResult.create(
githubIssue, null, !exists, exists, false, null)));
} else if (response.getStatus().value() == 304) {
// Not modified
return githubIssueStatusService
.check(existed, Instant.now())
.map(
status ->
FetchResult.create(
existed, status, false, false, false, null))
.switchIfEmpty(
Single.just(
FetchResult.create(
existed, null, false, false, false, null)));
} else if (response.getStatus().value() == 301
|| response.getStatus().value() == 404
|| response.getStatus().value() == 410) {
// Transferred or deleted
return githubIssueRepo
.delete(owner, repo, issueNumber)
// Mark existing status to DELETED
.andThen(
githubIssueStatusService.markDeleted(owner, repo, issueNumber))
.toSingle(
() ->
FetchResult.create(existed, null, false, false, true, null));
} else {
log.error(
"Failed to fetch {}/{}/issues/{}: {}",
owner,
repo,
issueNumber,
response.getStatus().toString());
return Single.just(
FetchResult.create(
existed,
null,
false,
false,
false,
new IOException(response.getStatus().toString())));
}
});
});
}