Skip to content

Commit

Permalink
fix: During resource creation verify required cardinalities based on …
Browse files Browse the repository at this point in the history
…the provided values (DEV-4017) (#3347)" (#3355)
  • Loading branch information
seakayone authored Sep 6, 2024
1 parent 2743cce commit 04a6203
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1938,6 +1938,7 @@ object OwlCardinality extends Enumeration {
def equalsWithoutGuiOrder(that: KnoraCardinalityInfo): Boolean =
that.cardinality == cardinality

def isRequired: Boolean = cardinality.isRequired
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ import org.knora.webapi.slice.admin.domain.service.KnoraGroupRepo
import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo
import org.knora.webapi.slice.admin.domain.service.KnoraUserRepo
import org.knora.webapi.slice.admin.domain.service.ProjectService
import org.knora.webapi.slice.ontology.domain.model.Cardinality.AtLeastOne
import org.knora.webapi.slice.ontology.domain.model.Cardinality.ExactlyOne
import org.knora.webapi.slice.ontology.domain.model.Cardinality.ZeroOrOne
import org.knora.webapi.slice.ontology.domain.service.OntologyRepo
Expand Down Expand Up @@ -341,25 +340,21 @@ final case class CreateResourceV2Handler(
}

// Check that no required values are missing.

requiredProps: Set[SmartIri] = knoraPropertyCardinalities.filter { case (_, cardinalityInfo) =>
cardinalityInfo.cardinality == ExactlyOne || cardinalityInfo.cardinality == AtLeastOne
}.keySet -- resourceClassInfo.linkProperties

internalPropertyIris: Set[SmartIri] = internalCreateResource.values.keySet

_ <- ZIO.when(!requiredProps.subsetOf(internalPropertyIris)) {
val missingProps =
(requiredProps -- internalPropertyIris)
.map(iri => s"<${iri.toOntologySchema(ApiV2Complex)}>")
.mkString(", ")
ZIO.fail(
OntologyConstraintException(
s"${resourceIDForErrorMsg}Values were not submitted for the following property or properties, which are required by resource class <${internalCreateResource.resourceClassIri
.toOntologySchema(ApiV2Complex)}>: $missingProps",
),
)
}
requiredProps = knoraPropertyCardinalities.filter { case (_, cardinality) =>
cardinality.isRequired
}.keySet -- resourceClassInfo.linkProperties
propsWithoutValues =
internalCreateResource.values.collect { case (key, values) if values.nonEmpty => key }.toSet
missingProps = requiredProps -- propsWithoutValues
_ <- ZIO.fail {
val externalResourceClassIri =
s"<${internalCreateResource.resourceClassIri.toOntologySchema(ApiV2Complex)}>"
val externalMissingPropIris =
missingProps.map(iri => s"<${iri.toOntologySchema(ApiV2Complex)}>").mkString(", ")
val msg =
s"${resourceIDForErrorMsg}Values were not submitted for the following property or properties, which are required by resource class $externalResourceClassIri: $externalMissingPropIris"
OntologyConstraintException(msg)
}.when(missingProps.nonEmpty)

// Check that each submitted value is consistent with the knora-base:objectClassConstraint of the property that is supposed to
// point to it.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ sealed trait Cardinality {
lowerBoundIsIncluded && upperBoundIsIncluded
}

/**
* Checks whether for this cardinality a value is required.
*
* @return `true` if the cardinality is required, `false` otherwise.
*/
def isRequired: Boolean = min > 0

/**
* Negated check for [[Cardinality.isIncludedIn(org.knora.webapi.slice.ontology.domain.model.Cardinality)]]
*
Expand Down

0 comments on commit 04a6203

Please sign in to comment.