From f157b1edd7e24ebc04238f21f1c15a6bbf20c516 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sat, 25 Apr 2026 23:27:22 +0200 Subject: [PATCH] [AB-xxx] refactoring to use a separate updated column for the auto closing wrapping modmail thread actions into a separate transaction --- .../modmail/listener/ModmailAutoCloseListener.java | 4 ++-- .../modmail/service/ModMailThreadServiceBean.java | 14 +++++++++++--- .../ModMailThreadManagementServiceBean.java | 2 ++ .../resources/migrations/1.6.23/collection.xml | 6 ++++++ .../migrations/1.6.23/tables/modmail_thread.xml | 12 ++++++++++++ .../resources/migrations/1.6.23/tables/tables.xml | 6 ++++++ .../resources/migrations/modMail-changeLog.xml | 1 + .../modmail/model/database/ModMailThread.java | 3 +++ 8 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/collection.xml create mode 100644 abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/modmail_thread.xml create mode 100644 abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/tables.xml diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModmailAutoCloseListener.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModmailAutoCloseListener.java index c0667bb69..2e84a48f8 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModmailAutoCloseListener.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/listener/ModmailAutoCloseListener.java @@ -92,8 +92,8 @@ public class ModmailAutoCloseListener implements ModmailThreadActionListener { } private static Instant getTimeStampToConsider(ModMailThread thread) { - if(thread.getUpdated() != null) { - return thread.getUpdated(); + if(thread.getLastUpdated() != null) { + return thread.getLastUpdated(); } return thread.getCreated(); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java index 749f08bc6..38e6a1ef0 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java @@ -53,6 +53,7 @@ import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; @@ -287,26 +288,33 @@ public class ModMailThreadServiceBean implements ModMailThreadService { .serverId(thread.getServer().getId()) .serverUser(ServerUser.fromAUserInAServer(thread.getUser())) .messageCount(thread.getMessages() != null ? thread.getMessages().size() : 0) - .updated(thread.getUpdated()) + .updated(thread.getLastUpdated()) .created(thread.getCreated()) .subscriberCount(thread.getSubscribers() != null ? thread.getSubscribers().size() : 0) .build(); for (ModmailThreadActionListener modmailThreadActionListener : threadActionListeners) { try { log.info("Executing action {} for thread {}.", modmailThreadActionListener.getClass().getSimpleName(), model.getThreadId()); - ModmailThreadActionListener.ModmailThreadActionListenerResult result = modmailThreadActionListener.execute(model); + ModmailThreadActionListener.ModmailThreadActionListenerResult result = + self.executeThreadAction(modmailThreadActionListener, model); if(ModmailThreadActionListener.ModmailThreadActionListenerResult.FINAL == result) { log.info("Listener {} terminated for thread {}.", modmailThreadActionListener.getClass().getSimpleName(), model.getThreadId()); break; } } catch (Exception exception) { - log.error("Action failed to execute.", exception); + log.error("Action failed to execute for thread {}.", thread.getId(), exception); } } }); } + @Transactional(propagation = Propagation.REQUIRES_NEW) + public ModmailThreadActionListener.ModmailThreadActionListenerResult executeThreadAction( + ModmailThreadActionListener modmailThreadActionListener, ModmailThreadActionListenerModel model) { + return modmailThreadActionListener.execute(model); + } + /** * This method is responsible for creating the instance in the database, sending the header in the newly created text channel and forwarding the initial message * by the user (if any), after this is complete, this method executes the method to perform the mod mail notification. diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/management/ModMailThreadManagementServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/management/ModMailThreadManagementServiceBean.java index c01310ed5..90f1500be 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/management/ModMailThreadManagementServiceBean.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/management/ModMailThreadManagementServiceBean.java @@ -116,6 +116,7 @@ public class ModMailThreadManagementServiceBean implements ModMailThreadManageme .user(userInAServer) .server(userInAServer.getServerReference()) .state(ModMailThreadState.INITIAL) + .lastUpdated(Instant.now()) .updated(Instant.now()) .appeal(appeal) .build(); @@ -133,6 +134,7 @@ public class ModMailThreadManagementServiceBean implements ModMailThreadManageme } else { modMailThread.setState(newState); } + modMailThread.setLastUpdated(Instant.now()); modMailThread.setUpdated(Instant.now()); modMailThreadRepository.save(modMailThread); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/collection.xml b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/collection.xml new file mode 100644 index 000000000..39bc28c3c --- /dev/null +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/collection.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/modmail_thread.xml b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/modmail_thread.xml new file mode 100644 index 000000000..c032f2017 --- /dev/null +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/modmail_thread.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/tables.xml b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/tables.xml new file mode 100644 index 000000000..dfe80c149 --- /dev/null +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/1.6.23/tables/tables.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/modMail-changeLog.xml b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/modMail-changeLog.xml index 18a4ff458..ab84cfc84 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/modMail-changeLog.xml +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/resources/migrations/modMail-changeLog.xml @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/database/ModMailThread.java b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/database/ModMailThread.java index c93fb0aef..279779c9e 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/database/ModMailThread.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-int/src/main/java/dev/sheldan/abstracto/modmail/model/database/ModMailThread.java @@ -56,6 +56,9 @@ public class ModMailThread implements Serializable { @Column(name = "updated", insertable = false, updatable = false) private Instant updated; + @Column(name = "last_updated") + private Instant lastUpdated; + @Column(name = "closed") private Instant closed;