From c39366960f2cebb6809e1456bc4330eb08532e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brage=20Skj=C3=B8nborg?= Date: Sat, 31 Jan 2026 12:52:35 +0100 Subject: [PATCH] Allowing continue --- .../controller/SequencesController.kt | 38 +++++++++++++++++-- .../coordinator/dto/translate/ApiResponse.kt | 6 +++ .../coordinator/services/EventService.kt | 2 +- .../shared/database/stores/EventStore.kt | 16 +++++++- 4 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/dto/translate/ApiResponse.kt diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/controller/SequencesController.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/controller/SequencesController.kt index d32798d0..fb07e981 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/controller/SequencesController.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/controller/SequencesController.kt @@ -1,11 +1,13 @@ package no.iktdev.mediaprocessing.coordinator.controller +import no.iktdev.mediaprocessing.coordinator.dto.translate.ApiResponse import no.iktdev.mediaprocessing.coordinator.services.SequenceAggregatorService import no.iktdev.mediaprocessing.shared.common.dto.SequenceSummary -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RequestParam -import org.springframework.web.bind.annotation.RestController +import no.iktdev.mediaprocessing.shared.database.stores.EventStore +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.* +import java.util.* @RestController @RequestMapping("/sequences") @@ -24,4 +26,32 @@ class SequenceController( ): List { return aggregator.getRecentSequences(limit) } + + @PostMapping("/{referenceId}/continue") + fun continueSequence( + @PathVariable referenceId: UUID + ): ResponseEntity { + return try { + + val id = EventStore.createManuallyContinueEvent(referenceId) + + ResponseEntity.ok( + ApiResponse( + ok = true, + message = "Sequence continued, event $id created!" + ) + ) + + } catch (ex: Exception) { + ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + ApiResponse( + ok = false, + message = ex.message ?: "Unknown error" + ) + ) + } + } + } diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/dto/translate/ApiResponse.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/dto/translate/ApiResponse.kt new file mode 100644 index 00000000..6dedc749 --- /dev/null +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/dto/translate/ApiResponse.kt @@ -0,0 +1,6 @@ +package no.iktdev.mediaprocessing.coordinator.dto.translate + +data class ApiResponse( + val ok: Boolean, + val message: String +) diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt index 3281cba2..081fd140 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/EventService.kt @@ -52,7 +52,7 @@ class EventService { } fun createForcedTaskResetAuditEvent(referenceId: UUID, taskId: UUID): UUID? { - return EventStore.createTaskResetAudioEvent(referenceId, taskId) + return EventStore.createTaskResetAuditEvent(referenceId, taskId) } fun getEffectiveHistory(referenceId: UUID): List { diff --git a/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt b/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt index 6e86d3ba..af5534fa 100644 --- a/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt +++ b/shared/database/src/main/kotlin/no/iktdev/mediaprocessing/shared/database/stores/EventStore.kt @@ -12,6 +12,7 @@ import no.iktdev.mediaprocessing.shared.common.dto.Paginated import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.CompletedEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.DeletedTaskResultEvent import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ForcedTaskResetAuditEvent +import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.ManualAllowCompletionEvent import no.iktdev.mediaprocessing.shared.common.getName import no.iktdev.mediaprocessing.shared.database.likeAny import no.iktdev.mediaprocessing.shared.database.queries.pagedQuery @@ -126,13 +127,26 @@ object EventStore: EventStore { return null } - fun createTaskResetAudioEvent(referenceId: UUID, taskId: UUID): UUID { + fun createTaskResetAuditEvent(referenceId: UUID, taskId: UUID): UUID { val auditEvent = ForcedTaskResetAuditEvent(taskId) .usingReferenceId(referenceId) persist(auditEvent) return auditEvent.eventId } + fun createManuallyContinueEvent(referenceId: UUID): UUID? { + return try { + val continueEvent = ManualAllowCompletionEvent().apply { + usingReferenceId(referenceId) + } + persist(continueEvent) + return continueEvent.eventId + } catch (e: Exception) { + e.printStackTrace() + null + } + } + fun eventsLast(minutes: Long = 1): Long { val cutoff = Instant.now().minus(minutes, ChronoUnit.MINUTES) return withTransaction {