public Single fetchAndSave()

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())));
                        }
                      });
            });
  }