diff --git a/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/ScopedValidator.scala b/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/ScopedValidator.scala index 661fff873..4a489b459 100644 --- a/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/ScopedValidator.scala +++ b/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/ScopedValidator.scala @@ -132,6 +132,32 @@ private class ScopedValidator(vocab: CpVocab, val metaVocab: CpmetaVocab) extend .toIndexedSeq .nonEmpty + def compareToPreviousTemporalCoverage(dto: DataObjectDto)(using Envri, DocConn | DobjConn): Try[NotUsed] = + + val newIntervalIncludesPrevious = for + dataDto <- dto.asOptInstanceOf[DataObjectDto] + timeSeries <- dataDto.specificInfo.fold(_ => None, ts => Some(ts)) + newTimeInterval <- timeSeries.acquisitionInterval + autoDeprecateIris = getPropValueHolders(metaVocab.hasName, vf.createLiteral(dto.fileName)) + .collect{case subj if dto.autodeprecateSameFilenameObjects && isCompleted(subj) && !isDeprecated(subj) => subj} + .toIndexedSeq + selectedDeprecateIris = dto.isNextVersionOf.flattenToSeq.iterator.map(prevHash => + vocab.getStaticObject(prevHash)) + .toIndexedSeq + allAquiredByIris = (autoDeprecateIris ++ selectedDeprecateIris).toSet + .flatMap(getSingleUri(_, metaVocab.wasAcquiredBy).result) + previousStarts = allAquiredByIris.flatMap(getSingleInstant(_, metaVocab.prov.startedAtTime).result) + previousStops = allAquiredByIris.flatMap(getSingleInstant(_, metaVocab.prov.endedAtTime).result) + yield + (previousStarts.isEmpty || !newTimeInterval.start.isAfter(previousStarts.min)) + && (previousStops.isEmpty || !newTimeInterval.stop.isBefore(previousStops.max)) + + if newIntervalIncludesPrevious.getOrElse(true) then ok + else userFail("New temporal coverage must include temporal coverage of the objects being deprecated.") + + end compareToPreviousTemporalCoverage + + def growingIsGrowing( dto: ObjectUploadDto, spec: DataObjectSpec, diff --git a/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/UploadValidator.scala b/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/UploadValidator.scala index 14dd69ffb..31288211f 100644 --- a/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/UploadValidator.scala +++ b/src/main/scala/se/lu/nateko/cp/meta/services/upload/validation/UploadValidator.scala @@ -66,6 +66,7 @@ class UploadValidator(servers: DataObjectInstanceServers): _ <- scoped.growingIsGrowing(meta, spec, submConf) _ <- validateActors(meta) _ <- validateTemporalCoverage(meta, spec) + _ <- scoped.compareToPreviousTemporalCoverage(meta) _ <- noProductionProvenanceIfL0(meta, spec) _ <- validateFormatsByFileExt(meta, spec) amended0 <- validateSpatialCoverage(meta)