From 7d30afbd2c7b310bbf9dcf93a069c38ad13bf89d Mon Sep 17 00:00:00 2001
From: Sheldan <5037282+Sheldan@users.noreply.github.com>
Date: Mon, 24 May 2021 17:39:19 +0200
Subject: [PATCH] [AB-262] adding feature mode to suggestion to be
automatically reminded of a suggestion after a configurable amount of time
---
.../remind/service/RemindServiceBean.java | 2 +-
.../abstracto-modules/suggestion/pom.xml | 7 ++
.../suggestion/job/SuggestionReminderJob.java | 40 +++++++++
.../service/SuggestionServiceBean.java | 88 ++++++++++++++++++-
.../migrations/1.2.13/collection.xml | 11 +++
.../migrations/1.2.13/seedData/data.xml | 10 +++
.../1.2.13/seedData/suggestionReminderJob.xml | 18 ++++
.../migrations/1.2.13/tables/suggestion.xml | 15 ++++
.../migrations/1.2.13/tables/tables.xml | 10 +++
.../migrations/suggestion-changeLog.xml | 1 +
.../resources/suggestion-config.properties | 10 ++-
.../service/SuggestionServiceBeanTest.java | 9 +-
.../config/SuggestionFeatureConfig.java | 14 ++-
.../config/SuggestionFeatureMode.java | 15 ++++
.../config/SuggestionPostTarget.java | 2 +-
.../suggestion/model/database/Suggestion.java | 3 +
.../template/SuggestionReminderModel.java | 21 +++++
.../suggestion/service/SuggestionService.java | 5 ++
.../main/docs/asciidoc/modules/utility.adoc | 17 ++--
19 files changed, 284 insertions(+), 14 deletions(-)
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/job/SuggestionReminderJob.java
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/resources/migrations/1.2.13/collection.xml
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/resources/migrations/1.2.13/seedData/data.xml
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/resources/migrations/1.2.13/seedData/suggestionReminderJob.xml
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/resources/migrations/1.2.13/tables/suggestion.xml
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/resources/migrations/1.2.13/tables/tables.xml
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-int/src/main/java/dev/sheldan/abstracto/suggestion/config/SuggestionFeatureMode.java
create mode 100644 abstracto-application/abstracto-modules/suggestion/suggestion-int/src/main/java/dev/sheldan/abstracto/suggestion/model/template/SuggestionReminderModel.java
diff --git a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
index 1a901c763..7beaaf4b6 100644
--- a/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
+++ b/abstracto-application/abstracto-modules/remind/remind-impl/src/main/java/dev/sheldan/abstracto/remind/service/RemindServiceBean.java
@@ -111,7 +111,7 @@ public class RemindServiceBean implements ReminderService {
parameters.put("reminderId", reminder.getId().toString());
JobParameters jobParameters = JobParameters.builder().parameters(parameters).build();
String triggerKey = schedulerService.executeJobWithParametersOnce("reminderJob", "utility", jobParameters, Date.from(reminder.getTargetDate()));
- log.info("Starting scheduled job with trigger {} to execute reminder. {}", triggerKey, reminder.getId());
+ log.info("Starting scheduled job with trigger {} to execute reminder {}.", triggerKey, reminder.getId());
reminder.setJobTriggerKey(triggerKey);
reminderManagementService.saveReminder(reminder);
}
diff --git a/abstracto-application/abstracto-modules/suggestion/pom.xml b/abstracto-application/abstracto-modules/suggestion/pom.xml
index ae63489af..713c0695b 100644
--- a/abstracto-application/abstracto-modules/suggestion/pom.xml
+++ b/abstracto-application/abstracto-modules/suggestion/pom.xml
@@ -21,6 +21,13 @@
${project.version}
compile
+
+
+ dev.sheldan.abstracto.scheduling
+ scheduling-int
+ ${project.version}
+ compile
+
diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/job/SuggestionReminderJob.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/job/SuggestionReminderJob.java
new file mode 100644
index 000000000..7b0ec011a
--- /dev/null
+++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/job/SuggestionReminderJob.java
@@ -0,0 +1,40 @@
+package dev.sheldan.abstracto.suggestion.job;
+
+import dev.sheldan.abstracto.core.models.ServerSpecificId;
+import dev.sheldan.abstracto.suggestion.service.SuggestionService;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.PersistJobDataAfterExecution;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@DisallowConcurrentExecution
+@Component
+@Getter
+@Setter
+@PersistJobDataAfterExecution
+public class SuggestionReminderJob extends QuartzJobBean {
+
+ @Autowired
+ private SuggestionService suggestionService;
+
+ private Long suggestionId;
+ private Long serverId;
+
+ @Override
+ protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+ log.info("Executing suggestion reminder job for suggestion {} in server {}", suggestionId, serverId);
+ try {
+ suggestionService.remindAboutSuggestion(new ServerSpecificId(serverId, suggestionId));
+ } catch (Exception exception) {
+ log.error("Suggestion reminder job failed.", exception);
+ }
+ }
+
+}
diff --git a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java
index 96527f897..4d19c154e 100644
--- a/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java
+++ b/abstracto-application/abstracto-modules/suggestion/suggestion-impl/src/main/java/dev/sheldan/abstracto/suggestion/service/SuggestionServiceBean.java
@@ -1,5 +1,8 @@
package dev.sheldan.abstracto.suggestion.service;
+import dev.sheldan.abstracto.core.models.ServerChannelMessage;
+import dev.sheldan.abstracto.core.models.ServerSpecificId;
+import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.*;
@@ -8,11 +11,16 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi
import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService;
+import dev.sheldan.abstracto.scheduling.model.JobParameters;
+import dev.sheldan.abstracto.scheduling.service.SchedulerService;
+import dev.sheldan.abstracto.suggestion.config.SuggestionFeatureDefinition;
+import dev.sheldan.abstracto.suggestion.config.SuggestionFeatureMode;
import dev.sheldan.abstracto.suggestion.config.SuggestionPostTarget;
import dev.sheldan.abstracto.suggestion.exception.UnSuggestNotPossibleException;
import dev.sheldan.abstracto.suggestion.model.database.Suggestion;
import dev.sheldan.abstracto.suggestion.model.database.SuggestionState;
import dev.sheldan.abstracto.suggestion.model.template.SuggestionLog;
+import dev.sheldan.abstracto.suggestion.model.template.SuggestionReminderModel;
import dev.sheldan.abstracto.suggestion.service.management.SuggestionManagementService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.*;
@@ -24,6 +32,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -36,6 +46,7 @@ public class SuggestionServiceBean implements SuggestionService {
public static final String SUGGESTION_YES_EMOTE = "suggestionYes";
public static final String SUGGESTION_NO_EMOTE = "suggestionNo";
public static final String SUGGESTION_COUNTER_KEY = "suggestion";
+ public static final String SUGGESTION_REMINDER_TEMPLATE_KEY = "suggest_suggestion_reminder";
@Autowired
private SuggestionManagementService suggestionManagementService;
@@ -73,6 +84,15 @@ public class SuggestionServiceBean implements SuggestionService {
@Autowired
private UserService userService;
+ @Autowired
+ private SchedulerService schedulerService;
+
+ @Autowired
+ private FeatureModeService featureModeService;
+
+ @Autowired
+ private ConfigService configService;
+
@Value("${abstracto.feature.suggestion.removalMaxAge}")
private Long removalMaxAgeSeconds;
@@ -114,8 +134,25 @@ public class SuggestionServiceBean implements SuggestionService {
@Transactional
public void persistSuggestionInDatabase(Member member, String text, Message message, Long suggestionId, Message commandMessage) {
- log.info("Persisting suggestion {} for server {} in database.", suggestionId, member.getGuild().getId());
- suggestionManagementService.createSuggestion(member, text, message, suggestionId, commandMessage);
+ Long serverId = member.getGuild().getIdLong();
+ log.info("Persisting suggestion {} for server {} in database.", suggestionId, serverId);
+ Suggestion suggestion = suggestionManagementService.createSuggestion(member, text, message, suggestionId, commandMessage);
+ if(featureModeService.featureModeActive(SuggestionFeatureDefinition.SUGGEST, serverId, SuggestionFeatureMode.SUGGESTION_REMINDER)) {
+ String triggerKey = scheduleSuggestionReminder(serverId, suggestionId);
+ suggestion.setSuggestionReminderJobTriggerKey(triggerKey);
+ }
+ }
+
+ private String scheduleSuggestionReminder(Long serverId, Long suggestionId) {
+ HashMap