diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java index eca19900..2fc8f121 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java @@ -84,8 +84,9 @@ public class ControlService extends Service { var messageQueueRenderer = rendererFactory.renderer("control/message-queue"); var storageDetailsRenderer = rendererFactory.renderer("control/storage-details"); - var updateMessageStateRenderer = rendererFactory.renderer("control/dialog-update-message-state"); + var updateMessageStateRenderer = rendererFactory.renderer("control/update-message-state"); var newMessageRenderer = rendererFactory.renderer("control/new-message"); + var viewMessageRenderer = rendererFactory.renderer("control/view-message"); this.controlActorService = controlActorService; @@ -132,7 +133,7 @@ public class ControlService extends Service { String payload = rq.queryParams("payload"); persistence.sendNewMessage(recipient, - sender, + sender.isBlank() ? null : sender, relatedMessage == null ? null : Long.parseLong(relatedMessage), function, payload, @@ -141,6 +142,11 @@ public class ControlService extends Service { return ""; }, redirectToMessageQueue); Spark.get("/public/message-queue/new", this::newMessageModel, newMessageRenderer::render); + Spark.get("/public/message-queue/:id", + (rq, rsp) -> Map.of("message", messageQueueViewService.getMessage(Long.parseLong(rq.params("id"))), + "relatedMessages", messageQueueViewService.getRelatedMessages(Long.parseLong(rq.params("id")))) + , viewMessageRenderer::render); + Spark.get("/public/message-queue/:id/reply", this::replyMessageModel, newMessageRenderer::render); Spark.get("/public/message-queue/:id/edit", (rq, rsp) -> persistence.getMessage(Long.parseLong(rq.params("id"))), updateMessageStateRenderer::render); Spark.post("/public/message-queue/:id/edit", (rq, rsp) -> { @@ -181,10 +187,13 @@ public class ControlService extends Service { List entries; + String mqFilter = "filter=none"; if (inboxParam != null) { + mqFilter = "inbox=" + inboxParam; entries = messageQueueViewService.getEntriesForInbox(inboxParam, afterId, 20); } else if (instanceParam != null) { + mqFilter = "instance=" + instanceParam; entries = messageQueueViewService.getEntriesForInstance(instanceParam, afterId, 20); } else { @@ -200,7 +209,10 @@ public class ControlService extends Service { Object prev = afterParam == null ? "" : afterParam; - return Map.of("messages", entries, "next", next, "prev", prev); + return Map.of("messages", entries, + "next", next, + "prev", prev, + "mqFilter", mqFilter); } private Object complaintsModel(Request request, Response response) { diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/MessageQueueEntry.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/model/MessageQueueEntry.java index 43c5bf07..c90bda76 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/MessageQueueEntry.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/model/MessageQueueEntry.java @@ -15,6 +15,9 @@ public record MessageQueueEntry ( int ttl ) { + public boolean hasRelatedMessage() { + return relatedId > 0; + } public String ownerInstance() { if (ownerInstanceFull == null) { return ""; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueViewService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueViewService.java index 8f3a45a7..02031c2a 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueViewService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueViewService.java @@ -166,6 +166,37 @@ public class MessageQueueViewService { } } + public List getRelatedMessages(long relatedId) { + try (var conn = dataSource.getConnection(); + var query = conn.prepareStatement(""" + (SELECT ID, RELATED_ID, SENDER_INBOX, RECIPIENT_INBOX, FUNCTION, PAYLOAD, OWNER_INSTANCE, OWNER_TICK, STATE, CREATED_TIME, UPDATED_TIME, TTL + FROM MESSAGE_QUEUE + WHERE RELATED_ID = ? + ORDER BY ID DESC + LIMIT 100) + UNION + (SELECT ID, RELATED_ID, SENDER_INBOX, RECIPIENT_INBOX, FUNCTION, PAYLOAD, OWNER_INSTANCE, OWNER_TICK, STATE, CREATED_TIME, UPDATED_TIME, TTL + FROM MESSAGE_QUEUE + WHERE ID = (SELECT RELATED_ID FROM MESSAGE_QUEUE WHERE ID=?) + ORDER BY ID DESC + LIMIT 100) + """)) { + + query.setLong(1, relatedId); + query.setLong(2, relatedId); + + List entries = new ArrayList<>(100); + var rs = query.executeQuery(); + while (rs.next()) { + entries.add(newEntry(rs)); + } + return entries; + } + catch (SQLException ex) { + throw new RuntimeException(ex); + } + } + private MessageQueueEntry newEntry(ResultSet rs) throws SQLException { return new MessageQueueEntry( rs.getLong("ID"), diff --git a/code/services-core/control-service/src/main/resources/templates/control/dialog-update-message-state.hdb b/code/services-core/control-service/src/main/resources/templates/control/dialog-update-message-state.hdb deleted file mode 100644 index 7acae272..00000000 --- a/code/services-core/control-service/src/main/resources/templates/control/dialog-update-message-state.hdb +++ /dev/null @@ -1,44 +0,0 @@ - - - -Update ID - -{{> control/partials/nav}} -
-

Update Message State

-

Update the of a message in the message queue. This may be useful to prevent an actor -from resuming an action when this is not desirable. Setting an old message to 'NEW' will -erase information about its owner, and inboxes will consider the message new again.

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- - - -
-

Note that while setting a message to NEW or in some instances ACK typically causes an Actor - to act on the message, setting a message in ACK to ERR or DEAD will not stop action, but only - prevent resumption of action. To stop a running actor, use the Actors view and press the toggle.

-
- \ No newline at end of file diff --git a/code/services-core/control-service/src/main/resources/templates/control/new-message.hdb b/code/services-core/control-service/src/main/resources/templates/control/new-message.hdb index 211d690c..91242ba4 100644 --- a/code/services-core/control-service/src/main/resources/templates/control/new-message.hdb +++ b/code/services-core/control-service/src/main/resources/templates/control/new-message.hdb @@ -1,30 +1,43 @@ -Update ID +Message Queue | New Message {{> control/partials/nav}}

Create Message

-
- -
-
- -
-
- -
-
- -
-
- -
-
- - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldValue
+ +
diff --git a/code/services-core/control-service/src/main/resources/templates/control/partials/message-queue-table.hdb b/code/services-core/control-service/src/main/resources/templates/control/partials/message-queue-table.hdb index 6aac4572..d71d0941 100644 --- a/code/services-core/control-service/src/main/resources/templates/control/partials/message-queue-table.hdb +++ b/code/services-core/control-service/src/main/resources/templates/control/partials/message-queue-table.hdb @@ -3,7 +3,6 @@ - @@ -12,16 +11,15 @@ - {{#each messages}} - - + - - + @@ -43,9 +44,9 @@ {{/each}} - diff --git a/code/services-core/control-service/src/main/resources/templates/control/update-message-state.hdb b/code/services-core/control-service/src/main/resources/templates/control/update-message-state.hdb new file mode 100644 index 00000000..7d2a16ee --- /dev/null +++ b/code/services-core/control-service/src/main/resources/templates/control/update-message-state.hdb @@ -0,0 +1,60 @@ + + + +Update ID + +{{> control/partials/nav}} +
+

Update Message State

+

Update the of a message in the message queue. This may be useful to prevent an actor +from resuming an action when this is not desirable. Setting an old message to 'NEW' will +erase information about its owner, and inboxes will consider the message new again.

+
+
Action State
TTL
Msg ID
Related ID
Recipient
Sender
Created
Updated
+ [Add Message]
[Edit] {{stateCode}} {{state}}{{id}}{{id}} {{recipientInbox}} {{function}} @@ -30,11 +28,14 @@ {{createdTime}}
- {{#if senderInbox}}[Reply]{{/if}} - {{ttl}}{{relatedId}} + {{#if hasRelatedMessage}} + {{relatedId}} + {{else}} + {{relatedId}} + {{/if}} + {{senderInbox}} {{payload}} {{ownerTick}}
- {{#if prev}}Prev{{/if}} - {{#if next}}Next{{/if}} + + {{#if prev}}Prev{{/if}} + {{#if next}}Next{{/if}}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldValue
+ +
+ +

Note that while setting a message to NEW or in some instances ACK typically causes an Actor + to act on the message, setting a message in ACK to ERR or DEAD will not stop action, but only + prevent resumption of action. To stop a running actor, use the Actors view and press the toggle.

+ + + \ No newline at end of file diff --git a/code/services-core/control-service/src/main/resources/templates/control/view-message.hdb b/code/services-core/control-service/src/main/resources/templates/control/view-message.hdb new file mode 100644 index 00000000..fb52f440 --- /dev/null +++ b/code/services-core/control-service/src/main/resources/templates/control/view-message.hdb @@ -0,0 +1,57 @@ + + + +Message Queue | New Message + +{{> control/partials/nav}} +
+

View Message {{id}}

+ {{#with message}} + + + + + + + + + + + + +
FieldValueAction
id{{id}}[Copy Message]
recipientInbox{{recipientInbox}}
state{{state}}[Edit State]
senderInbox{{senderInbox}}{{#if senderInbox}}[Reply]{{/if}}
relatedId + {{#if hasRelatedMessage}} + {{relatedId}} + {{else}} + {{relatedId}} + {{/if}} +
function{{function}}
payload + +
Created{{createdTime}}
Updated{{updatedTime}}
+ {{/with}} + + {{#if relatedMessages}} +

Related Messages

+ + + + + + + + + {{#each relatedMessages}} + + + + + + + + {{/each}} +
IDRecipient InboxSender InboxFunctionState
{{id}}{{recipientInbox}}{{senderInbox}}{{function}}{{state}}
+ {{/if}} +
+ + + \ No newline at end of file