From 6a423365cd61ef3d3796058bea2226148c907b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brage=20Skj=C3=B8nborg?= Date: Fri, 30 Jan 2026 14:39:37 +0100 Subject: [PATCH] Projection + aggregation change --- .../listeners/events/MigrateCreateStoreTaskListener.kt | 2 +- .../coordinator/services/SequenceAggregatorService.kt | 6 ++++++ .../shared/common/dto/SequenceSummary.kt | 6 ++++++ .../shared/common/projection/CollectProjection.kt | 10 +++++++--- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MigrateCreateStoreTaskListener.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MigrateCreateStoreTaskListener.kt index f013c961..2ca45446 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MigrateCreateStoreTaskListener.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/listeners/events/MigrateCreateStoreTaskListener.kt @@ -66,7 +66,7 @@ class MigrateCreateStoreTaskListener( ).derivedOf(event) - if (!collectProjection.canStoreAutomatically()) { + if (!collectProjection.isStorePermitted()) { log.info { "Not storing content and metadata automatically for collection: $collection @ ${useEvent.referenceId}" } log.info { "A manual allow completion event is required to proceed." } return null diff --git a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/SequenceAggregatorService.kt b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/SequenceAggregatorService.kt index 60cd54b0..4012770b 100644 --- a/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/SequenceAggregatorService.kt +++ b/apps/coordinator/src/main/kotlin/no/iktdev/mediaprocessing/coordinator/services/SequenceAggregatorService.kt @@ -2,6 +2,7 @@ package no.iktdev.mediaprocessing.coordinator.services import no.iktdev.eventi.ZDS.toEvent import no.iktdev.eventi.models.store.PersistedEvent +import no.iktdev.mediaprocessing.shared.common.dto.CurrentState import no.iktdev.mediaprocessing.shared.common.dto.Mode import no.iktdev.mediaprocessing.shared.common.dto.SequenceSummary import no.iktdev.mediaprocessing.shared.common.event_task_contract.events.CollectedEvent @@ -46,6 +47,10 @@ class SequenceAggregatorService() { val projection = CollectProjection(domainEvents) + val state = if (events.any { it.event == CollectedEvent::class.java.simpleName }) { + if (projection.isStorePermitted()) CurrentState.Continuing else CurrentState.OnHold + } else CurrentState.Continuing + return SequenceSummary( referenceId = last.referenceId.toString(), title = "", @@ -62,6 +67,7 @@ class SequenceAggregatorService() { StartFlow.Manual -> Mode.Manual else -> Mode.Auto }, + currentState = state, hasErrors = projection.getTaskStatus().any { it == CollectProjection.TaskStatus.Failed } ) } diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/dto/SequenceSummary.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/dto/SequenceSummary.kt index 20e04514..7e6c6618 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/dto/SequenceSummary.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/dto/SequenceSummary.kt @@ -16,6 +16,7 @@ data class SequenceSummary( val convertTaskStatus: CollectProjection.TaskStatus, val coverDownloadTaskStatus: CollectProjection.TaskStatus, val mode: Mode, + val currentState: CurrentState, val hasErrors: Boolean, ) @@ -27,4 +28,9 @@ enum class ContextType { enum class Mode { Auto, Manual +} + +enum class CurrentState { + Continuing, + OnHold } \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/projection/CollectProjection.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/projection/CollectProjection.kt index 41115e00..615ea114 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/projection/CollectProjection.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/projection/CollectProjection.kt @@ -41,9 +41,13 @@ class CollectProjection(val events: List) { coverDownloadTaskStatus ) - fun canStoreAutomatically(): Boolean { - val manualEvent = events.filterIsInstance().lastOrNull() - return manualEvent?.data?.flow != StartFlow.Manual + fun isStorePermitted(): Boolean { + val isAuto = events.filterIsInstance().lastOrNull()?.data?.flow == StartFlow.Auto + if (isAuto) { + return true + } + val anyAllow = events.filterIsInstance().lastOrNull() + return anyAllow != null } private fun projectUseFile(): File? {