From 20f8e422a2a5690f6fdc84f4b46faa941b582afe Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sun, 17 May 2020 23:13:01 +0200 Subject: [PATCH] added commands to create/delete/list usernotes --- .../moderation/commands/DeleteNote.java | 62 +++++++++++++ .../moderation/commands/UserNoteCommand.java | 61 +++++++++++++ .../moderation/commands/UserNotes.java | 90 +++++++++++++++++++ .../converter/UserNotesConverter.java | 39 ++++++++ .../repository/UserNoteRepository.java | 16 ++++ .../UserNoteManagementServiceBean.java | 49 ++++++++++ .../src/main/resources/moderation.properties | 1 + .../user_notes_response_embed_en_US.ftl | 31 +++++++ .../note_not_found_exception_en_US.ftl | 1 + .../config/features/ModerationFeatures.java | 2 +- .../config/features/UserNoteFeature.java | 13 +++ .../moderation/models/database/UserNote.java | 36 ++++++++ .../template/commands/ListNotesModel.java | 17 ++++ .../template/commands/NoteEntryModel.java | 15 ++++ .../management/UserNoteManagementService.java | 15 ++++ .../help/userNotes_description_en_US.ftl | 1 + .../help/userNotes_long_help_en_US.ftl | 1 + .../help/userNotes_parameter_user_en_US.ftl | 1 + .../userNotes/help/userNotes_usage_en_US.ftl | 1 + .../user_notes_embed_title_en_US.ftl | 1 + .../user_notes_embed_user_title_en_US.ftl | 1 + .../userNotes/user_notes_no_notes_en_US.ftl | 1 + .../userNotes/user_notes_note_entry_en_US.ftl | 1 + .../config/userNotes_feature_en_US.ftl | 1 + ...note_not_found_exception_message_en_US.ftl | 1 + .../service/TemplateServiceBean.java | 5 ++ .../templating/service/TemplateService.java | 1 + 27 files changed, 463 insertions(+), 1 deletion(-) create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/converter/UserNotesConverter.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/UserNoteRepository.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementServiceBean.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/command/listNotes/user_notes_response_embed_en_US.ftl create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/exception/note_not_found_exception_en_US.ftl create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/UserNoteFeature.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/UserNote.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/ListNotesModel.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/NoteEntryModel.java create mode 100644 abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementService.java create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_description_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_long_help_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_parameter_user_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_usage_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_title_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_user_title_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_no_notes_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_note_entry_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/config/userNotes_feature_en_US.ftl create mode 100644 abstracto-application/template-config/src/main/resources/templates/en_US/moderation/exception/note_not_found_exception_message_en_US.ftl diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java new file mode 100644 index 000000000..44198b9b7 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/DeleteNote.java @@ -0,0 +1,62 @@ +package dev.sheldan.abstracto.moderation.commands; + +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.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService; +import dev.sheldan.abstracto.templating.service.TemplateService; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class DeleteNote extends AbstractConditionableCommand { + + @Autowired + private UserNoteManagementService userNoteManagementService; + + @Autowired + private TemplateService templateService; + + @Override + public CommandResult execute(CommandContext commandContext) { + Long id = (Long) commandContext.getParameters().getParameters().get(0); + if(userNoteManagementService.noteExists(id)) { + userNoteManagementService.deleteNote(id); + } else { + return CommandResult.fromError(templateService.renderSimpleTemplate("note_not_found_exception")); + } + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("id").type(Long.class).templated(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("deleteNote") + .module(ModerationModule.MODERATION) + .templated(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.USER_NOTES; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java new file mode 100644 index 000000000..2eba4ef46 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNoteCommand.java @@ -0,0 +1,61 @@ +package dev.sheldan.abstracto.moderation.commands; + +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.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class UserNoteCommand extends AbstractConditionableCommand { + + @Autowired + private UserNoteManagementService userNoteManagementService; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + Member member = (Member) parameters.get(0); + String text = (String) parameters.get(1); + AUserInAServer userInAServer = userInServerManagementService.loadUser(member); + userNoteManagementService.createUserNote(userInAServer, text); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + parameters.add(Parameter.builder().name("user").type(Member.class).templated(true).build()); + parameters.add(Parameter.builder().name("text").type(String.class).templated(true).remainder(true).build()); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("userNote") + .module(ModerationModule.MODERATION) + .templated(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.USER_NOTES; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java new file mode 100644 index 000000000..e092a57a3 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/UserNotes.java @@ -0,0 +1,90 @@ +package dev.sheldan.abstracto.moderation.commands; + +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.command.execution.ContextConverter; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import dev.sheldan.abstracto.core.models.FullUser; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.core.service.ChannelService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.moderation.config.ModerationModule; +import dev.sheldan.abstracto.moderation.config.features.ModerationFeatures; +import dev.sheldan.abstracto.moderation.converter.UserNotesConverter; +import dev.sheldan.abstracto.moderation.models.database.UserNote; +import dev.sheldan.abstracto.moderation.models.template.commands.ListNotesModel; +import dev.sheldan.abstracto.moderation.service.management.UserNoteManagementService; +import dev.sheldan.abstracto.templating.service.TemplateService; +import net.dv8tion.jda.api.entities.Member; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class UserNotes extends AbstractConditionableCommand { + @Autowired + private UserNoteManagementService userNoteManagementService; + + @Autowired + private TemplateService templateService; + + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Autowired + private ChannelService channelService; + + @Autowired + private UserNotesConverter userNotesConverter; + + @Override + public CommandResult execute(CommandContext commandContext) { + List parameters = commandContext.getParameters().getParameters(); + List userNotes; + + ListNotesModel model = (ListNotesModel) ContextConverter.fromCommandContext(commandContext, ListNotesModel.class); + if(parameters.size() == 1) { + Member member = (Member) parameters.get(0); + AUserInAServer userInAServer = userInServerManagementService.loadUser(member); + userNotes = userNoteManagementService.loadNotesForUser(userInAServer); + FullUser specifiedUser = FullUser + .builder() + .aUserInAServer(userInAServer) + .member(member) + .build(); + model.setSpecifiedUser(specifiedUser); + } else { + userNotes = userNoteManagementService.loadNotesForServer(commandContext.getUserInitiatedContext().getServer()); + } + model.setUserNotes(userNotesConverter.fromNotes(userNotes)); + channelService.sendTemplateInChannel("user_notes_response", model, commandContext.getChannel()); + return CommandResult.fromSuccess(); + } + + @Override + public CommandConfiguration getConfiguration() { + List parameters = new ArrayList<>(); + Parameter user = Parameter.builder().name("user").type(Member.class).optional(true).templated(true).build(); + parameters.add(user); + HelpInfo helpInfo = HelpInfo.builder().templated(true).build(); + return CommandConfiguration.builder() + .name("userNotes") + .module(ModerationModule.MODERATION) + .templated(true) + .causesReaction(true) + .parameters(parameters) + .help(helpInfo) + .build(); + } + + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.USER_NOTES; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/converter/UserNotesConverter.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/converter/UserNotesConverter.java new file mode 100644 index 000000000..c45848b6a --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/converter/UserNotesConverter.java @@ -0,0 +1,39 @@ +package dev.sheldan.abstracto.moderation.converter; + +import dev.sheldan.abstracto.core.models.FullUser; +import dev.sheldan.abstracto.core.service.BotService; +import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; +import dev.sheldan.abstracto.moderation.models.database.UserNote; +import dev.sheldan.abstracto.moderation.models.template.commands.NoteEntryModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class UserNotesConverter { + @Autowired + private UserInServerManagementService userInServerManagementService; + + @Autowired + private BotService botService; + + public List fromNotes(List userNotes){ + List entryModels = new ArrayList<>(); + userNotes.forEach(userNote -> { + FullUser fullUser = FullUser + .builder() + .member(botService.getMemberInServer(userNote.getUser())) + .aUserInAServer(userNote.getUser()) + .build(); + NoteEntryModel entryModel = NoteEntryModel + .builder() + .fullUser(fullUser) + .note(userNote) + .build(); + entryModels.add(entryModel); + }); + return entryModels; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/UserNoteRepository.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/UserNoteRepository.java new file mode 100644 index 000000000..24063e2f7 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/repository/UserNoteRepository.java @@ -0,0 +1,16 @@ +package dev.sheldan.abstracto.moderation.repository; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.moderation.models.database.UserNote; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface UserNoteRepository extends JpaRepository { + List findByUser(AUserInAServer aUserInAServer); + List findByUser_ServerReference(AServer server); + +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementServiceBean.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementServiceBean.java new file mode 100644 index 000000000..89080fd57 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementServiceBean.java @@ -0,0 +1,49 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.moderation.models.database.UserNote; +import dev.sheldan.abstracto.moderation.repository.UserNoteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class UserNoteManagementServiceBean implements UserNoteManagementService { + + @Autowired + private UserNoteRepository userNoteRepository; + + + @Override + public UserNote createUserNote(AUserInAServer aUserInAServer, String note) { + UserNote newNote = UserNote + .builder() + .note(note) + .user(aUserInAServer) + .build(); + userNoteRepository.save(newNote); + return newNote; + } + + @Override + public void deleteNote(Long id) { + userNoteRepository.deleteById(id); + } + + @Override + public boolean noteExists(Long id) { + return userNoteRepository.existsById(id); + } + + @Override + public List loadNotesForUser(AUserInAServer aUserInAServer) { + return userNoteRepository.findByUser(aUserInAServer); + } + + @Override + public List loadNotesForServer(AServer server) { + return userNoteRepository.findByUser_ServerReference(server); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties index d3cf60d8a..0aa0b8aae 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/moderation.properties @@ -4,6 +4,7 @@ abstracto.features.warnings.enabled=false abstracto.features.warnDecay.enabled=false abstracto.features.logging.enabled=false abstracto.features.muting.enabled=false +abstracto.features.userNotes.enabled=false abstracto.warnings.warnDecay.days=90 abstracto.scheduling.jobs.unMuteJob.name=unMuteJob diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/command/listNotes/user_notes_response_embed_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/command/listNotes/user_notes_response_embed_en_US.ftl new file mode 100644 index 000000000..44e5c5687 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/command/listNotes/user_notes_response_embed_en_US.ftl @@ -0,0 +1,31 @@ +{ + "author": { + <#if specifiedUser??> + "name": "${specifiedUser.member.effectiveName}", + "avatar": "${specifiedUser.member.user.effectiveAvatarUrl}" + <#else> + "name": "${member.effectiveName}", + "avatar": "${member.user.effectiveAvatarUrl}" + + }, + "title": { + <#if specifiedUser??> + <#assign user>${specifiedUser.member.effectiveName} + "title": "<#include "user_notes_embed_user_title">" + <#else> + "title": "<#include "user_notes_embed_title">" + + }, + "color" : { + "r": 200, + "g": 0, + "b": 255 + }, + "description": "<#list userNotes as note> + <#assign user>${note.fullUser.member.asMention} + <#assign noteText>${note.note.note} + <#assign noteId>${note.note.id} + <#assign date>${formatInstant(note.note.created, "yyyy-MM-dd HH:mm:ss")} + <#include "user_notes_note_entry"><#else><#include "user_notes_no_notes"> + " +} \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/exception/note_not_found_exception_en_US.ftl b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/exception/note_not_found_exception_en_US.ftl new file mode 100644 index 000000000..49b8d5501 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/resources/templates/exception/note_not_found_exception_en_US.ftl @@ -0,0 +1 @@ +<#include "note_not_found_exception_message"> \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java index fa8d43ee4..012742ada 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/ModerationFeatures.java @@ -5,7 +5,7 @@ import lombok.Getter; @Getter public enum ModerationFeatures implements FeatureEnum { - MODERATION("moderation"), WARNING("warnings"), LOGGING("logging"), MUTING("muting"), AUTOMATIC_WARN_DECAY("warnDecay"); + MODERATION("moderation"), WARNING("warnings"), LOGGING("logging"), MUTING("muting"), AUTOMATIC_WARN_DECAY("warnDecay"), USER_NOTES("userNotes"); private String key; diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/UserNoteFeature.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/UserNoteFeature.java new file mode 100644 index 000000000..0a9b5ebec --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/config/features/UserNoteFeature.java @@ -0,0 +1,13 @@ +package dev.sheldan.abstracto.moderation.config.features; + +import dev.sheldan.abstracto.core.config.FeatureConfig; +import dev.sheldan.abstracto.core.config.FeatureEnum; +import org.springframework.stereotype.Component; + +@Component +public class UserNoteFeature implements FeatureConfig { + @Override + public FeatureEnum getFeature() { + return ModerationFeatures.USER_NOTES; + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/UserNote.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/UserNote.java new file mode 100644 index 000000000..a448c5eba --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/database/UserNote.java @@ -0,0 +1,36 @@ +package dev.sheldan.abstracto.moderation.models.database; + +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import lombok.*; + +import javax.persistence.*; +import java.time.Instant; + +@Entity +@Table(name="user_notes") +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class UserNote { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "noteUser", nullable = false) + private AUserInAServer user; + + @Column(length = 2000) + private String note; + + @Column(name = "created") + private Instant created; + + @PrePersist + private void onInsert() { + this.created = Instant.now(); + } +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/ListNotesModel.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/ListNotesModel.java new file mode 100644 index 000000000..d20b10230 --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/ListNotesModel.java @@ -0,0 +1,17 @@ +package dev.sheldan.abstracto.moderation.models.template.commands; + +import dev.sheldan.abstracto.core.models.FullUser; +import dev.sheldan.abstracto.core.models.context.UserInitiatedServerContext; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@SuperBuilder +@Getter +@Setter +public class ListNotesModel extends UserInitiatedServerContext { + private List userNotes; + private FullUser specifiedUser; +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/NoteEntryModel.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/NoteEntryModel.java new file mode 100644 index 000000000..799c5013c --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/models/template/commands/NoteEntryModel.java @@ -0,0 +1,15 @@ +package dev.sheldan.abstracto.moderation.models.template.commands; + +import dev.sheldan.abstracto.core.models.FullUser; +import dev.sheldan.abstracto.moderation.models.database.UserNote; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Builder +public class NoteEntryModel { + private UserNote note; + private FullUser fullUser; +} diff --git a/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementService.java b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementService.java new file mode 100644 index 000000000..bad48b1fc --- /dev/null +++ b/abstracto-application/abstracto-modules/moderation/moderation-int/src/main/java/dev/sheldan/abstracto/moderation/service/management/UserNoteManagementService.java @@ -0,0 +1,15 @@ +package dev.sheldan.abstracto.moderation.service.management; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.models.database.AUserInAServer; +import dev.sheldan.abstracto.moderation.models.database.UserNote; + +import java.util.List; + +public interface UserNoteManagementService { + UserNote createUserNote(AUserInAServer aUserInAServer, String note); + void deleteNote(Long id); + boolean noteExists(Long id); + List loadNotesForUser(AUserInAServer aUserInAServer); + List loadNotesForServer(AServer server); +} diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_description_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_description_en_US.ftl new file mode 100644 index 000000000..a4a192c3d --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_description_en_US.ftl @@ -0,0 +1 @@ +Shows all user notes/user notes from a user \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_long_help_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_long_help_en_US.ftl new file mode 100644 index 000000000..ecd0fe4bf --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_long_help_en_US.ftl @@ -0,0 +1 @@ +Lists all the user notes or only the user notes from a singular user from this server. The output contains the text of the note, the date it was created and the id of the user note. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_parameter_user_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_parameter_user_en_US.ftl new file mode 100644 index 000000000..263f95ea1 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_parameter_user_en_US.ftl @@ -0,0 +1 @@ +The user to retrieve the user notes for. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_usage_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_usage_en_US.ftl new file mode 100644 index 000000000..2e1da2937 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/help/userNotes_usage_en_US.ftl @@ -0,0 +1 @@ +listNotes [user] \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_title_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_title_en_US.ftl new file mode 100644 index 000000000..02cf87df0 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_title_en_US.ftl @@ -0,0 +1 @@ +User notes on this server \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_user_title_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_user_title_en_US.ftl new file mode 100644 index 000000000..ec7158f3e --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_embed_user_title_en_US.ftl @@ -0,0 +1 @@ +User notes for user ${user} \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_no_notes_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_no_notes_en_US.ftl new file mode 100644 index 000000000..87ef1f6c9 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_no_notes_en_US.ftl @@ -0,0 +1 @@ +No notes. \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_note_entry_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_note_entry_en_US.ftl new file mode 100644 index 000000000..7b99561b0 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/commands/userNotes/user_notes_note_entry_en_US.ftl @@ -0,0 +1 @@ +${user} has note ${noteId} with text ${noteText} on ${date} \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/config/userNotes_feature_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/config/userNotes_feature_en_US.ftl new file mode 100644 index 000000000..a5ceba109 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/config/userNotes_feature_en_US.ftl @@ -0,0 +1 @@ +User notes \ No newline at end of file diff --git a/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/exception/note_not_found_exception_message_en_US.ftl b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/exception/note_not_found_exception_message_en_US.ftl new file mode 100644 index 000000000..87dbdf3d6 --- /dev/null +++ b/abstracto-application/template-config/src/main/resources/templates/en_US/moderation/exception/note_not_found_exception_message_en_US.ftl @@ -0,0 +1 @@ +Note not found. \ No newline at end of file diff --git a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java index 5937a293e..9422588ce 100644 --- a/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java +++ b/abstracto-application/templating/templating-impl/src/main/java/dev/sheldan/abstracto/templating/service/TemplateServiceBean.java @@ -169,6 +169,11 @@ public class TemplateServiceBean implements TemplateService { } } + @Override + public String renderSimpleTemplate(String key) { + return renderTemplate(key, new Object()); + } + @Override public String renderTemplatable(Templatable templatable) { return renderTemplate(templatable.getTemplateName(), templatable.getTemplateModel()); diff --git a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/service/TemplateService.java b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/service/TemplateService.java index bcbebe4cc..1fbd82419 100644 --- a/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/service/TemplateService.java +++ b/abstracto-application/templating/templating-interface/src/main/java/dev/sheldan/abstracto/templating/service/TemplateService.java @@ -33,6 +33,7 @@ public interface TemplateService { * @return The template rendered as string. */ String renderTemplate(String key, Object model); + String renderSimpleTemplate(String key); String renderTemplatable(Templatable templatable); }