blob: 89f90d825f7cfe50d5ff6f456c7021e1a9a58e27 [file] [log] [blame]
package build.bazel.dashboard.github.issue;
import static build.bazel.dashboard.utils.PgJson.toPgJson;
import static java.util.Objects.requireNonNull;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.r2dbc.postgresql.codec.Json;
import io.r2dbc.spi.Readable;
import java.io.IOException;
import java.time.Instant;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.r2dbc.core.DatabaseClient;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class GithubPullRequestRepo {
private final DatabaseClient databaseClient;
private final ObjectMapper objectMapper;
public void save(GithubPullRequest pullRequest) {
databaseClient
.sql(
"INSERT INTO github_pull_request_data (owner, repo, issue_number, timestamp, etag, data)"
+ " VALUES (:owner, :repo, :issue_number, :timestamp, :etag, :data) ON"
+ " CONFLICT (owner, repo, issue_number) DO UPDATE SET etag = excluded.etag,"
+ " timestamp = excluded.timestamp, data = excluded.data")
.bind("owner", pullRequest.owner())
.bind("repo", pullRequest.repo())
.bind("issue_number", pullRequest.issueNumber())
.bind("timestamp", pullRequest.timestamp())
.bind("etag", pullRequest.etag())
.bind("data", toPgJson(objectMapper, pullRequest.data()))
.then()
.block();
}
public void delete(String owner, String repo, int issueNumber) {
databaseClient
.sql(
"DELETE FROM github_pull_request_data WHERE owner = :owner AND repo = :repo AND"
+ " issue_number = :issue_number")
.bind("owner", owner)
.bind("repo", repo)
.bind("issue_number", issueNumber)
.then()
.block();
}
public Optional<GithubPullRequest> findOne(String owner, String repo, int issueNumber) {
return Optional.ofNullable(
databaseClient
.sql(
"SELECT owner, repo, issue_number, timestamp, etag, data FROM github_pull_request_data "
+ "WHERE owner=:owner AND repo=:repo AND issue_number=:issue_number")
.bind("owner", owner)
.bind("repo", repo)
.bind("issue_number", issueNumber)
.map(this::toPullRequest)
.one()
.block());
}
private GithubPullRequest toPullRequest(Readable row) {
try {
return new GithubPullRequest(
requireNonNull(row.get("owner", String.class)),
requireNonNull(row.get("repo", String.class)),
requireNonNull(row.get("issue_number", Integer.class)),
requireNonNull(row.get("timestamp", Instant.class)),
requireNonNull(row.get("etag", String.class)),
objectMapper.readTree((requireNonNull(row.get("data", Json.class))).asArray()));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}