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;