From 1df057aba1aba7d0ee047080f98a6b06850d977b Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 12 Jul 2024 02:07:19 +0200 Subject: [PATCH] Add missing review system classes. --- .../GitHubReviewMentionRepository.java | 12 ++++ .../GitHubReviewMentionRepositoryImpl.java | 58 +++++++++++++++++++ .../database/GitHubReviewMentionWrapper.java | 44 ++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java create mode 100644 src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java create mode 100644 src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java new file mode 100644 index 0000000..e3504bc --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepository.java @@ -0,0 +1,12 @@ +package com.eternalcode.discordapp.review.database; + +import com.eternalcode.discordapp.review.GitHubPullRequest; +import java.util.concurrent.CompletableFuture; + +public interface GitHubReviewMentionRepository { + + CompletableFuture markReviewerAsMentioned(GitHubPullRequest pullRequest, long userId); + + CompletableFuture isMentioned(GitHubPullRequest pullRequest, long userId); + +} diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java new file mode 100644 index 0000000..64b9002 --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionRepositoryImpl.java @@ -0,0 +1,58 @@ +package com.eternalcode.discordapp.review.database; + +import com.eternalcode.discordapp.database.DataAccessException; +import com.eternalcode.discordapp.database.DatabaseManager; +import com.eternalcode.discordapp.database.repository.AbstractRepository; +import com.eternalcode.discordapp.review.GitHubPullRequest; +import com.j256.ormlite.table.TableUtils; +import io.sentry.Sentry; +import java.sql.SQLException; +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.CompletableFuture; + +public class GitHubReviewMentionRepositoryImpl extends AbstractRepository + implements GitHubReviewMentionRepository { + + private static final Duration MENTION_INTERVAL = Duration.ofHours(12); + + public GitHubReviewMentionRepositoryImpl(DatabaseManager databaseManager) { + super(databaseManager, GitHubReviewMentionWrapper.class); + } + + public static GitHubReviewMentionRepository create(DatabaseManager databaseManager) { + try { + TableUtils.createTableIfNotExists(databaseManager.getConnectionSource(), GitHubReviewMentionWrapper.class); + } + catch (SQLException sqlException) { + Sentry.captureException(sqlException); + throw new DataAccessException("Failed to create table", sqlException); + } + + return new GitHubReviewMentionRepositoryImpl(databaseManager); + } + + @Override + public CompletableFuture markReviewerAsMentioned(GitHubPullRequest pullRequest, long userId) { + return CompletableFuture.runAsync(() -> { + GitHubReviewMentionWrapper mention = + GitHubReviewMentionWrapper.create(pullRequest.toUrl(), userId, Instant.now()); + this.save(mention); + }); + } + + @Override + public CompletableFuture isMentioned(GitHubPullRequest pullRequest, long userId) { + return this.select(pullRequest.toUrl()).thenApply(mentionOptional -> { + if (mentionOptional.isEmpty()) { + return false; + } + + GitHubReviewMentionWrapper mention = mentionOptional.get(); + Instant lastMention = mention.getLastMention(); + Instant nextMention = lastMention.plus(MENTION_INTERVAL); + + return nextMention.isAfter(Instant.now()); + }); + } +} diff --git a/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java new file mode 100644 index 0000000..273d9b3 --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/review/database/GitHubReviewMentionWrapper.java @@ -0,0 +1,44 @@ +package com.eternalcode.discordapp.review.database; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; +import java.time.Instant; + +@DatabaseTable(tableName = "review_mentions") +public final class GitHubReviewMentionWrapper { + + @DatabaseField(id = true) + private String pullRequest; + + @DatabaseField + private long userId; + + @DatabaseField + private long lastMention; + + public GitHubReviewMentionWrapper() { + } + + private GitHubReviewMentionWrapper(String pullRequest, long userId, long lastMention) { + this.pullRequest = pullRequest; + this.userId = userId; + this.lastMention = lastMention; + } + + public static GitHubReviewMentionWrapper create(String pullRequest, long userId, Instant lastMention) { + return new GitHubReviewMentionWrapper(pullRequest, userId, lastMention.toEpochMilli()); + } + + public String getPullRequest() { + return this.pullRequest; + } + + public long getUserId() { + return this.userId; + } + + public Instant getLastMention() { + return Instant.ofEpochMilli(this.lastMention); + } + +}