diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala index b25f959740..7d7eee04f5 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala @@ -24,7 +24,6 @@ import dsp.errors.BadRequestException import dsp.errors.OntologyConstraintException import dsp.errors.ValidationException import dsp.valueobjects.Iri -import dsp.valueobjects.RestrictedViewSize import dsp.valueobjects.V2 import org.knora.webapi.IRI import org.knora.webapi.core.RelayedMessage @@ -33,11 +32,12 @@ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.slice.admin.api.Codecs.ZioJsonCodec.restrictedViewSize import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectCreateRequest import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectUpdateRequest import org.knora.webapi.slice.admin.domain.model.KnoraProject.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.admin.domain.model.User - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Messages diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala index fa69008cbc..62708af4b8 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala @@ -12,7 +12,6 @@ import java.util.UUID import dsp.errors.* import dsp.valueobjects.Iri -import dsp.valueobjects.RestrictedViewSize import dsp.valueobjects.V2 import org.knora.webapi.* import org.knora.webapi.config.AppConfig @@ -39,6 +38,7 @@ import org.knora.webapi.slice.admin.AdminConstants import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectCreateRequest import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectUpdateRequest import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.admin.domain.model.UserIri import org.knora.webapi.slice.admin.domain.service.ProjectADMService diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/Codecs.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/Codecs.scala index 113ded782a..786f1d7285 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/Codecs.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/Codecs.scala @@ -12,6 +12,7 @@ import zio.json.JsonCodec import dsp.valueobjects.V2 import org.knora.webapi.slice.admin.api.model.MaintenanceRequests.AssetId import org.knora.webapi.slice.admin.domain.model.KnoraProject.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.admin.domain.model.UserIri import org.knora.webapi.slice.common.Value.BooleanValue import org.knora.webapi.slice.common.Value.StringValue @@ -65,6 +66,7 @@ object Codecs { implicit val logo: StringCodec[Logo] = stringCodec(Logo.from) implicit val longname: StringCodec[Longname] = stringCodec(Longname.from) implicit val projectIri: StringCodec[ProjectIri] = stringCodec(ProjectIri.from) + implicit val restrictedViewSize: JsonCodec[RestrictedViewSize] = stringCodec(RestrictedViewSize.from) implicit val selfJoin: StringCodec[SelfJoin] = booleanCodec(SelfJoin.from) implicit val shortcode: StringCodec[Shortcode] = stringCodec(Shortcode.from) implicit val shortname: StringCodec[Shortname] = stringCodec(Shortname.from) diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/model/ProjectsEndpointsRequests.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/model/ProjectsEndpointsRequests.scala index c83c76fb78..1c8565d634 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/model/ProjectsEndpointsRequests.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/model/ProjectsEndpointsRequests.scala @@ -10,6 +10,7 @@ import zio.json.JsonCodec import org.knora.webapi.slice.admin.api.Codecs.ZioJsonCodec.* import org.knora.webapi.slice.admin.domain.model.KnoraProject.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize object ProjectsEndpointsRequests { @@ -41,7 +42,7 @@ object ProjectsEndpointsRequests { implicit val codec: JsonCodec[ProjectUpdateRequest] = DeriveJsonCodec.gen[ProjectUpdateRequest] } - final case class ProjectSetRestrictedViewSizeRequest(size: String) + final case class ProjectSetRestrictedViewSizeRequest(size: RestrictedViewSize) object ProjectSetRestrictedViewSizeRequest { implicit val codec: JsonCodec[ProjectSetRestrictedViewSizeRequest] = DeriveJsonCodec.gen[ProjectSetRestrictedViewSizeRequest] diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala index 0d8e59b5ab..3dc208f628 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala @@ -10,7 +10,6 @@ import zio.macros.accessible import dsp.errors.BadRequestException import dsp.errors.NotFoundException -import dsp.valueobjects.RestrictedViewSize import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.admin.responder.projectsmessages.* import org.knora.webapi.responders.admin.ProjectsResponderADM @@ -276,14 +275,13 @@ final case class ProjectsADMRestServiceLive( override def updateProjectRestrictedViewSettings( id: ProjectIdentifierADM, user: User, - setSizeReq: ProjectSetRestrictedViewSizeRequest + req: ProjectSetRestrictedViewSizeRequest ): Task[ProjectRestrictedViewSizeResponseADM] = for { - size <- ZIO.fromEither(RestrictedViewSize.make(setSizeReq.size)).mapError(BadRequestException(_)) project <- projectRepo.findById(id).someOrFail(NotFoundException(s"Project '${getId(id)}' not found.")) _ <- permissionService.ensureSystemAdminOrProjectAdmin(user, project) - _ <- projectRepo.setProjectRestrictedViewSize(project, size) - } yield ProjectRestrictedViewSizeResponseADM(size) + _ <- projectRepo.setProjectRestrictedViewSize(project, req.size) + } yield ProjectRestrictedViewSizeResponseADM(req.size) override def exportProject(shortcodeStr: String, user: User): Task[Unit] = convertStringToShortcodeId(shortcodeStr).flatMap(exportProject(_, user)) diff --git a/webapi/src/main/scala/dsp/valueobjects/RestrictedViewSize.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/model/RestrictedViewSize.scala similarity index 72% rename from webapi/src/main/scala/dsp/valueobjects/RestrictedViewSize.scala rename to webapi/src/main/scala/org/knora/webapi/slice/admin/domain/model/RestrictedViewSize.scala index 19061a828d..deaf97a6b3 100644 --- a/webapi/src/main/scala/dsp/valueobjects/RestrictedViewSize.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/model/RestrictedViewSize.scala @@ -3,19 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -package dsp.valueobjects - -import zio.json.JsonCodec +package org.knora.webapi.slice.admin.domain.model import scala.util.matching.Regex +import org.knora.webapi.slice.common.StringValueCompanion +import org.knora.webapi.slice.common.Value.StringValue + /** * RestrictedViewSize value object. */ -sealed abstract case class RestrictedViewSize private (value: String) +case class RestrictedViewSize private (value: String) extends StringValue -object RestrictedViewSize { - def make(value: String): Either[String, RestrictedViewSize] = { +object RestrictedViewSize extends StringValueCompanion[RestrictedViewSize] { + def default: RestrictedViewSize = new RestrictedViewSize("!512,512") {} + def from(value: String): Either[String, RestrictedViewSize] = { val trimmed: String = value.trim // matches strings "pct:1-100" val percentagePattern: Regex = "pct:[1-9][0-9]?0?$".r @@ -32,13 +34,6 @@ object RestrictedViewSize { else Left(ErrorMessages.RestrictedViewSizeInvalid(value)) } - def unsafeFrom(value: String): RestrictedViewSize = - make(value).fold(s => throw new IllegalArgumentException(s), identity) - - def default: RestrictedViewSize = new RestrictedViewSize("!512,512") {} - - implicit val codec: JsonCodec[RestrictedViewSize] = - JsonCodec[String].transformOrFail(RestrictedViewSize.make, _.value) } object ErrorMessages { diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectRepo.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectRepo.scala index 20bccf1617..e83bc507f5 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectRepo.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectRepo.scala @@ -6,11 +6,11 @@ package org.knora.webapi.slice.admin.domain.service import zio.Task -import dsp.valueobjects.RestrictedViewSize import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.common.repo.service.Repository trait KnoraProjectRepo extends Repository[KnoraProject, ProjectIri] { diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectADMService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectADMService.scala index cd387dce51..6e779ea380 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectADMService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectADMService.scala @@ -7,7 +7,6 @@ package org.knora.webapi.slice.admin.domain.service import zio.* -import dsp.valueobjects.RestrictedViewSize import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM @@ -15,6 +14,7 @@ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectKeyword import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsKeywordsGetResponseADM import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.ontology.domain.service.OntologyRepo import org.knora.webapi.slice.resourceinfo.domain.InternalIri diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/service/KnoraProjectRepoLive.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/service/KnoraProjectRepoLive.scala index b4bfb36749..61abdfcb52 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/service/KnoraProjectRepoLive.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/service/KnoraProjectRepoLive.scala @@ -8,7 +8,6 @@ package org.knora.webapi.slice.admin.repo.service import play.twirl.api.TxtFormat import zio.* -import dsp.valueobjects.RestrictedViewSize import dsp.valueobjects.V2 import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.* import org.knora.webapi.messages.StringFormatter @@ -21,6 +20,7 @@ import org.knora.webapi.messages.store.triplestoremessages.SubjectV2 import org.knora.webapi.messages.twirl.queries.sparql import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper import org.knora.webapi.slice.resourceinfo.domain.InternalIri diff --git a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/admin/setProjectRestrictedViewSettings.scala.txt b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/admin/setProjectRestrictedViewSettings.scala.txt index dbeb097783..d2670e1344 100644 --- a/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/admin/setProjectRestrictedViewSettings.scala.txt +++ b/webapi/src/main/twirl/org/knora/webapi/messages/twirl/queries/sparql/admin/setProjectRestrictedViewSettings.scala.txt @@ -4,7 +4,7 @@ *@ @import org.knora.webapi.IRI -@import dsp.valueobjects.RestrictedViewSize +@import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize @* * Sets project restricted view settings. diff --git a/webapi/src/test/scala/dsp/valueobjects/RestrictedViewSizeSpec.scala b/webapi/src/test/scala/dsp/valueobjects/RestrictedViewSizeSpec.scala index b4062ab940..492d13c8c9 100644 --- a/webapi/src/test/scala/dsp/valueobjects/RestrictedViewSizeSpec.scala +++ b/webapi/src/test/scala/dsp/valueobjects/RestrictedViewSizeSpec.scala @@ -8,8 +8,10 @@ package dsp.valueobjects import zio.Scope import zio.test.* +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize + /** - * This spec is used to test the [[dsp.valueobjects.RestrictedViewSize]] value object creation. + * This spec is used to test the [[RestrictedViewSize]] value object creation. */ object RestrictedViewSizeSpec extends ZIOSpecDefault { @@ -18,31 +20,31 @@ object RestrictedViewSizeSpec extends ZIOSpecDefault { val gen = Gen.int(1, 100) check(gen) { int => val param = s"pct:$int" - assertTrue(RestrictedViewSize.make(param).map(_.value) == Right(param)) + assertTrue(RestrictedViewSize.from(param).map(_.value) == Right(param)) } }, test("should succeed on passing the same x y dimensions") { val gen = Gen.int(1, 1000) check(gen) { integer => val param = s"!$integer,$integer" - assertTrue(RestrictedViewSize.make(param).map(_.value) == Right(param)) + assertTrue(RestrictedViewSize.from(param).map(_.value) == Right(param)) } }, test("should fail on passing negative x y dimensions") { val gen = Gen.int(-1000, -1) check(gen) { integer => val param = s"!$integer,$integer" - assertTrue(RestrictedViewSize.make(param).map(_.value) == Left(ErrorMessages.RestrictedViewSizeInvalid(param))) + assertTrue(RestrictedViewSize.from(param).map(_.value) == Left(s"Invalid RestrictedViewSize: $param")) } }, test("should fail on passing incorrect values") { val gen = Gen.fromIterable(Seq("!512,100", "pct:-1", "pct:0", "pct:101")) check(gen) { param => - assertTrue(RestrictedViewSize.make(param) == Left(ErrorMessages.RestrictedViewSizeInvalid(param))) + assertTrue(RestrictedViewSize.from(param) == Left(s"Invalid RestrictedViewSize: $param")) } }, test("should fail on passing empty value") { - assertTrue(RestrictedViewSize.make("") == Left(ErrorMessages.RestrictedViewSizeMissing)) + assertTrue(RestrictedViewSize.from("") == Left("RestrictedViewSize cannot be empty.")) } ) } diff --git a/webapi/src/test/scala/org/knora/webapi/slice/admin/domain/repo/KnoraProjectRepoInMemory.scala b/webapi/src/test/scala/org/knora/webapi/slice/admin/domain/repo/KnoraProjectRepoInMemory.scala index ec4e2cca3e..d3a083d12b 100644 --- a/webapi/src/test/scala/org/knora/webapi/slice/admin/domain/repo/KnoraProjectRepoInMemory.scala +++ b/webapi/src/test/scala/org/knora/webapi/slice/admin/domain/repo/KnoraProjectRepoInMemory.scala @@ -10,13 +10,13 @@ import zio.Task import zio.ULayer import zio.ZLayer -import dsp.valueobjects.RestrictedViewSize import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.IriIdentifier import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortnameIdentifier import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri +import org.knora.webapi.slice.admin.domain.model.RestrictedViewSize import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo import org.knora.webapi.slice.common.repo.AbstractInMemoryCrudRepository