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 40707b1b..671cd584 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 @@ -3,16 +3,13 @@ package nu.marginalia.control; import com.google.gson.Gson; import com.google.inject.Inject; import nu.marginalia.client.ServiceMonitors; -import nu.marginalia.control.model.Actor; +import nu.marginalia.control.actor.Actor; import nu.marginalia.control.model.DomainComplaintModel; -import nu.marginalia.control.model.MessageQueueEntry; import nu.marginalia.control.svc.*; import nu.marginalia.db.storage.model.FileStorageId; import nu.marginalia.db.storage.model.FileStorageType; import nu.marginalia.model.EdgeDomain; import nu.marginalia.model.gson.GsonFactory; -import nu.marginalia.mq.MqMessageState; -import nu.marginalia.mq.persistence.MqPersistence; import nu.marginalia.renderer.RendererFactory; import nu.marginalia.service.server.*; import org.eclipse.jetty.util.StringUtil; @@ -27,7 +24,6 @@ import java.sql.SQLException; import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; public class ControlService extends Service { @@ -42,7 +38,7 @@ public class ControlService extends Service { private final DomainComplaintService domainComplaintService; private final ControlActorService controlActorService; private final StaticResources staticResources; - private final MessageQueueViewService messageQueueViewService; + private final MessageQueueService messageQueueService; private final ControlFileStorageService controlFileStorageService; @@ -54,12 +50,11 @@ public class ControlService extends Service { RendererFactory rendererFactory, ControlActorService controlActorService, StaticResources staticResources, - MessageQueueViewService messageQueueViewService, + MessageQueueService messageQueueService, ControlFileStorageService controlFileStorageService, ApiKeyService apiKeyService, DomainComplaintService domainComplaintService, - ControlActionsService controlActionsService, - MqPersistence persistence + ControlActionsService controlActionsService ) throws IOException { super(params); @@ -94,7 +89,7 @@ public class ControlService extends Service { this.controlActorService = controlActorService; this.staticResources = staticResources; - this.messageQueueViewService = messageQueueViewService; + this.messageQueueService = messageQueueService; this.controlFileStorageService = controlFileStorageService; Spark.get("/public/heartbeats", (req, res) -> { @@ -107,7 +102,6 @@ public class ControlService extends Service { Spark.get("/public/actions", (rq,rsp) -> new Object() , actionsViewRenderer::render); Spark.get("/public/services", this::servicesModel, servicesRenderer::render); Spark.get("/public/services/:id", this::serviceModel, serviceByIdRenderer::render); - Spark.get("/public/messages/:id", this::existingMessageModel, gson::toJson); Spark.get("/public/actors", this::processesModel, actorsRenderer::render); Spark.get("/public/actors/:fsm", this::actorDetailsModel, actorDetailsRenderer::render); @@ -125,37 +119,13 @@ public class ControlService extends Service { // Message Queue - Spark.get("/public/message-queue", this::messageQueueModel, messageQueueRenderer::render); - Spark.post("/public/message-queue/", (rq, rsp) -> { - String recipient = rq.queryParams("recipientInbox"); - String sender = rq.queryParams("senderInbox"); - String relatedMessage = rq.queryParams("relatedId"); - String function = rq.queryParams("function"); - String payload = rq.queryParams("payload"); - - persistence.sendNewMessage(recipient, - sender.isBlank() ? null : sender, - relatedMessage == null ? null : Long.parseLong(relatedMessage), - function, - payload, - null); - - 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) -> { - MqMessageState state = MqMessageState.valueOf(rq.queryParams("state")); - long id = Long.parseLong(rq.params("id")); - persistence.updateMessageState(id, state); - return ""; - }, redirectToMessageQueue); + Spark.get("/public/message-queue", messageQueueService::listMessageQueueModel, messageQueueRenderer::render); + Spark.post("/public/message-queue/", messageQueueService::createMessage, redirectToMessageQueue); + Spark.get("/public/message-queue/new", messageQueueService::newMessageModel, newMessageRenderer::render); + Spark.get("/public/message-queue/:id", messageQueueService::viewMessageModel, viewMessageRenderer::render); + Spark.get("/public/message-queue/:id/reply", messageQueueService::replyMessageModel, newMessageRenderer::render); + Spark.get("/public/message-queue/:id/edit", messageQueueService::viewMessageForEditStateModel, updateMessageStateRenderer::render); + Spark.post("/public/message-queue/:id/edit", messageQueueService::editMessageState, redirectToMessageQueue); // Storage Spark.get("/public/storage", this::storageModel, storageRenderer::render); @@ -211,42 +181,6 @@ public class ControlService extends Service { ); } - private Object messageQueueModel(Request request, Response response) { - String inboxParam = request.queryParams("inbox"); - String instanceParam = request.queryParams("instance"); - String afterParam = request.queryParams("after"); - - long afterId = Optional.ofNullable(afterParam).map(Long::parseLong).orElse(Long.MAX_VALUE); - - 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 { - entries = messageQueueViewService.getEntries(afterId, 20); - } - - Object next; - - if (entries.size() == 20) - next = entries.stream().mapToLong(MessageQueueEntry::id).min().getAsLong(); - else - next = ""; - - Object prev = afterParam == null ? "" : afterParam; - - return Map.of("messages", entries, - "next", next, - "prev", prev, - "mqFilter", mqFilter); - } private Object complaintsModel(Request request, Response response) { Map> complaintsByReviewed = @@ -325,46 +259,12 @@ public class ControlService extends Service { } - private Object existingMessageModel(Request request, Response response) { - var message = messageQueueViewService.getMessage(Long.parseLong(request.params("id"))); - if (message != null) { - response.type("application/json"); - return message; - } - else { - response.status(404); - return ""; - } - } - - private Object newMessageModel(Request request, Response response) { - String idParam = request.queryParams("id"); - if (null == idParam) - return Map.of("relatedId", "-1"); - - var message = messageQueueViewService.getMessage(Long.parseLong(idParam)); - if (message != null) - return message; - - return Map.of("relatedId", "-1"); - } - private Object replyMessageModel(Request request, Response response) { - String idParam = request.params("id"); - - var message = messageQueueViewService.getMessage(Long.parseLong(idParam)); - - return Map.of("relatedId", message.id(), - "recipientInbox", message.senderInbox(), - "function", "REPLY"); - } - - private Object serviceModel(Request request, Response response) { String serviceName = request.params("id"); return Map.of( "id", serviceName, - "messages", messageQueueViewService.getEntriesForInbox(serviceName, Long.MAX_VALUE, 20), + "messages", messageQueueService.getEntriesForInbox(serviceName, Long.MAX_VALUE, 20), "events", eventLogService.getLastEntriesForService(serviceName, 20)); } @@ -396,7 +296,7 @@ public class ControlService extends Service { return Map.of("processes", processes, "jobs", jobs, "actors", controlActorService.getActorStates(), - "messages", messageQueueViewService.getLastEntries(20)); + "messages", messageQueueService.getLastEntries(20)); } private Object actorDetailsModel(Request request, Response response) { final Actor actor = Actor.valueOf(request.params("fsm").toUpperCase()); @@ -405,7 +305,7 @@ public class ControlService extends Service { return Map.of( "actor", actor, "state-graph", controlActorService.getActorStateGraph(actor), - "messages", messageQueueViewService.getLastEntriesForInbox(inbox, 20)); + "messages", messageQueueService.getLastEntriesForInbox(inbox, 20)); } private Object serveStatic(Request request, Response response) { String resource = request.params("resource"); diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/HtmlRedirect.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/HtmlRedirect.java index fd49bd6d..ff1e2368 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/HtmlRedirect.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/HtmlRedirect.java @@ -5,6 +5,9 @@ import spark.ResponseTransformer; public class HtmlRedirect implements ResponseTransformer { private final String html; + /** Because Spark doesn't have a redirect method that works with relative URLs + * (without explicitly providing the external address),we use HTML and let the + * browser resolve the relative redirect instead */ public HtmlRedirect(String destination) { this.html = """ diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/Actor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/Actor.java similarity index 91% rename from code/services-core/control-service/src/main/java/nu/marginalia/control/model/Actor.java rename to code/services-core/control-service/src/main/java/nu/marginalia/control/actor/Actor.java index cc761073..d9002e18 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/Actor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/Actor.java @@ -1,4 +1,4 @@ -package nu.marginalia.control.model; +package nu.marginalia.control.actor; public enum Actor { CRAWL, diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/ControlActors.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/ControlActors.java index 74dd3090..37cd9e9c 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/ControlActors.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/ControlActors.java @@ -5,7 +5,6 @@ import com.google.inject.Inject; import com.google.inject.Singleton; import lombok.SneakyThrows; import nu.marginalia.control.actor.task.*; -import nu.marginalia.control.model.Actor; import nu.marginalia.control.actor.monitor.*; import nu.marginalia.control.actor.monitor.ConverterMonitorActor; import nu.marginalia.control.actor.monitor.LoaderMonitorActor; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/AbstractProcessSpawnerActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/AbstractProcessSpawnerActor.java index 9ac07516..92bbc1d6 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/AbstractProcessSpawnerActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/AbstractProcessSpawnerActor.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.monitor; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mq.MqMessageState; import nu.marginalia.mq.persistence.MqPersistence; import nu.marginalia.mqsm.StateFactory; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ConverterMonitorActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ConverterMonitorActor.java index b1f37067..158b48ca 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ConverterMonitorActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ConverterMonitorActor.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.monitor; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mqapi.ProcessInboxNames; import nu.marginalia.mq.persistence.MqPersistence; import nu.marginalia.mqsm.StateFactory; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/CrawlerMonitorActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/CrawlerMonitorActor.java index f50f7b73..cc9c73fb 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/CrawlerMonitorActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/CrawlerMonitorActor.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.monitor; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mq.persistence.MqPersistence; import nu.marginalia.mqapi.ProcessInboxNames; import nu.marginalia.mqsm.StateFactory; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/LoaderMonitorActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/LoaderMonitorActor.java index 3b959356..fcf3b895 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/LoaderMonitorActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/LoaderMonitorActor.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.monitor; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mqapi.ProcessInboxNames; import nu.marginalia.mq.persistence.MqPersistence; import nu.marginalia.mqsm.StateFactory; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ProcessLivenessMonitorActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ProcessLivenessMonitorActor.java index 1098a085..4128f6f9 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ProcessLivenessMonitorActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/monitor/ProcessLivenessMonitorActor.java @@ -2,10 +2,9 @@ package nu.marginalia.control.actor.monitor; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.model.ProcessHeartbeat; import nu.marginalia.control.model.ServiceHeartbeat; import nu.marginalia.control.svc.HeartbeatService; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mqsm.StateFactory; import nu.marginalia.mqsm.graph.AbstractStateGraph; import nu.marginalia.mqsm.graph.GraphState; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ActorProcessWatcher.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ActorProcessWatcher.java index e82168f4..d6c33608 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ActorProcessWatcher.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ActorProcessWatcher.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.task; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mq.MqMessage; import nu.marginalia.mq.outbox.MqOutbox; import nu.marginalia.mqsm.graph.ControlFlowException; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ConvertActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ConvertActor.java index f2bb0c6b..0bcc5293 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ConvertActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ConvertActor.java @@ -6,8 +6,8 @@ import com.google.inject.Singleton; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; -import nu.marginalia.control.svc.ProcessOutboxes; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessOutboxes; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.db.storage.FileStorageService; import nu.marginalia.db.storage.model.FileStorageBaseType; import nu.marginalia.db.storage.model.FileStorageId; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlActor.java index 48ebbc79..40f447c1 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlActor.java @@ -6,8 +6,8 @@ import com.google.inject.Singleton; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; -import nu.marginalia.control.svc.ProcessOutboxes; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessOutboxes; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.db.storage.FileStorageService; import nu.marginalia.db.storage.model.FileStorageBaseType; import nu.marginalia.db.storage.model.FileStorageId; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlJobExtractorActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlJobExtractorActor.java index 621e06e1..9cadc49a 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlJobExtractorActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/CrawlJobExtractorActor.java @@ -3,7 +3,7 @@ package nu.marginalia.control.actor.task; import com.google.inject.Inject; import com.google.inject.Singleton; import nu.marginalia.control.svc.ControlFileStorageService; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.db.storage.FileStorageService; import nu.marginalia.db.storage.model.FileStorage; import nu.marginalia.db.storage.model.FileStorageBaseType; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ReconvertAndLoadActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ReconvertAndLoadActor.java index a7589439..06c982ff 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ReconvertAndLoadActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/ReconvertAndLoadActor.java @@ -6,8 +6,8 @@ import com.google.inject.Singleton; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; -import nu.marginalia.control.svc.ProcessOutboxes; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessOutboxes; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.index.client.IndexClient; import nu.marginalia.index.client.IndexMqEndpoints; import nu.marginalia.mqapi.converting.ConvertAction; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/RecrawlActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/RecrawlActor.java index 9311cead..c4253a0d 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/RecrawlActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/RecrawlActor.java @@ -6,8 +6,8 @@ import com.google.inject.Singleton; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import lombok.With; -import nu.marginalia.control.svc.ProcessOutboxes; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessOutboxes; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.db.storage.FileStorageService; import nu.marginalia.db.storage.model.FileStorage; import nu.marginalia.db.storage.model.FileStorageId; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/TriggerAdjacencyCalculationActor.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/TriggerAdjacencyCalculationActor.java index 367140fa..7441b437 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/TriggerAdjacencyCalculationActor.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/actor/task/TriggerAdjacencyCalculationActor.java @@ -2,7 +2,7 @@ package nu.marginalia.control.actor.task; import com.google.inject.Inject; import com.google.inject.Singleton; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; import nu.marginalia.mqsm.StateFactory; import nu.marginalia.mqsm.graph.AbstractStateGraph; import nu.marginalia.mqsm.graph.GraphState; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/ProcessHeartbeat.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/model/ProcessHeartbeat.java index f3f43e76..accb3351 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/model/ProcessHeartbeat.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/model/ProcessHeartbeat.java @@ -1,6 +1,6 @@ package nu.marginalia.control.model; -import nu.marginalia.control.svc.ProcessService; +import nu.marginalia.control.process.ProcessService; public record ProcessHeartbeat( String processId, diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessOutboxes.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessOutboxes.java similarity index 97% rename from code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessOutboxes.java rename to code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessOutboxes.java index a8699ab9..b5b74406 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessOutboxes.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessOutboxes.java @@ -1,4 +1,4 @@ -package nu.marginalia.control.svc; +package nu.marginalia.control.process; import com.google.inject.Inject; import com.google.inject.Singleton; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessService.java similarity index 99% rename from code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessService.java rename to code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessService.java index cea64c9f..25583f43 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ProcessService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/process/ProcessService.java @@ -1,4 +1,4 @@ -package nu.marginalia.control.svc; +package nu.marginalia.control.process; import com.google.inject.name.Named; import nu.marginalia.service.control.ServiceEventLog; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActionsService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActionsService.java index 5eaf03c2..4425ac52 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActionsService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActionsService.java @@ -3,7 +3,7 @@ package nu.marginalia.control.svc; import com.google.inject.Inject; import com.google.inject.Singleton; import nu.marginalia.control.actor.ControlActors; -import nu.marginalia.control.model.Actor; +import nu.marginalia.control.actor.Actor; import nu.marginalia.index.client.IndexClient; import nu.marginalia.index.client.IndexMqEndpoints; import nu.marginalia.mq.MessageQueueFactory; diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActorService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActorService.java index 51b3739c..ddfbbe58 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActorService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/svc/ControlActorService.java @@ -6,7 +6,7 @@ import nu.marginalia.control.actor.ControlActors; import nu.marginalia.control.actor.task.CrawlJobExtractorActor; import nu.marginalia.control.actor.task.ReconvertAndLoadActor; import nu.marginalia.control.actor.task.RecrawlActor; -import nu.marginalia.control.model.Actor; +import nu.marginalia.control.actor.Actor; import nu.marginalia.control.model.ActorRunState; import nu.marginalia.control.model.ActorStateGraph; import nu.marginalia.db.storage.model.FileStorageId; 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/MessageQueueService.java similarity index 67% rename from code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueViewService.java rename to code/services-core/control-service/src/main/java/nu/marginalia/control/svc/MessageQueueService.java index 02031c2a..1d74a5bf 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/MessageQueueService.java @@ -3,23 +3,123 @@ package nu.marginalia.control.svc; import com.google.inject.Inject; import com.google.inject.Singleton; import com.zaxxer.hikari.HikariDataSource; -import nu.marginalia.control.model.Actor; import nu.marginalia.control.model.MessageQueueEntry; -import nu.marginalia.mqsm.graph.AbstractStateGraph; +import nu.marginalia.mq.MqMessageState; +import nu.marginalia.mq.persistence.MqPersistence; +import spark.Request; +import spark.Response; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Optional; @Singleton -public class MessageQueueViewService { +public class MessageQueueService { private final HikariDataSource dataSource; + private final MqPersistence persistence; @Inject - public MessageQueueViewService(HikariDataSource dataSource) { + public MessageQueueService(HikariDataSource dataSource, MqPersistence persistence) { this.dataSource = dataSource; + this.persistence = persistence; + } + + + public Object viewMessageModel(Request request, Response response) { + return Map.of("message", getMessage(Long.parseLong(request.params("id"))), + "relatedMessages", getRelatedMessages(Long.parseLong(request.params("id")))); + } + + + public Object listMessageQueueModel(Request request, Response response) { + String inboxParam = request.queryParams("inbox"); + String instanceParam = request.queryParams("instance"); + String afterParam = request.queryParams("after"); + + long afterId = Optional.ofNullable(afterParam).map(Long::parseLong).orElse(Long.MAX_VALUE); + + List entries; + + String mqFilter = "filter=none"; + if (inboxParam != null) { + mqFilter = "inbox=" + inboxParam; + entries = getEntriesForInbox(inboxParam, afterId, 20); + } + else if (instanceParam != null) { + mqFilter = "instance=" + instanceParam; + entries = getEntriesForInstance(instanceParam, afterId, 20); + } + else { + entries = getEntries(afterId, 20); + } + + Object next; + + if (entries.size() == 20) + next = entries.stream().mapToLong(MessageQueueEntry::id).min().getAsLong(); + else + next = ""; + + Object prev = afterParam == null ? "" : afterParam; + + return Map.of("messages", entries, + "next", next, + "prev", prev, + "mqFilter", mqFilter); + } + + public Object newMessageModel(Request request, Response response) { + String idParam = request.queryParams("id"); + if (null == idParam) + return Map.of("relatedId", "-1"); + + var message = getMessage(Long.parseLong(idParam)); + if (message != null) + return message; + + return Map.of("relatedId", "-1"); + } + + public Object replyMessageModel(Request request, Response response) { + String idParam = request.params("id"); + + var message = getMessage(Long.parseLong(idParam)); + + return Map.of("relatedId", message.id(), + "recipientInbox", message.senderInbox(), + "function", "REPLY"); + } + + public Object createMessage(Request request, Response response) throws Exception { + String recipient = request.queryParams("recipientInbox"); + String sender = request.queryParams("senderInbox"); + String relatedMessage = request.queryParams("relatedId"); + String function = request.queryParams("function"); + String payload = request.queryParams("payload"); + + persistence.sendNewMessage(recipient, + sender.isBlank() ? null : sender, + relatedMessage == null ? null : Long.parseLong(relatedMessage), + function, + payload, + null); + + return ""; + } + + public Object viewMessageForEditStateModel(Request request, Response response) throws SQLException { + return persistence.getMessage(Long.parseLong(request.params("id"))); + } + + public Object editMessageState(Request request, Response response) throws SQLException { + MqMessageState state = MqMessageState.valueOf(request.queryParams("state")); + long id = Long.parseLong(request.params("id")); + persistence.updateMessageState(id, state); + return ""; } public List getLastEntries(int n) { @@ -43,7 +143,6 @@ public class MessageQueueViewService { throw new RuntimeException(ex); } } - public MessageQueueEntry getMessage(long id) { try (var conn = dataSource.getConnection(); var query = conn.prepareStatement(""" @@ -115,6 +214,7 @@ public class MessageQueueViewService { throw new RuntimeException(ex); } } + public List getEntriesForInstance(String instance, long afterId, int n) { try (var conn = dataSource.getConnection(); var query = conn.prepareStatement("""