diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java new file mode 100644 index 000000000..21cdb6c48 --- /dev/null +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/commands/remind/UnRemind.java @@ -0,0 +1,53 @@ +package dev.sheldan.abstracto.utility.commands.remind; + +import dev.sheldan.abstracto.core.command.UtilityModuleInterface; +import dev.sheldan.abstracto.core.command.condition.AbstractConditionableCommand; +import dev.sheldan.abstracto.core.command.config.CommandConfiguration; +import dev.sheldan.abstracto.core.command.config.HelpInfo; +import dev.sheldan.abstracto.core.command.config.Parameter; +import dev.sheldan.abstracto.core.command.execution.CommandContext; +import dev.sheldan.abstracto.core.command.execution.CommandResult; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.utility.config.features.UtilityFeature; +import dev.sheldan.abstracto.utility.service.ReminderService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Component +public class UnRemind extends AbstractConditionableCommand { + + @Autowired + private ReminderService reminderService; + + @Override + public CommandResult execute(CommandContext commandContext) { + Long reminderId = (Long) commandContext.getParameters().getParameters().get(0); + reminderService.unRemind(reminderId, commandContext.getUserInitiatedContext().getAUserInAServer()); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("reminderId").type(Long.class).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("unRemind") + .module(UtilityModuleInterface.UTILITY) + .templated(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return UtilityFeature.REMIND; + } +} diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java index e5eb82587..0641776e3 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/repository/ReminderRepository.java @@ -14,4 +14,7 @@ public interface ReminderRepository extends JpaRepository { @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) List getByRemindedUserAndRemindedFalse(AUserInAServer aUserInAServer); + + @QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true")) + Reminder getByIdAndRemindedUserAndRemindedFalse(Long reminderId, AUserInAServer aUserInAServer); } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java index d5b629e81..4e2e996a1 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/RemindServiceBean.java @@ -1,5 +1,6 @@ package dev.sheldan.abstracto.utility.service; +import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException; import dev.sheldan.abstracto.core.service.ChannelService; import dev.sheldan.abstracto.core.service.management.ChannelManagementService; import dev.sheldan.abstracto.core.models.AServerAChannelAUser; @@ -88,7 +89,9 @@ public class RemindServiceBean implements ReminderService { log.trace("Starting scheduled job to execute reminder."); JobDataMap parameters = new JobDataMap(); parameters.putAsString("reminderId", reminder.getId()); - schedulerService.executeJobWithParametersOnce("reminderJob", "utility", parameters, Date.from(reminder.getTargetDate())); + String triggerKey = schedulerService.executeJobWithParametersOnce("reminderJob", "utility", parameters, Date.from(reminder.getTargetDate())); + reminder.setJobTriggerKey(triggerKey); + reminderManagementService.saveReminder(reminder); } } @@ -96,6 +99,9 @@ public class RemindServiceBean implements ReminderService { @Transactional public void executeReminder(Long reminderId) { Reminder reminderToRemindFor = reminderManagementService.loadReminder(reminderId); + if(reminderToRemindFor.isReminded()) { + return; + } AServer server = reminderToRemindFor.getServer(); AChannel channel = reminderToRemindFor.getChannel(); log.info("Executing reminder {}.", reminderId); @@ -123,4 +129,18 @@ public class RemindServiceBean implements ReminderService { } reminderManagementService.setReminded(reminderToRemindFor); } + + @Override + public void unRemind(Long reminderId, AUserInAServer aUserInAServer) { + Reminder reminder = reminderManagementService.getReminderByAndByUserNotReminded(aUserInAServer, reminderId); + if(reminder != null) { + reminder.setReminded(true); + if(reminder.getJobTriggerKey() != null) { + schedulerService.stopTrigger(reminder.getJobTriggerKey()); + } + reminderManagementService.saveReminder(reminder); + } else { + throw new AbstractoRunTimeException("Reminder does not exist, was already reminded or does not belong to you."); + } + } } diff --git a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java index 6a280b0b3..513a92ad4 100644 --- a/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/utility/utility-impl/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementServiceBean.java @@ -44,9 +44,20 @@ public class ReminderManagementServiceBean implements ReminderManagementService reminderRepository.save(reminder); } + @Override + public Reminder saveReminder(Reminder reminder) { + return reminderRepository.save(reminder); + } + @Override public List getActiveRemindersForUser(AUserInAServer aUserInAServer) { return reminderRepository.getByRemindedUserAndRemindedFalse(aUserInAServer); } + @Override + public Reminder getReminderByAndByUserNotReminded(AUserInAServer aUserInAServer, Long reminderId) { + return reminderRepository.getByIdAndRemindedUserAndRemindedFalse(reminderId, aUserInAServer); + } + + } diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java index a4ca156a1..495e25b82 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/models/database/Reminder.java @@ -56,6 +56,10 @@ public class Reminder { @Getter private boolean reminded; + @Getter + @Setter + private String jobTriggerKey; + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/ReminderService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/ReminderService.java index d39c0edbf..a0671eec6 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/ReminderService.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/ReminderService.java @@ -8,4 +8,5 @@ import java.time.Duration; public interface ReminderService { void createReminderInForUser(AUserInAServer user, String remindText, Duration remindIn, ReminderModel reminderModel); void executeReminder(Long reminderId); + void unRemind(Long reminderId, AUserInAServer userInAServer); } diff --git a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java index 336e77dab..e95c71b7c 100644 --- a/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java +++ b/abstracto-application/abstracto-modules/utility/utility-int/src/main/java/dev/sheldan/abstracto/utility/service/management/ReminderManagementService.java @@ -11,5 +11,7 @@ public interface ReminderManagementService { Reminder createReminder(AServerAChannelAUser userToBeReminded, String text, Instant timeToBeRemindedAt, Long messageId); Reminder loadReminder(Long reminderId); void setReminded(Reminder reminder); + Reminder saveReminder(Reminder reminder); List getActiveRemindersForUser(AUserInAServer aUserInAServer); + Reminder getReminderByAndByUserNotReminded(AUserInAServer aUserInAServer, Long reminderId); } diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_description_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_description_en_US.ftl new file mode 100644 index 000000000..43c25c47f --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_description_en_US.ftl @@ -0,0 +1 @@ +Cancels the given reminder. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_long_help_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_long_help_en_US.ftl new file mode 100644 index 000000000..9ca945221 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_long_help_en_US.ftl @@ -0,0 +1 @@ +Cancels the given reminder to not be executed anymore. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_usage_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_usage_en_US.ftl new file mode 100644 index 000000000..d9c043aae --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/commands/utility/unRemind/help/unRemind_usage_en_US.ftl @@ -0,0 +1 @@ +unRemind \ No newline at end of file