From dc77ee88d2a1a94e6e7b453274f9366a614e62dc Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:17:11 +0100 Subject: [PATCH 01/16] start replacing spay json with zio json --- .../admin/responder/KnoraResponseADM.scala | 2 ++ .../ProjectsMessagesADM.scala | 13 ++++++++----- .../knora/webapi/routing/RouteUtilADM.scala | 19 ++++++++++++++++++- .../slice/admin/api/ProjectsEndpoints.scala | 6 +++--- .../api/service/ProjectsADMRestService.scala | 2 +- .../common/api/KnoraResponseRenderer.scala | 8 ++++++++ 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala index 949cdad144..44ab56f0bf 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala @@ -13,3 +13,5 @@ import org.knora.webapi.messages.traits.Jsonable trait KnoraResponseADM extends Jsonable trait AdminKnoraResponseADM extends KnoraResponseADM + +trait AdminResponse 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 ee4e6d025d..5aa63e6e7f 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 @@ -14,6 +14,8 @@ import spray.json.RootJsonFormat import sttp.tapir.Codec import sttp.tapir.CodecFormat.TextPlain import sttp.tapir.DecodeResult +import zio.json.DeriveJsonCodec +import zio.json.JsonCodec import zio.prelude.Validation import java.util.UUID @@ -28,6 +30,7 @@ import org.knora.webapi.core.RelayedMessage import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM +import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.ProjectCreateRequest @@ -106,8 +109,10 @@ case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) * * @param project all information about the project. */ -case class ProjectGetResponseADM(project: ProjectADM) extends AdminKnoraResponseADM with ProjectsADMJsonProtocol { - def toJsValue: JsValue = projectResponseADMFormat.write(this) +case class ProjectGetResponseADM(project: ProjectADM) extends AdminResponse +object ProjectGetResponseADM { + implicit val projectCodec: JsonCodec[ProjectADM] = DeriveJsonCodec.gen[ProjectADM] + implicit val codec: JsonCodec[ProjectGetResponseADM] = DeriveJsonCodec.gen[ProjectGetResponseADM] } /** @@ -400,9 +405,7 @@ trait ProjectsADMJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol implicit val projectsResponseADMFormat: RootJsonFormat[ProjectsGetResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectsGetResponseADM, "projects")), ) - implicit val projectResponseADMFormat: RootJsonFormat[ProjectGetResponseADM] = rootFormat( - lazyFormat(jsonFormat(ProjectGetResponseADM, "project")), - ) + implicit val projectRestrictedViewSettingsADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsADM] = jsonFormat(ProjectRestrictedViewSettingsADM, "size", "watermark") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index 30948b22cc..a071130e41 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -23,6 +23,7 @@ import org.knora.webapi.IRI import org.knora.webapi.core.MessageRelay import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.groupsmessages.* import org.knora.webapi.messages.admin.responder.projectsmessages.* @@ -63,7 +64,6 @@ object RouteUtilADM { response match { case ProjectsGetResponseADM(projects) => ProjectsGetResponseADM(projects.map(projectAsExternalRepresentation)) - case ProjectGetResponseADM(project) => ProjectGetResponseADM(projectAsExternalRepresentation(project)) case ProjectMembersGetResponseADM(members) => ProjectMembersGetResponseADM(members.map(userAsExternalRepresentation)) case ProjectAdminMembersGetResponseADM(members) => @@ -90,6 +90,23 @@ object RouteUtilADM { } } + def transformResponseIntoExternalFormat( + response: AdminResponse, + ): ZIO[StringFormatter, Throwable, AdminResponse] = ZIO.serviceWithZIO[StringFormatter] { sf => + ZIO.attempt { + def projectAsExternalRepresentation(project: ProjectADM): ProjectADM = { + val ontologiesExternal = + project.ontologies.map(sf.toSmartIri(_)).map(_.toOntologySchema(ApiV2Complex).toString) + project.copy(ontologies = ontologiesExternal) + } + + response match { + case ProjectGetResponseADM(project) => ProjectGetResponseADM(projectAsExternalRepresentation(project)) + case _ => response + } + } + } + /** * Sends a message to a responder and completes the HTTP request by returning the response as JSON. * diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index 5e0e1b3de6..eba5a9d4f5 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -57,17 +57,17 @@ final case class ProjectsEndpoints( val getAdminProjectsByProjectIri = baseEndpoints.publicEndpoint.get .in(projectsByIri) - .out(sprayJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponseADM]) .description("Returns a single project identified by the IRI.") val getAdminProjectsByProjectShortcode = baseEndpoints.publicEndpoint.get .in(projectsByShortcode) - .out(sprayJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponseADM]) .description("Returns a single project identified by the shortcode.") val getAdminProjectsByProjectShortname = baseEndpoints.publicEndpoint.get .in(projectsByShortname) - .out(sprayJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponseADM]) .description("Returns a single project identified by the shortname.") val getAdminProjectsKeywordsByProjectIri = baseEndpoints.publicEndpoint.get 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 e01e32b9db..2acf621072 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 @@ -111,7 +111,7 @@ final case class ProjectsADMRestServiceLive( */ def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponseADM] = for { internal <- responder.getSingleProjectADMRequest(id) - external <- format.toExternal(internal) + external <- format.toExternalNonSpray(internal) } yield external /** diff --git a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala index 6baafa91b2..7c7249217c 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala @@ -16,6 +16,7 @@ import org.knora.webapi.SchemaRendering import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM +import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.util.rdf.RdfFormat import org.knora.webapi.messages.v2.responder.KnoraResponseV2 import org.knora.webapi.routing.RouteUtilADM @@ -40,6 +41,13 @@ final class KnoraResponseRenderer(config: AppConfig, stringFormatter: StringForm .transformResponseIntoExternalFormat(response) .provide(ZLayer.succeed(stringFormatter)) .mapAttempt(_.asInstanceOf[A]) + + def toExternalNonSpray[A <: AdminResponse](response: A): Task[A] = + RouteUtilADM + .transformResponseIntoExternalFormat(response) + .provide(ZLayer.succeed(stringFormatter)) + .mapAttempt(_.asInstanceOf[A]) + } object KnoraResponseRenderer { From a8ca6b0963596e0ecec4f6e68774e82d1a8b7320 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:18:05 +0100 Subject: [PATCH 02/16] rename --- .../admin/ProjectsResponderADMSpec.scala | 4 ++-- .../responders/v2/OntologyResponderV2Spec.scala | 4 ++-- .../projectsmessages/ProjectsMessagesADM.scala | 10 +++++----- .../messages/util/ConstructResponseUtilV2.scala | 4 ++-- .../resourcemessages/ResourceMessagesV2.scala | 4 ++-- .../responders/admin/ProjectsResponderADM.scala | 14 +++++++------- .../org/knora/webapi/routing/RouteUtilADM.scala | 4 ++-- .../webapi/slice/admin/api/ProjectsEndpoints.scala | 6 +++--- .../admin/api/service/ProjectsADMRestService.scala | 8 ++++---- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala b/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala index 716697509e..ade0620b94 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala @@ -55,7 +55,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { .fromString(SharedTestDataADM.incunabulaProject.id) .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), ) - expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject)) + expectMsg(ProjectGetResponse(SharedTestDataADM.incunabulaProject)) } @@ -65,7 +65,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { .fromString(SharedTestDataADM.incunabulaProject.shortname) .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), ) - expectMsg(ProjectGetResponseADM(SharedTestDataADM.incunabulaProject)) + expectMsg(ProjectGetResponse(SharedTestDataADM.incunabulaProject)) } "return 'NotFoundException' when the project IRI is unknown" in { diff --git a/integration/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala b/integration/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala index 28b5280a5a..6eda6361d4 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/v2/OntologyResponderV2Spec.scala @@ -22,7 +22,7 @@ import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.messages.store.cacheservicemessages.CacheServiceGetProjectADM import org.knora.webapi.messages.store.triplestoremessages.* @@ -163,7 +163,7 @@ class OntologyResponderV2Spec extends CoreSpec with ImplicitSender { "invalidate cached project information when adding an ontology to a project" in { // ernsure that the project is cached appActor ! ProjectGetRequestADM(ProjectIdentifierADM.IriIdentifier.unsafeFrom(imagesProjectIri.toString)) - expectMsgType[ProjectGetResponseADM](timeout) + expectMsgType[ProjectGetResponse](timeout) appActor ! CacheServiceGetProjectADM(ProjectIdentifierADM.IriIdentifier.unsafeFrom(imagesProjectIri.toString)) val cachedProjectBefore = expectMsgType[Option[ProjectADM]](timeout) assert(cachedProjectBefore.isDefined) 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 5aa63e6e7f..a4f804c31c 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 @@ -49,7 +49,7 @@ sealed trait ProjectsResponderRequestADM extends KnoraRequestADM with RelayedMes // Requests /** * Get info about a single project identified either through its IRI, shortname or shortcode. The response is in form - * of [[ProjectGetResponseADM]]. External use. + * of [[ProjectGetResponse]]. External use. * * @param identifier the IRI, email, or username of the project. */ @@ -109,10 +109,10 @@ case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) * * @param project all information about the project. */ -case class ProjectGetResponseADM(project: ProjectADM) extends AdminResponse -object ProjectGetResponseADM { - implicit val projectCodec: JsonCodec[ProjectADM] = DeriveJsonCodec.gen[ProjectADM] - implicit val codec: JsonCodec[ProjectGetResponseADM] = DeriveJsonCodec.gen[ProjectGetResponseADM] +case class ProjectGetResponse(project: ProjectADM) extends AdminResponse +object ProjectGetResponse { + implicit val projectCodec: JsonCodec[ProjectADM] = DeriveJsonCodec.gen[ProjectADM] + implicit val codec: JsonCodec[ProjectGetResponse] = DeriveJsonCodec.gen[ProjectGetResponse] } /** diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala index bb6a982236..6dbe748f6e 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/ConstructResponseUtilV2.scala @@ -23,7 +23,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructResponse.ConstructPredicateObjects import org.knora.webapi.messages.store.triplestoremessages.* @@ -1539,7 +1539,7 @@ final case class ConstructResponseUtilV2Live( for { projectResponse <- messageRelay - .ask[ProjectGetResponseADM]( + .ask[ProjectGetResponse]( ProjectGetRequestADM(identifier = IriIdentifier .fromString(resourceAttachedToProject) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala index 5999ecad84..0222a36970 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/v2/responder/resourcemessages/ResourceMessagesV2.scala @@ -25,7 +25,7 @@ import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.ValuesValidator.xsdDateTimeStampToInstant import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectGetResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.util.PermissionUtilADM.EntityPermission import org.knora.webapi.messages.util.* @@ -713,7 +713,7 @@ object CreateResourceRequestV2 { ) projectId <- IriIdentifier.fromString(projectIri.toString).toZIO.mapError(e => BadRequestException(e.getMessage)) - projectInfoResponse <- MessageRelay.ask[ProjectGetResponseADM](ProjectGetRequestADM(projectId)) + projectInfoResponse <- MessageRelay.ask[ProjectGetResponse](ProjectGetRequestADM(projectId)) _ <- ZIO.attempt(maybeCustomResourceIri.foreach { iri => if (!iri.isKnoraResourceIri) { 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 5e26832e23..08071ac40c 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 @@ -58,14 +58,14 @@ trait ProjectsResponderADM { /** * Gets the project with the given project IRI, shortname, shortcode or UUID and returns the information - * as a [[ProjectGetResponseADM]]. + * as a [[ProjectGetResponse]]. * * @param id the IRI, shortname, shortcode or UUID of the project. - * @return Information about the project as a [[ProjectGetResponseADM]]. + * @return Information about the project as a [[ProjectGetResponse]]. * * [[NotFoundException]] When no project for the given IRI can be found. */ - def getSingleProjectADMRequest(id: ProjectIdentifierADM): Task[ProjectGetResponseADM] + def getSingleProjectADMRequest(id: ProjectIdentifierADM): Task[ProjectGetResponse] /** * Tries to retrieve a [[ProjectADM]] either from triplestore or cache if caching is enabled. @@ -222,18 +222,18 @@ final case class ProjectsResponderADMLive( /** * Gets the project with the given project IRI, shortname, shortcode or UUID and returns the information - * as a [[ProjectGetResponseADM]]. + * as a [[ProjectGetResponse]]. * * @param id the IRI, shortname, shortcode or UUID of the project. - * @return Information about the project as a [[ProjectGetResponseADM]]. + * @return Information about the project as a [[ProjectGetResponse]]. * * [[NotFoundException]] When no project for the given IRI can be found. */ - override def getSingleProjectADMRequest(id: ProjectIdentifierADM): Task[ProjectGetResponseADM] = + override def getSingleProjectADMRequest(id: ProjectIdentifierADM): Task[ProjectGetResponse] = projectService .findByProjectIdentifier(id) .someOrFail(NotFoundException(s"Project '${getId(id)}' not found")) - .map(ProjectGetResponseADM.apply) + .map(ProjectGetResponse.apply) /** * Gets the members of a project with the given IRI, shortname, shortcode or UUID. Returns an empty list diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index a071130e41..caff7113aa 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -101,8 +101,8 @@ object RouteUtilADM { } response match { - case ProjectGetResponseADM(project) => ProjectGetResponseADM(projectAsExternalRepresentation(project)) - case _ => response + case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) + case _ => response } } } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index eba5a9d4f5..1814c72095 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -57,17 +57,17 @@ final case class ProjectsEndpoints( val getAdminProjectsByProjectIri = baseEndpoints.publicEndpoint.get .in(projectsByIri) - .out(zioJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponse]) .description("Returns a single project identified by the IRI.") val getAdminProjectsByProjectShortcode = baseEndpoints.publicEndpoint.get .in(projectsByShortcode) - .out(zioJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponse]) .description("Returns a single project identified by the shortcode.") val getAdminProjectsByProjectShortname = baseEndpoints.publicEndpoint.get .in(projectsByShortname) - .out(zioJsonBody[ProjectGetResponseADM]) + .out(zioJsonBody[ProjectGetResponse]) .description("Returns a single project identified by the shortname.") val getAdminProjectsKeywordsByProjectIri = baseEndpoints.publicEndpoint.get 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 2acf621072..d1dc9d7ff3 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 @@ -36,7 +36,7 @@ trait ProjectADMRestService { def listAllProjects(): Task[ProjectsGetResponseADM] - def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponseADM] + def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponse] def createProject(createReq: ProjectCreateRequest, user: User): Task[ProjectOperationResponseADM] @@ -101,15 +101,15 @@ final case class ProjectsADMRestServiceLive( } yield external /** - * Finds the project by its [[ProjectIdentifierADM]] and returns the information as a [[ProjectGetResponseADM]]. + * Finds the project by its [[ProjectIdentifierADM]] and returns the information as a [[ProjectGetResponse]]. * * @param id a [[ProjectIdentifierADM]] instance * @return - * '''success''': information about the project as a [[ProjectGetResponseADM]] + * '''success''': information about the project as a [[ProjectGetResponse]] * * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given [[ProjectIdentifierADM]] can be found */ - def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponseADM] = for { + def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponse] = for { internal <- responder.getSingleProjectADMRequest(id) external <- format.toExternalNonSpray(internal) } yield external From 36e9502bd27143aa9b4c1b0f7968baab99aba520 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:19:00 +0100 Subject: [PATCH 03/16] rename --- .../admin/api/service/GroupsRestService.scala | 14 ++++++------ .../api/service/PermissionsRestService.scala | 22 +++++++++---------- .../api/service/ProjectsADMRestService.scala | 20 ++++++++--------- .../admin/api/service/UsersRestService.scala | 10 ++++----- .../common/api/KnoraResponseRenderer.scala | 4 ++-- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala index 6fc51e28d9..c514fe44a1 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala @@ -38,7 +38,7 @@ final case class GroupsRestServiceLive( ) extends GroupsRestService { override def getGroups: Task[GroupsGetResponseADM] = for { internal <- responder.groupsGetADM.map(GroupsGetResponseADM) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def getGroupByIri(iri: GroupIri): Task[GroupGetResponseADM] = @@ -47,13 +47,13 @@ final case class GroupsRestServiceLive( .groupGetADM(iri.value) .someOrFail(NotFoundException(s"Group <${iri.value}> not found.")) .map(GroupGetResponseADM.apply) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def getGroupMembers(iri: GroupIri, user: User): Task[GroupMembersGetResponseADM] = for { internal <- responder.groupMembersGetRequest(iri, user) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def postGroup(request: GroupCreateRequest, user: User): Task[GroupGetResponseADM] = @@ -61,7 +61,7 @@ final case class GroupsRestServiceLive( _ <- auth.ensureSystemAdminOrProjectAdmin(user, request.project) uuid <- Random.nextUUID internal <- responder.createGroup(request, uuid) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def putGroup(iri: GroupIri, request: GroupUpdateRequest, user: User): Task[GroupGetResponseADM] = @@ -69,7 +69,7 @@ final case class GroupsRestServiceLive( _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID internal <- responder.updateGroup(iri, request, uuid) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def putGroupStatus(iri: GroupIri, request: GroupStatusUpdateRequest, user: User): Task[GroupGetResponseADM] = @@ -77,7 +77,7 @@ final case class GroupsRestServiceLive( _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID internal <- responder.updateGroupStatus(iri, request, uuid) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external override def deleteGroup(iri: GroupIri, user: User): Task[GroupGetResponseADM] = @@ -85,7 +85,7 @@ final case class GroupsRestServiceLive( _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID internal <- responder.deleteGroup(iri, uuid) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/PermissionsRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/PermissionsRestService.scala index 11493b9642..1712953257 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/PermissionsRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/PermissionsRestService.scala @@ -51,7 +51,7 @@ final case class PermissionsRestService( _ <- ensureProjectIriStrExistsAndUserHasAccess(request.forProject, user) uuid <- Random.nextUUID result <- responder.createAdministrativePermission(request, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext private def ensureProjectIriStrExistsAndUserHasAccess(projectIri: String, user: User): Task[KnoraProject] = @@ -73,14 +73,14 @@ final case class PermissionsRestService( for { _ <- ensureProjectIriExistsAndUserHasAccess(value, user) result <- responder.getPermissionsApByProjectIri(value.value) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def getPermissionsByProjectIri(projectIri: ProjectIri, user: User): Task[PermissionsForProjectGetResponseADM] = for { _ <- ensureProjectIriExistsAndUserHasAccess(projectIri, user) result <- responder.getPermissionsByProjectIri(projectIri) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def deletePermission(permissionIri: PermissionIri, user: User): Task[PermissionDeleteResponseADM] = @@ -88,7 +88,7 @@ final case class PermissionsRestService( _ <- auth.ensureSystemAdmin(user) uuid <- Random.nextUUID result <- responder.deletePermission(permissionIri, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def createDefaultObjectAccessPermission( @@ -99,7 +99,7 @@ final case class PermissionsRestService( _ <- ensureProjectIriStrExistsAndUserHasAccess(request.forProject, user) uuid <- Random.nextUUID result <- responder.createDefaultObjectAccessPermission(request, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def updatePermissionHasPermissions( @@ -114,7 +114,7 @@ final case class PermissionsRestService( .fromOption(NonEmptyChunk.fromIterableOption(request.hasPermissions)) .mapBoth(_ => BadRequestException("hasPermissions must not be empty"), identity) result <- responder.updatePermissionHasPermissions(permissionIri, newHasPermissions, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def updatePermissionProperty( @@ -126,7 +126,7 @@ final case class PermissionsRestService( _ <- auth.ensureSystemAdmin(user) uuid <- Random.nextUUID result <- responder.updatePermissionProperty(permissionIri, request, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def updatePermissionResourceClass( @@ -138,7 +138,7 @@ final case class PermissionsRestService( _ <- auth.ensureSystemAdmin(user) uuid <- Random.nextUUID result <- responder.updatePermissionResourceClass(permissionIri, request, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def updatePermissionGroup( @@ -151,7 +151,7 @@ final case class PermissionsRestService( groupIri <- ZIO.fromEither(GroupIri.from(request.forGroup)).mapError(BadRequestException(_)) uuid <- Random.nextUUID result <- responder.updatePermissionsGroup(permissionIri, groupIri, user, uuid) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def getPermissionsDaopByProjectIri( @@ -161,7 +161,7 @@ final case class PermissionsRestService( for { _ <- ensureProjectIriExistsAndUserHasAccess(projectIri, user) result <- responder.getPermissionsDaopByProjectIri(projectIri) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext def getPermissionsApByProjectAndGroupIri( @@ -172,7 +172,7 @@ final case class PermissionsRestService( for { _ <- ensureProjectIriExistsAndUserHasAccess(projectIri, user) result <- responder.getPermissionsApByProjectAndGroupIri(projectIri.value, groupIri.value) - ext <- format.toExternal(result) + ext <- format.toExternalADM(result) } yield ext } 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 d1dc9d7ff3..80e00ff766 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 @@ -97,7 +97,7 @@ final case class ProjectsADMRestServiceLive( */ def listAllProjects(): Task[ProjectsGetResponseADM] = for { internal <- responder.getNonSystemProjects - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -111,7 +111,7 @@ final case class ProjectsADMRestServiceLive( */ def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponse] = for { internal <- responder.getSingleProjectADMRequest(id) - external <- format.toExternalNonSpray(internal) + external <- format.toExternal(internal) } yield external /** @@ -128,7 +128,7 @@ final case class ProjectsADMRestServiceLive( */ def createProject(createReq: ProjectCreateRequest, user: User): Task[ProjectOperationResponseADM] = for { internal <- ZIO.random.flatMap(_.nextUUID).flatMap(responder.projectCreateRequestADM(createReq, user, _)) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -147,7 +147,7 @@ final case class ProjectsADMRestServiceLive( for { apiId <- Random.nextUUID internal <- responder.changeBasicInformationRequestADM(id.value, updatePayload, user, apiId) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external } @@ -169,7 +169,7 @@ final case class ProjectsADMRestServiceLive( user: User, ): Task[ProjectOperationResponseADM] = for { internal <- Random.nextUUID.flatMap(responder.changeBasicInformationRequestADM(id.value, updateReq, user, _)) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -203,7 +203,7 @@ final case class ProjectsADMRestServiceLive( */ def getProjectMembers(user: User, id: ProjectIdentifierADM): Task[ProjectMembersGetResponseADM] = for { internal <- responder.projectMembersGetRequestADM(id, user) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -222,7 +222,7 @@ final case class ProjectsADMRestServiceLive( id: ProjectIdentifierADM, ): Task[ProjectAdminMembersGetResponseADM] = for { internal <- responder.projectAdminMembersGetRequestADM(id, user) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -235,7 +235,7 @@ final case class ProjectsADMRestServiceLive( */ def listAllKeywords(): Task[ProjectsKeywordsGetResponseADM] = for { internal <- responder.projectsKeywordsGetRequestADM() - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -249,7 +249,7 @@ final case class ProjectsADMRestServiceLive( */ def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponseADM] = for { internal <- responder.projectKeywordsGetRequestADM(iri) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** @@ -264,7 +264,7 @@ final case class ProjectsADMRestServiceLive( def getProjectRestrictedViewSettings(id: ProjectIdentifierADM): Task[ProjectRestrictedViewSettingsGetResponseADM] = for { internal <- responder.projectRestrictedViewSettingsGetRequestADM(id) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external /** diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/UsersRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/UsersRestService.scala index ff7cf3696e..253e4c7418 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/UsersRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/UsersRestService.scala @@ -60,7 +60,7 @@ final case class UsersRestService( .filterOrFail(_.nonEmpty)(NotFoundException("No users found")) .map(_.map(_.filterUserInformation(requestingUser, UserInformationType.Restricted)).sorted) .map(UsersGetResponseADM.apply) - external <- format.toExternal(internal) + external <- format.toExternalADM(internal) } yield external def deleteUser(requestingUser: User, deleteIri: UserIri): Task[UserResponseADM] = for { @@ -83,7 +83,7 @@ final case class UsersRestService( .findUserByIri(userIri) .map(_.map(_.groups).getOrElse(Seq.empty)) .map(UserGroupMembershipsGetResponseADM) - .flatMap(format.toExternal) + .flatMap(format.toExternalADM) def createUser(requestingUser: User, userCreateRequest: Requests.UserCreateRequest): Task[UserResponseADM] = for { @@ -96,7 +96,7 @@ final case class UsersRestService( for { kUser <- getKnoraUserOrNotFound(userIri) projects <- projectService.findByIds(kUser.isInProject) - external <- format.toExternal(UserProjectMembershipsGetResponseADM(projects)) + external <- format.toExternalADM(UserProjectMembershipsGetResponseADM(projects)) } yield external private def getKnoraUserOrNotFound(userIri: UserIri) = @@ -106,7 +106,7 @@ final case class UsersRestService( for { kUser <- getKnoraUserOrNotFound(userIri) projects <- projectService.findByIds(kUser.isInProjectAdminGroup) - external <- format.toExternal(UserProjectAdminMembershipsGetResponseADM(projects)) + external <- format.toExternalADM(UserProjectAdminMembershipsGetResponseADM(projects)) } yield external def getUserByUsername(requestingUser: User, username: Username): Task[UserResponseADM] = for { @@ -218,7 +218,7 @@ final case class UsersRestService( private def asExternalUserResponseADM(requestingUser: User, user: User): Task[UserResponseADM] = { val userFiltered = user.filterUserInformation(requestingUser, UserInformationType.Restricted) - format.toExternal(UserResponseADM(userFiltered)) + format.toExternalADM(UserResponseADM(userFiltered)) } def addUserToProjectAsAdmin( diff --git a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala index 7c7249217c..8961b6825c 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala @@ -36,13 +36,13 @@ final class KnoraResponseRenderer(config: AppConfig, stringFormatter: StringForm * @param response the response that should be transformed * @return the transformed [[AdminKnoraResponseADM]] */ - def toExternal[A <: AdminKnoraResponseADM](response: A): Task[A] = + def toExternalADM[A <: AdminKnoraResponseADM](response: A): Task[A] = RouteUtilADM .transformResponseIntoExternalFormat(response) .provide(ZLayer.succeed(stringFormatter)) .mapAttempt(_.asInstanceOf[A]) - def toExternalNonSpray[A <: AdminResponse](response: A): Task[A] = + def toExternal[A <: AdminResponse](response: A): Task[A] = RouteUtilADM .transformResponseIntoExternalFormat(response) .provide(ZLayer.succeed(stringFormatter)) From 5e143ec7a548bb43f70eb0608ffe2fc36adb58a2 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:26:48 +0100 Subject: [PATCH 04/16] use zio json for getting all projects --- .../ProjectsMessagesADM.scala | 19 +++++++++++-------- .../knora/webapi/routing/RouteUtilADM.scala | 6 +++--- .../slice/admin/api/ProjectsEndpoints.scala | 2 +- .../api/service/ProjectsADMRestService.scala | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) 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 a4f804c31c..ac6021451a 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 @@ -93,15 +93,20 @@ case class ProjectChangeRequestADM( // Responses +object ProjectCodec { + implicit val projectCodec: JsonCodec[ProjectADM] = DeriveJsonCodec.gen[ProjectADM] +} + /** * Represents the Knora API ADM JSON response to a request for information about all projects. * * @param projects information about all existing projects. */ -case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) - extends AdminKnoraResponseADM - with ProjectsADMJsonProtocol { - def toJsValue: JsValue = projectsResponseADMFormat.write(this) +case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) extends AdminResponse +object ProjectsGetResponseADM { + // can be removed as soon as ProjectADM can define its own codec + import ProjectCodec.projectCodec + implicit val codec: JsonCodec[ProjectsGetResponseADM] = DeriveJsonCodec.gen[ProjectsGetResponseADM] } /** @@ -111,7 +116,8 @@ case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) */ case class ProjectGetResponse(project: ProjectADM) extends AdminResponse object ProjectGetResponse { - implicit val projectCodec: JsonCodec[ProjectADM] = DeriveJsonCodec.gen[ProjectADM] + // can be removed as soon as ProjectADM can define its own codec + import ProjectCodec.projectCodec implicit val codec: JsonCodec[ProjectGetResponse] = DeriveJsonCodec.gen[ProjectGetResponse] } @@ -402,9 +408,6 @@ trait ProjectsADMJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol "selfjoin", ), ) - implicit val projectsResponseADMFormat: RootJsonFormat[ProjectsGetResponseADM] = rootFormat( - lazyFormat(jsonFormat(ProjectsGetResponseADM, "projects")), - ) implicit val projectRestrictedViewSettingsADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsADM] = jsonFormat(ProjectRestrictedViewSettingsADM, "size", "watermark") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index caff7113aa..901eefe3db 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -63,7 +63,6 @@ object RouteUtilADM { } response match { - case ProjectsGetResponseADM(projects) => ProjectsGetResponseADM(projects.map(projectAsExternalRepresentation)) case ProjectMembersGetResponseADM(members) => ProjectMembersGetResponseADM(members.map(userAsExternalRepresentation)) case ProjectAdminMembersGetResponseADM(members) => @@ -101,8 +100,9 @@ object RouteUtilADM { } response match { - case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) - case _ => response + case ProjectsGetResponseADM(projects) => ProjectsGetResponseADM(projects.map(projectAsExternalRepresentation)) + case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) + case _ => response } } } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index 1814c72095..ea03e2c279 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -47,7 +47,7 @@ final case class ProjectsEndpoints( val getAdminProjects = baseEndpoints.publicEndpoint.get .in(projectsBase) - .out(sprayJsonBody[ProjectsGetResponseADM]) + .out(zioJsonBody[ProjectsGetResponseADM]) .description("Returns all projects.") val getAdminProjectsKeywords = baseEndpoints.publicEndpoint.get 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 80e00ff766..025f56673d 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 @@ -97,7 +97,7 @@ final case class ProjectsADMRestServiceLive( */ def listAllProjects(): Task[ProjectsGetResponseADM] = for { internal <- responder.getNonSystemProjects - external <- format.toExternalADM(internal) + external <- format.toExternal(internal) } yield external /** From 505ea0eb72618edf86d9a5bab2473c4cdb267a44 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:27:18 +0100 Subject: [PATCH 05/16] rename --- .../responder/projectsmessages/ProjectsMessagesADM.scala | 6 +++--- .../webapi/responders/admin/ProjectsResponderADM.scala | 8 ++++---- .../knora/webapi/slice/admin/api/ProjectsEndpoints.scala | 2 +- .../slice/admin/api/service/ProjectsADMRestService.scala | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) 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 ac6021451a..2dcd12d38b 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 @@ -102,11 +102,11 @@ object ProjectCodec { * * @param projects information about all existing projects. */ -case class ProjectsGetResponseADM(projects: Seq[ProjectADM]) extends AdminResponse -object ProjectsGetResponseADM { +case class ProjectsGetResponse(projects: Seq[ProjectADM]) extends AdminResponse +object ProjectsGetResponse { // can be removed as soon as ProjectADM can define its own codec import ProjectCodec.projectCodec - implicit val codec: JsonCodec[ProjectsGetResponseADM] = DeriveJsonCodec.gen[ProjectsGetResponseADM] + implicit val codec: JsonCodec[ProjectsGetResponse] = DeriveJsonCodec.gen[ProjectsGetResponse] } /** 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 08071ac40c..89526592f3 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 @@ -54,7 +54,7 @@ trait ProjectsResponderADM { * @return all the projects as a [[ProjectADM]]. * [[NotFoundException]] if no projects are found. */ - def getNonSystemProjects: Task[ProjectsGetResponseADM] + def getNonSystemProjects: Task[ProjectsGetResponse] /** * Gets the project with the given project IRI, shortname, shortcode or UUID and returns the information @@ -211,13 +211,13 @@ final case class ProjectsResponderADMLive( * Gets all the projects but not system projects. * Filters out system projects in response. * - * @return all non-system projects as a [[ProjectsGetResponseADM]]. + * @return all non-system projects as a [[ProjectsGetResponse]]. * [[NotFoundException]] if no projects are found. */ - override def getNonSystemProjects: Task[ProjectsGetResponseADM] = + override def getNonSystemProjects: Task[ProjectsGetResponse] = projectService.findAll.map(_.filter(_.id.startsWith("http://rdfh.ch/projects/"))).flatMap { case Nil => ZIO.fail(NotFoundException(s"No projects found")) - case projects => ZIO.succeed(ProjectsGetResponseADM(projects)) + case projects => ZIO.succeed(ProjectsGetResponse(projects)) } /** diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index ea03e2c279..a289843866 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -47,7 +47,7 @@ final case class ProjectsEndpoints( val getAdminProjects = baseEndpoints.publicEndpoint.get .in(projectsBase) - .out(zioJsonBody[ProjectsGetResponseADM]) + .out(zioJsonBody[ProjectsGetResponse]) .description("Returns all projects.") val getAdminProjectsKeywords = baseEndpoints.publicEndpoint.get 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 025f56673d..31ec9148a8 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 @@ -34,7 +34,7 @@ import org.knora.webapi.slice.common.api.KnoraResponseRenderer @accessible trait ProjectADMRestService { - def listAllProjects(): Task[ProjectsGetResponseADM] + def listAllProjects(): Task[ProjectsGetResponse] def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponse] @@ -88,14 +88,14 @@ final case class ProjectsADMRestServiceLive( ) extends ProjectADMRestService { /** - * Returns all projects as a [[ProjectsGetResponseADM]]. + * Returns all projects as a [[ProjectsGetResponse]]. * * @return - * '''success''': information about the projects as a [[ProjectsGetResponseADM]] + * '''success''': information about the projects as a [[ProjectsGetResponse]] * * '''failure''': [[dsp.errors.NotFoundException]] when no project was found */ - def listAllProjects(): Task[ProjectsGetResponseADM] = for { + def listAllProjects(): Task[ProjectsGetResponse] = for { internal <- responder.getNonSystemProjects external <- format.toExternal(internal) } yield external From d51c1013851e602250bdd4286399ecf50116cdd6 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:31:46 +0100 Subject: [PATCH 06/16] continue --- .../projectsmessages/ProjectsMessagesADM.scala | 10 ++++------ .../webapi/responders/admin/ProjectsResponderADM.scala | 8 ++++---- .../scala/org/knora/webapi/routing/RouteUtilADM.scala | 6 +++--- .../webapi/slice/admin/api/ProjectsEndpoints.scala | 2 +- .../admin/api/service/ProjectsADMRestService.scala | 8 ++++---- .../slice/admin/domain/service/ProjectADMService.scala | 6 +++--- 6 files changed, 19 insertions(+), 21 deletions(-) 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 2dcd12d38b..02e03e6f29 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 @@ -148,10 +148,9 @@ case class ProjectAdminMembersGetResponseADM(members: Seq[User]) * * @param keywords a list of keywords. */ -case class ProjectsKeywordsGetResponseADM(keywords: Seq[String]) - extends AdminKnoraResponseADM - with ProjectsADMJsonProtocol { - def toJsValue: JsValue = projectsKeywordsGetResponseADMFormat.write(this) +case class ProjectsKeywordsGetResponse(keywords: Seq[String]) extends AdminResponse +object ProjectsKeywordsGetResponse { + implicit val codec: JsonCodec[ProjectsKeywordsGetResponse] = DeriveJsonCodec.gen[ProjectsKeywordsGetResponse] } /** @@ -418,8 +417,7 @@ trait ProjectsADMJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol implicit val projectMembersGetResponseADMFormat: RootJsonFormat[ProjectMembersGetResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectMembersGetResponseADM, "members")), ) - implicit val projectsKeywordsGetResponseADMFormat: RootJsonFormat[ProjectsKeywordsGetResponseADM] = - jsonFormat(ProjectsKeywordsGetResponseADM, "keywords") + implicit val projectKeywordsGetResponseADMFormat: RootJsonFormat[ProjectKeywordsGetResponseADM] = jsonFormat(ProjectKeywordsGetResponseADM, "keywords") implicit val projectRestrictedViewGetResponseADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsGetResponseADM] = 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 89526592f3..9b2cbc4083 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 @@ -96,9 +96,9 @@ trait ProjectsResponderADM { /** * Gets all unique keywords for all projects and returns them. Returns an empty list if none are found. * - * @return all keywords for all projects as [[ProjectsKeywordsGetResponseADM]] + * @return all keywords for all projects as [[ProjectsKeywordsGetResponse]] */ - def projectsKeywordsGetRequestADM(): Task[ProjectsKeywordsGetResponseADM] + def projectsKeywordsGetRequestADM(): Task[ProjectsKeywordsGetResponse] /** * Gets all keywords for a single project and returns them. Returns an empty list if none are found. @@ -323,9 +323,9 @@ final case class ProjectsResponderADMLive( /** * Gets all unique keywords for all projects and returns them. Returns an empty list if none are found. * - * @return all keywords for all projects as [[ProjectsKeywordsGetResponseADM]] + * @return all keywords for all projects as [[ProjectsKeywordsGetResponse]] */ - override def projectsKeywordsGetRequestADM(): Task[ProjectsKeywordsGetResponseADM] = + override def projectsKeywordsGetRequestADM(): Task[ProjectsKeywordsGetResponse] = projectService.findAllProjectsKeywords /** diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index 901eefe3db..e703fe4935 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -100,9 +100,9 @@ object RouteUtilADM { } response match { - case ProjectsGetResponseADM(projects) => ProjectsGetResponseADM(projects.map(projectAsExternalRepresentation)) - case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) - case _ => response + case ProjectsGetResponse(projects) => ProjectsGetResponse(projects.map(projectAsExternalRepresentation)) + case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) + case _ => response } } } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index a289843866..cd3089a5c0 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -52,7 +52,7 @@ final case class ProjectsEndpoints( val getAdminProjectsKeywords = baseEndpoints.publicEndpoint.get .in(projectsBase / keywords) - .out(sprayJsonBody[ProjectsKeywordsGetResponseADM]) + .out(zioJsonBody[ProjectsKeywordsGetResponse]) .description("Returns all unique keywords for all projects as a list.") val getAdminProjectsByProjectIri = baseEndpoints.publicEndpoint.get 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 31ec9148a8..6f011307ea 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 @@ -64,7 +64,7 @@ trait ProjectADMRestService { def getProjectAdminMembers(user: User, id: ProjectIdentifierADM): Task[ProjectAdminMembersGetResponseADM] - def listAllKeywords(): Task[ProjectsKeywordsGetResponseADM] + def listAllKeywords(): Task[ProjectsKeywordsGetResponse] def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponseADM] @@ -229,13 +229,13 @@ final case class ProjectsADMRestServiceLive( * Returns all keywords of all projects. * * @return - * '''success''': list of all keywords as a [[ProjectsKeywordsGetResponseADM]] + * '''success''': list of all keywords as a [[ProjectsKeywordsGetResponse]] * * '''failure''': [[dsp.errors.NotFoundException]] when no project was found */ - def listAllKeywords(): Task[ProjectsKeywordsGetResponseADM] = for { + def listAllKeywords(): Task[ProjectsKeywordsGetResponse] = for { internal <- responder.projectsKeywordsGetRequestADM() - external <- format.toExternalADM(internal) + external <- format.toExternal(internal) } yield external /** 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 cac2e2778a..c58b9b5397 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 @@ -11,7 +11,7 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectKeywordsGetResponseADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsKeywordsGetResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsKeywordsGetResponse 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.RestrictedView @@ -76,11 +76,11 @@ final case class ProjectADMService( restrictedView, ) - def findAllProjectsKeywords: Task[ProjectsKeywordsGetResponseADM] = + def findAllProjectsKeywords: Task[ProjectsKeywordsGetResponse] = for { projects <- projectRepo.findAll() keywords = projects.flatMap(_.keywords.map(_.value)).distinct.sorted - } yield ProjectsKeywordsGetResponseADM(keywords) + } yield ProjectsKeywordsGetResponse(keywords) def findProjectKeywordsBy(id: ProjectIdentifierADM): Task[Option[ProjectKeywordsGetResponseADM]] = for { From 32685a09f9c8a0e0e78a7133e2e63cd110bdb668 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 17:35:06 +0100 Subject: [PATCH 07/16] continue --- .../projectsmessages/ProjectsMessagesADM.scala | 10 +++------- .../webapi/responders/admin/ProjectsResponderADM.scala | 8 ++++---- .../webapi/slice/admin/api/ProjectsEndpoints.scala | 2 +- .../admin/api/service/ProjectsADMRestService.scala | 8 ++++---- .../slice/admin/domain/service/ProjectADMService.scala | 6 +++--- 5 files changed, 15 insertions(+), 19 deletions(-) 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 02e03e6f29..3a1c7b184b 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 @@ -158,10 +158,9 @@ object ProjectsKeywordsGetResponse { * * @param keywords a list of keywords. */ -case class ProjectKeywordsGetResponseADM(keywords: Seq[String]) - extends AdminKnoraResponseADM - with ProjectsADMJsonProtocol { - def toJsValue: JsValue = projectKeywordsGetResponseADMFormat.write(this) +case class ProjectKeywordsGetResponse(keywords: Seq[String]) extends AdminResponse +object ProjectKeywordsGetResponse { + implicit val codec: JsonCodec[ProjectKeywordsGetResponse] = DeriveJsonCodec.gen[ProjectKeywordsGetResponse] } /** @@ -417,9 +416,6 @@ trait ProjectsADMJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol implicit val projectMembersGetResponseADMFormat: RootJsonFormat[ProjectMembersGetResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectMembersGetResponseADM, "members")), ) - - implicit val projectKeywordsGetResponseADMFormat: RootJsonFormat[ProjectKeywordsGetResponseADM] = - jsonFormat(ProjectKeywordsGetResponseADM, "keywords") implicit val projectRestrictedViewGetResponseADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsGetResponseADM] = jsonFormat(ProjectRestrictedViewSettingsGetResponseADM, "settings") implicit val projectOperationResponseADMFormat: RootJsonFormat[ProjectOperationResponseADM] = rootFormat( 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 9b2cbc4083..f6b1dfb289 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 @@ -104,9 +104,9 @@ trait ProjectsResponderADM { * Gets all keywords for a single project and returns them. Returns an empty list if none are found. * * @param projectIri the IRI of the project. - * @return keywords for a projects as [[ProjectKeywordsGetResponseADM]] + * @return keywords for a projects as [[ProjectKeywordsGetResponse]] */ - def projectKeywordsGetRequestADM(projectIri: ProjectIri): Task[ProjectKeywordsGetResponseADM] + def projectKeywordsGetRequestADM(projectIri: ProjectIri): Task[ProjectKeywordsGetResponse] /** * Get project's restricted view settings. @@ -332,9 +332,9 @@ final case class ProjectsResponderADMLive( * Gets all keywords for a single project and returns them. Returns an empty list if none are found. * * @param projectIri the IRI of the project. - * @return keywords for a projects as [[ProjectKeywordsGetResponseADM]] + * @return keywords for a projects as [[ProjectKeywordsGetResponse]] */ - override def projectKeywordsGetRequestADM(projectIri: ProjectIri): Task[ProjectKeywordsGetResponseADM] = + override def projectKeywordsGetRequestADM(projectIri: ProjectIri): Task[ProjectKeywordsGetResponse] = for { id <- IriIdentifier.fromString(projectIri.value).toZIO.mapError(e => BadRequestException(e.getMessage)) keywords <- projectService diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index cd3089a5c0..883f3a173b 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -72,7 +72,7 @@ final case class ProjectsEndpoints( val getAdminProjectsKeywordsByProjectIri = baseEndpoints.publicEndpoint.get .in(projectsByIri / keywords) - .out(sprayJsonBody[ProjectKeywordsGetResponseADM]) + .out(zioJsonBody[ProjectKeywordsGetResponse]) .description("Returns all keywords for a single project.") val getAdminProjectsByProjectIriRestrictedViewSettings = baseEndpoints.publicEndpoint.get 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 6f011307ea..fecd372460 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 @@ -66,7 +66,7 @@ trait ProjectADMRestService { def listAllKeywords(): Task[ProjectsKeywordsGetResponse] - def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponseADM] + def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponse] def getProjectRestrictedViewSettings(id: ProjectIdentifierADM): Task[ProjectRestrictedViewSettingsGetResponseADM] @@ -243,13 +243,13 @@ final case class ProjectsADMRestServiceLive( * * @param iri the [[ProjectIri]] of the project * @return - * '''success''': ist of all keywords as a [[ProjectKeywordsGetResponseADM]] + * '''success''': ist of all keywords as a [[ProjectKeywordsGetResponse]] * * '''failure''': [[dsp.errors.NotFoundException]] when no project for the given [[ProjectIri]] can be found */ - def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponseADM] = for { + def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponse] = for { internal <- responder.projectKeywordsGetRequestADM(iri) - external <- format.toExternalADM(internal) + external <- format.toExternal(internal) } yield external /** 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 c58b9b5397..e946769479 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 @@ -10,7 +10,7 @@ import zio.* import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectKeywordsGetResponseADM +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectKeywordsGetResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsKeywordsGetResponse import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.* @@ -82,11 +82,11 @@ final case class ProjectADMService( keywords = projects.flatMap(_.keywords.map(_.value)).distinct.sorted } yield ProjectsKeywordsGetResponse(keywords) - def findProjectKeywordsBy(id: ProjectIdentifierADM): Task[Option[ProjectKeywordsGetResponseADM]] = + def findProjectKeywordsBy(id: ProjectIdentifierADM): Task[Option[ProjectKeywordsGetResponse]] = for { projectMaybe <- projectRepo.findById(id) keywordsMaybe = projectMaybe.map(_.keywords.map(_.value)) - result = keywordsMaybe.map(ProjectKeywordsGetResponseADM(_)) + result = keywordsMaybe.map(ProjectKeywordsGetResponse(_)) } yield result def getNamedGraphsForProject(project: KnoraProject): Task[List[InternalIri]] = { From 4b9da145b73e1f0a0fd6fcaf99067331f900c371 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:06:02 +0100 Subject: [PATCH 08/16] continue --- .../ProjectsMessagesADM.scala | 20 ++++++------- .../sipimessages/SipiMessagesADM.scala | 29 +++++-------------- .../admin/ProjectsResponderADM.scala | 2 +- .../slice/admin/api/FilesEndpoints.scala | 5 ++-- .../slice/admin/api/ProjectsEndpoints.scala | 6 ++-- .../api/service/ProjectsADMRestService.scala | 2 +- 6 files changed, 24 insertions(+), 40 deletions(-) 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 3a1c7b184b..39e0b369da 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 @@ -168,10 +168,10 @@ object ProjectKeywordsGetResponse { * * @param settings the restricted view settings. */ -case class ProjectRestrictedViewSettingsGetResponseADM(settings: ProjectRestrictedViewSettingsADM) - extends AdminKnoraResponseADM - with ProjectsADMJsonProtocol { - def toJsValue: JsValue = projectRestrictedViewGetResponseADMFormat.write(this) +case class ProjectRestrictedViewSettingsGetResponseADM(settings: ProjectRestrictedViewSettingsADM) extends AdminResponse +object ProjectRestrictedViewSettingsGetResponseADM { + implicit val codec: JsonCodec[ProjectRestrictedViewSettingsGetResponseADM] = + DeriveJsonCodec.gen[ProjectRestrictedViewSettingsGetResponseADM] } /** @@ -379,7 +379,11 @@ object ProjectIdentifierADM { * @param size the restricted view size. * @param watermark the watermark file. */ -case class ProjectRestrictedViewSettingsADM(size: Option[String], watermark: Boolean) extends ProjectsADMJsonProtocol +case class ProjectRestrictedViewSettingsADM(size: Option[String], watermark: Boolean) +object ProjectRestrictedViewSettingsADM { + implicit val codec: JsonCodec[ProjectRestrictedViewSettingsADM] = + DeriveJsonCodec.gen[ProjectRestrictedViewSettingsADM] +} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // JSON formatting @@ -407,17 +411,13 @@ trait ProjectsADMJsonProtocol extends SprayJsonSupport with DefaultJsonProtocol ), ) - implicit val projectRestrictedViewSettingsADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsADM] = - jsonFormat(ProjectRestrictedViewSettingsADM, "size", "watermark") - implicit val projectAdminMembersGetResponseADMFormat: RootJsonFormat[ProjectAdminMembersGetResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectAdminMembersGetResponseADM, "members")), ) implicit val projectMembersGetResponseADMFormat: RootJsonFormat[ProjectMembersGetResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectMembersGetResponseADM, "members")), ) - implicit val projectRestrictedViewGetResponseADMFormat: RootJsonFormat[ProjectRestrictedViewSettingsGetResponseADM] = - jsonFormat(ProjectRestrictedViewSettingsGetResponseADM, "settings") + implicit val projectOperationResponseADMFormat: RootJsonFormat[ProjectOperationResponseADM] = rootFormat( lazyFormat(jsonFormat(ProjectOperationResponseADM, "project")), ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala index df613bae18..e5a0387269 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala @@ -5,15 +5,11 @@ package org.knora.webapi.messages.admin.responder.sipimessages -import org.apache.pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport -import spray.json.DefaultJsonProtocol -import spray.json.JsValue -import spray.json.NullOptions -import spray.json.RootJsonFormat +import zio.json.DeriveJsonCodec +import zio.json.JsonCodec -import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM +import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol /** * Represents the JSON response to a request for a information about a `FileValue`. @@ -24,19 +20,8 @@ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJso case class PermissionCodeAndProjectRestrictedViewSettings( permissionCode: Int, restrictedViewSettings: Option[ProjectRestrictedViewSettingsADM], -) extends AdminKnoraResponseADM { - def toJsValue: JsValue = SipiResponderResponseADMJsonProtocol.sipiFileInfoGetResponseADMFormat.write(this) -} - -/** - * A spray-json protocol for generating Knora API v1 JSON providing data about representations of a resource. - */ -object SipiResponderResponseADMJsonProtocol - extends SprayJsonSupport - with DefaultJsonProtocol - with NullOptions - with ProjectsADMJsonProtocol { - - implicit val sipiFileInfoGetResponseADMFormat: RootJsonFormat[PermissionCodeAndProjectRestrictedViewSettings] = - jsonFormat2(PermissionCodeAndProjectRestrictedViewSettings) +) extends AdminResponse +object PermissionCodeAndProjectRestrictedViewSettings { + implicit val codec: JsonCodec[PermissionCodeAndProjectRestrictedViewSettings] = + DeriveJsonCodec.gen[PermissionCodeAndProjectRestrictedViewSettings] } 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 f6b1dfb289..8c34ea8ecd 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 @@ -398,7 +398,7 @@ final case class ProjectsResponderADMLive( ): Task[ProjectRestrictedViewSettingsGetResponseADM] = projectRestrictedViewSettingsGetADM(id) .someOrFail(NotFoundException(s"Project '${getId(id)}' not found.")) - .map(ProjectRestrictedViewSettingsGetResponseADM) + .map(ProjectRestrictedViewSettingsGetResponseADM.apply) /** * Update project's basic information. diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala index f1a77470d1..a7294549e0 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala @@ -7,12 +7,11 @@ package org.knora.webapi.slice.admin.api import sttp.tapir.EndpointInput.PathCapture import sttp.tapir.* -import sttp.tapir.generic.auto.* -import sttp.tapir.json.spray.jsonBody +import sttp.tapir.generic.auto.schemaForCaseClass +import sttp.tapir.json.zio.jsonBody import zio.ZLayer import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings -import org.knora.webapi.messages.admin.responder.sipimessages.SipiResponderResponseADMJsonProtocol.* import org.knora.webapi.slice.admin.api.AdminPathVariables.projectShortcode import org.knora.webapi.slice.admin.api.Codecs.TapirCodec.sparqlEncodedString import org.knora.webapi.slice.admin.api.FilesPathVar.filename diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala index 883f3a173b..b777d54a14 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpoints.scala @@ -77,17 +77,17 @@ final case class ProjectsEndpoints( val getAdminProjectsByProjectIriRestrictedViewSettings = baseEndpoints.publicEndpoint.get .in(projectsByIri / restrictedViewSettings) - .out(sprayJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) + .out(zioJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) .description("Returns the project's restricted view settings identified by the IRI.") val getAdminProjectsByProjectShortcodeRestrictedViewSettings = baseEndpoints.publicEndpoint.get .in(projectsByShortcode / restrictedViewSettings) - .out(sprayJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) + .out(zioJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) .description("Returns the project's restricted view settings identified by the shortcode.") val getAdminProjectsByProjectShortnameRestrictedViewSettings = baseEndpoints.publicEndpoint.get .in(projectsByShortname / restrictedViewSettings) - .out(sprayJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) + .out(zioJsonBody[ProjectRestrictedViewSettingsGetResponseADM]) .description("Returns the project's restricted view settings identified by the shortname.") } 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 fecd372460..872d563b39 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 @@ -264,7 +264,7 @@ final case class ProjectsADMRestServiceLive( def getProjectRestrictedViewSettings(id: ProjectIdentifierADM): Task[ProjectRestrictedViewSettingsGetResponseADM] = for { internal <- responder.projectRestrictedViewSettingsGetRequestADM(id) - external <- format.toExternalADM(internal) + external <- format.toExternal(internal) } yield external /** From e1ad3833ffa681caca559737c9f819e799d46d60 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:24:20 +0100 Subject: [PATCH 09/16] temporary fixes --- .../test/scala/org/knora/sipi/SipiIT.scala | 12 +- .../webapi/e2e/admin/AdminFilesE2ESpec.scala | 77 ++++++------- .../webapi/e2e/admin/ProjectsADME2ESpec.scala | 105 +++++++++--------- 3 files changed, 97 insertions(+), 97 deletions(-) diff --git a/integration/src/test/scala/org/knora/sipi/SipiIT.scala b/integration/src/test/scala/org/knora/sipi/SipiIT.scala index d5f3b71325..df0de36dd1 100644 --- a/integration/src/test/scala/org/knora/sipi/SipiIT.scala +++ b/integration/src/test/scala/org/knora/sipi/SipiIT.scala @@ -23,7 +23,6 @@ import scala.util.Try import org.knora.sipi.MockDspApiServer.verify.* import org.knora.webapi.config.AppConfig -import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.sipimessages.* import org.knora.webapi.messages.util.KnoraSystemInstances.Users.SystemUser import org.knora.webapi.routing.JwtService @@ -317,7 +316,11 @@ object MockDspApiServer { def resetAndStubGetResponse(url: String, status: Int): URIO[WireMockServer, WireMockServer] = resetAndGetWireMockServer.tap(server => ZIO.succeed(stubGetJsonResponse(server, url, status))) - def resetAndStubGetResponse(url: String, status: Int, body: KnoraResponseADM): URIO[WireMockServer, WireMockServer] = + def resetAndStubGetResponse( + url: String, + status: Int, + body: PermissionCodeAndProjectRestrictedViewSettings, + ): URIO[WireMockServer, WireMockServer] = resetAndGetWireMockServer.tap(server => ZIO.succeed(stubGetJsonResponse(server, url, status, Some(body)))) def resetAndAllowWithPermissionCode( @@ -349,9 +352,10 @@ object MockDspApiServer { server: WireMockServer, url: String, status: Int, - body: Option[KnoraResponseADM] = None, + body: Option[PermissionCodeAndProjectRestrictedViewSettings] = None, ): Unit = { - val json = body.map(_.toJsValue.compactPrint).orNull + val json = + body.map(it => PermissionCodeAndProjectRestrictedViewSettings.codec.encoder.encodeJson(it).toString).orNull val jsonResponse = aResponse().withStatus(status).withBody(json).withHeader("Content-Type", "application/json") val stubBuilder = get(urlEqualTo(url)).willReturn(jsonResponse) server.stubFor(stubBuilder) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala index d3b47788cf..3f08bbf9c8 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala @@ -7,14 +7,8 @@ package org.knora.webapi.e2e.admin import org.apache.pekko.http.scaladsl.model.* import org.apache.pekko.http.scaladsl.model.headers.BasicHttpCredentials -import org.apache.pekko.http.scaladsl.unmarshalling.Unmarshal - -import scala.concurrent.Await -import scala.concurrent.duration.* import org.knora.webapi.E2ESpec -import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings -import org.knora.webapi.messages.admin.responder.sipimessages.SipiResponderResponseADMJsonProtocol.* import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.routing.Authenticator @@ -49,32 +43,33 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { addCredentials(BasicHttpCredentials(anythingAdminEmail, testPass)) val response: HttpResponse = singleAwaitingRequest(request) - // println(response.toString) + println(response.toString) assert(response.status == StatusCodes.OK) - val fr: PermissionCodeAndProjectRestrictedViewSettings = - Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) - - fr.permissionCode shouldEqual 8 +// val fr: PermissionCodeAndProjectRestrictedViewSettings = +// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) +// +// fr.permissionCode shouldEqual 8 + // TODO: fix this test } - "return RV (1) permission code" in { - /* anything image */ - val request = - Get(baseApiUrl + s"/admin/files/0001/B1D0OkEgfFp-Cew2Seur7Wi.jp2") ~> - addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) - val response: HttpResponse = singleAwaitingRequest(request) - - // println(response.toString) - - assert(response.status == StatusCodes.OK) - - val fr: PermissionCodeAndProjectRestrictedViewSettings = - Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) - - (fr.permissionCode === 1) should be(true) - } +// "return RV (1) permission code" in { +// /* anything image */ +// val request = +// Get(baseApiUrl + s"/admin/files/0001/B1D0OkEgfFp-Cew2Seur7Wi.jp2") ~> +// addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) +// val response: HttpResponse = singleAwaitingRequest(request) +// +// // println(response.toString) +// +// assert(response.status == StatusCodes.OK) +// +// val fr: PermissionCodeAndProjectRestrictedViewSettings = +// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) +// +// (fr.permissionCode === 1) should be(true) +// } "return 404 Not Found if a file value is in a deleted resource" in { val request = @@ -85,19 +80,19 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { assert(response.status == StatusCodes.NotFound) } - "return permissions for a previous version of a file value" in { - val request = - Get(baseApiUrl + s"/admin/files/0001/QxFMm5wlRlatStw9ft3iZA.jp2") ~> - addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) - val response: HttpResponse = singleAwaitingRequest(request) - - assert(response.status == StatusCodes.OK) - - val fr: PermissionCodeAndProjectRestrictedViewSettings = - Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) - - (fr.permissionCode === 1) should be(true) - - } +// "return permissions for a previous version of a file value" in { +// val request = +// Get(baseApiUrl + s"/admin/files/0001/QxFMm5wlRlatStw9ft3iZA.jp2") ~> +// addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) +// val response: HttpResponse = singleAwaitingRequest(request) +// +// assert(response.status == StatusCodes.OK) +// +// val fr: PermissionCodeAndProjectRestrictedViewSettings = +// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) +// +// (fr.permissionCode === 1) should be(true) +// +// } } } diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index 36b0b4ff6b..31ff45bad9 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -120,58 +120,59 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { assert(response.status === StatusCodes.OK) } - "return the project's restricted view settings using its IRI" in { - val request = Get(baseApiUrl + s"/admin/projects/iri/$projectIriEnc/RestrictedViewSettings") ~> addCredentials( - BasicHttpCredentials(rootEmail, testPass), - ) - val response: HttpResponse = singleAwaitingRequest(request) - logger.debug(s"response: {}", response) - assert(response.status === StatusCodes.OK) - - val settings: ProjectRestrictedViewSettingsADM = - AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] - settings.size should be(Some("!512,512")) - settings.watermark should be(true) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-project-restricted-view-settings-response", - fileExtension = "json", - ), - text = responseToString(response), - ), - ) - } - - "return the project's restricted view settings using its shortname" in { - val request = Get( - baseApiUrl + s"/admin/projects/shortname/$projectShortname/RestrictedViewSettings", - ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) - val response: HttpResponse = singleAwaitingRequest(request) - logger.debug(s"response: {}", response) - assert(response.status === StatusCodes.OK) - - val settings: ProjectRestrictedViewSettingsADM = - AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] - settings.size should be(Some("!512,512")) - settings.watermark should be(true) - } - - "return the project's restricted view settings using its shortcode" in { - val request = Get( - baseApiUrl + s"/admin/projects/shortcode/$projectShortcode/RestrictedViewSettings", - ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) - val response: HttpResponse = singleAwaitingRequest(request) - logger.debug(s"response: {}", response) - assert(response.status === StatusCodes.OK) - - val settings: ProjectRestrictedViewSettingsADM = - AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] - settings.size should be(Some("!512,512")) - settings.watermark should be(true) - } + // TODO: fix this test +// "return the project's restricted view settings using its IRI" in { +// val request = Get(baseApiUrl + s"/admin/projects/iri/$projectIriEnc/RestrictedViewSettings") ~> addCredentials( +// BasicHttpCredentials(rootEmail, testPass), +// ) +// val response: HttpResponse = singleAwaitingRequest(request) +// logger.debug(s"response: {}", response) +// assert(response.status === StatusCodes.OK) +// +// val settings: ProjectRestrictedViewSettingsADM = +// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] +// settings.size should be(Some("!512,512")) +// settings.watermark should be(true) +// +// clientTestDataCollector.addFile( +// TestDataFileContent( +// filePath = TestDataFilePath( +// directoryPath = clientTestDataPath, +// filename = "get-project-restricted-view-settings-response", +// fileExtension = "json", +// ), +// text = responseToString(response), +// ), +// ) +// } +// +// "return the project's restricted view settings using its shortname" in { +// val request = Get( +// baseApiUrl + s"/admin/projects/shortname/$projectShortname/RestrictedViewSettings", +// ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) +// val response: HttpResponse = singleAwaitingRequest(request) +// logger.debug(s"response: {}", response) +// assert(response.status === StatusCodes.OK) +// +// val settings: ProjectRestrictedViewSettingsADM = +// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] +// settings.size should be(Some("!512,512")) +// settings.watermark should be(true) +// } +// +// "return the project's restricted view settings using its shortcode" in { +// val request = Get( +// baseApiUrl + s"/admin/projects/shortcode/$projectShortcode/RestrictedViewSettings", +// ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) +// val response: HttpResponse = singleAwaitingRequest(request) +// logger.debug(s"response: {}", response) +// assert(response.status === StatusCodes.OK) +// +// val settings: ProjectRestrictedViewSettingsADM = +// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] +// settings.size should be(Some("!512,512")) +// settings.watermark should be(true) +// } } "given a custom Iri" should { From 339c8e0bb60115dc95edac8df1551e8674e0489e Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:36:52 +0100 Subject: [PATCH 10/16] restore some tests --- .../webapi/e2e/admin/AdminFilesE2ESpec.scala | 78 ++++++++++--------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala index 3f08bbf9c8..a18c65f9e6 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala @@ -9,6 +9,8 @@ import org.apache.pekko.http.scaladsl.model.* import org.apache.pekko.http.scaladsl.model.headers.BasicHttpCredentials import org.knora.webapi.E2ESpec +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM +import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.routing.Authenticator @@ -43,33 +45,32 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { addCredentials(BasicHttpCredentials(anythingAdminEmail, testPass)) val response: HttpResponse = singleAwaitingRequest(request) - println(response.toString) - assert(response.status == StatusCodes.OK) -// val fr: PermissionCodeAndProjectRestrictedViewSettings = -// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) -// -// fr.permissionCode shouldEqual 8 - // TODO: fix this test + val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = + PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + + assert(result == Right(PermissionCodeAndProjectRestrictedViewSettings(8, None))) } -// "return RV (1) permission code" in { -// /* anything image */ -// val request = -// Get(baseApiUrl + s"/admin/files/0001/B1D0OkEgfFp-Cew2Seur7Wi.jp2") ~> -// addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) -// val response: HttpResponse = singleAwaitingRequest(request) -// -// // println(response.toString) -// -// assert(response.status == StatusCodes.OK) -// -// val fr: PermissionCodeAndProjectRestrictedViewSettings = -// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) -// -// (fr.permissionCode === 1) should be(true) -// } + "return RV (1) permission code" in { + /* anything image */ + val request = + Get(baseApiUrl + s"/admin/files/0001/B1D0OkEgfFp-Cew2Seur7Wi.jp2") ~> + addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) + val response: HttpResponse = singleAwaitingRequest(request) + + assert(response.status == StatusCodes.OK) + + val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = + PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + + assert( + result == Right( + PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), + ), + ) + } "return 404 Not Found if a file value is in a deleted resource" in { val request = @@ -80,19 +81,22 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { assert(response.status == StatusCodes.NotFound) } -// "return permissions for a previous version of a file value" in { -// val request = -// Get(baseApiUrl + s"/admin/files/0001/QxFMm5wlRlatStw9ft3iZA.jp2") ~> -// addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) -// val response: HttpResponse = singleAwaitingRequest(request) -// -// assert(response.status == StatusCodes.OK) -// -// val fr: PermissionCodeAndProjectRestrictedViewSettings = -// Await.result(Unmarshal(response.entity).to[PermissionCodeAndProjectRestrictedViewSettings], 1.seconds) -// -// (fr.permissionCode === 1) should be(true) -// -// } + "return permissions for a previous version of a file value" in { + val request = + Get(baseApiUrl + s"/admin/files/0001/QxFMm5wlRlatStw9ft3iZA.jp2") ~> + addCredentials(BasicHttpCredentials(normalUserEmail, testPass)) + val response: HttpResponse = singleAwaitingRequest(request) + + assert(response.status == StatusCodes.OK) + + val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = + PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + + assert( + result == Right( + PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), + ), + ) + } } } From aaecdd5155e950992ffb325f7d9e97982bcbca71 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:44:20 +0100 Subject: [PATCH 11/16] streamline test --- .../webapi/e2e/admin/AdminFilesE2ESpec.scala | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala index a18c65f9e6..7df1ed2e00 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala @@ -47,10 +47,12 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { assert(response.status == StatusCodes.OK) - val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = - PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + val result: PermissionCodeAndProjectRestrictedViewSettings = + PermissionCodeAndProjectRestrictedViewSettings.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("JSON decoding failed")) - assert(result == Right(PermissionCodeAndProjectRestrictedViewSettings(8, None))) + assert(result == PermissionCodeAndProjectRestrictedViewSettings(8, None)) } "return RV (1) permission code" in { @@ -62,13 +64,13 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { assert(response.status == StatusCodes.OK) - val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = - PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + val result: PermissionCodeAndProjectRestrictedViewSettings = + PermissionCodeAndProjectRestrictedViewSettings.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("JSON decoding failed")) assert( - result == Right( - PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), - ), + result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), ) } @@ -89,13 +91,13 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { assert(response.status == StatusCodes.OK) - val result: Either[String, PermissionCodeAndProjectRestrictedViewSettings] = - PermissionCodeAndProjectRestrictedViewSettings.codec.decoder.decodeJson(responseToString(response)) + val result: PermissionCodeAndProjectRestrictedViewSettings = + PermissionCodeAndProjectRestrictedViewSettings.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("JSON decoding failed")) assert( - result == Right( - PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), - ), + result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), ) } } From a072050ee9c3ea173be26574962214e686e7b261 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:46:51 +0100 Subject: [PATCH 12/16] restore more tests --- .../webapi/e2e/admin/ProjectsADME2ESpec.scala | 117 +++++++++--------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index 31ff45bad9..f8faf1753f 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -63,11 +63,8 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { "return all projects excluding built-in system projects" in { val request = Get(baseApiUrl + s"/admin/projects") ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) val response = singleAwaitingRequest(request) - // log.debug(s"response: {}", response) assert(response.status === StatusCodes.OK) - // log.debug("projects as objects: {}", AkkaHttpUtils.httpResponseToJson(response).fields("projects").convertTo[Seq[ProjectInfoV1]]) - val projects: Seq[ProjectADM] = AkkaHttpUtils.httpResponseToJson(response).fields("projects").convertTo[Seq[ProjectADM]] projects.size should be(6) @@ -88,7 +85,6 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { BasicHttpCredentials(rootEmail, testPass), ) val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: {}", response) assert(response.status === StatusCodes.OK) clientTestDataCollector.addFile( TestDataFileContent( @@ -107,7 +103,6 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { BasicHttpCredentials(rootEmail, testPass), ) val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: {}", response) assert(response.status === StatusCodes.OK) } @@ -116,63 +111,67 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { BasicHttpCredentials(rootEmail, testPass), ) val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: {}", response) assert(response.status === StatusCodes.OK) } - // TODO: fix this test -// "return the project's restricted view settings using its IRI" in { -// val request = Get(baseApiUrl + s"/admin/projects/iri/$projectIriEnc/RestrictedViewSettings") ~> addCredentials( -// BasicHttpCredentials(rootEmail, testPass), -// ) -// val response: HttpResponse = singleAwaitingRequest(request) -// logger.debug(s"response: {}", response) -// assert(response.status === StatusCodes.OK) -// -// val settings: ProjectRestrictedViewSettingsADM = -// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] -// settings.size should be(Some("!512,512")) -// settings.watermark should be(true) -// -// clientTestDataCollector.addFile( -// TestDataFileContent( -// filePath = TestDataFilePath( -// directoryPath = clientTestDataPath, -// filename = "get-project-restricted-view-settings-response", -// fileExtension = "json", -// ), -// text = responseToString(response), -// ), -// ) -// } -// -// "return the project's restricted view settings using its shortname" in { -// val request = Get( -// baseApiUrl + s"/admin/projects/shortname/$projectShortname/RestrictedViewSettings", -// ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) -// val response: HttpResponse = singleAwaitingRequest(request) -// logger.debug(s"response: {}", response) -// assert(response.status === StatusCodes.OK) -// -// val settings: ProjectRestrictedViewSettingsADM = -// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] -// settings.size should be(Some("!512,512")) -// settings.watermark should be(true) -// } -// -// "return the project's restricted view settings using its shortcode" in { -// val request = Get( -// baseApiUrl + s"/admin/projects/shortcode/$projectShortcode/RestrictedViewSettings", -// ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) -// val response: HttpResponse = singleAwaitingRequest(request) -// logger.debug(s"response: {}", response) -// assert(response.status === StatusCodes.OK) -// -// val settings: ProjectRestrictedViewSettingsADM = -// AkkaHttpUtils.httpResponseToJson(response).fields("settings").convertTo[ProjectRestrictedViewSettingsADM] -// settings.size should be(Some("!512,512")) -// settings.watermark should be(true) -// } + "return the project's restricted view settings using its IRI" in { + val request = Get(baseApiUrl + s"/admin/projects/iri/$projectIriEnc/RestrictedViewSettings") ~> addCredentials( + BasicHttpCredentials(rootEmail, testPass), + ) + val response: HttpResponse = singleAwaitingRequest(request) + assert(response.status === StatusCodes.OK) + + val settings = + ProjectRestrictedViewSettingsADM.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("Could not decode response")) + + settings.size should be(Some("!512,512")) + settings.watermark should be(true) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-project-restricted-view-settings-response", + fileExtension = "json", + ), + text = responseToString(response), + ), + ) + } + + "return the project's restricted view settings using its shortname" in { + val request = Get( + baseApiUrl + s"/admin/projects/shortname/$projectShortname/RestrictedViewSettings", + ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) + val response: HttpResponse = singleAwaitingRequest(request) + assert(response.status === StatusCodes.OK) + + val settings: ProjectRestrictedViewSettingsADM = + ProjectRestrictedViewSettingsADM.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("Could not decode response")) + + settings.size should be(Some("!512,512")) + settings.watermark should be(true) + } + + "return the project's restricted view settings using its shortcode" in { + val request = Get( + baseApiUrl + s"/admin/projects/shortcode/$projectShortcode/RestrictedViewSettings", + ) ~> addCredentials(BasicHttpCredentials(rootEmail, testPass)) + val response: HttpResponse = singleAwaitingRequest(request) + assert(response.status === StatusCodes.OK) + + val settings: ProjectRestrictedViewSettingsADM = + ProjectRestrictedViewSettingsADM.codec + .decodeJson(responseToString(response)) + .getOrElse(throw new AssertionError("Could not decode response")) + + settings.size should be(Some("!512,512")) + settings.watermark should be(true) + } } "given a custom Iri" should { From 0e75bd3eea966d5726351ed40dbf412fac10d76b Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:57:04 +0100 Subject: [PATCH 13/16] move last remaining sipi message to project messages --- .../test/scala/org/knora/sipi/SipiIT.scala | 2 +- .../webapi/e2e/admin/AdminFilesE2ESpec.scala | 2 +- .../admin/AssetPermissionsResponderSpec.scala | 2 +- .../ProjectsMessagesADM.scala | 15 +++++++++++ .../sipimessages/SipiMessagesADM.scala | 27 ------------------- .../admin/AssetPermissionsResponder.scala | 2 +- .../slice/admin/api/FilesEndpoints.scala | 2 +- .../admin/api/FilesEndpointsHandler.scala | 2 +- 8 files changed, 21 insertions(+), 33 deletions(-) delete mode 100644 webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala diff --git a/integration/src/test/scala/org/knora/sipi/SipiIT.scala b/integration/src/test/scala/org/knora/sipi/SipiIT.scala index df0de36dd1..d0fbd56a14 100644 --- a/integration/src/test/scala/org/knora/sipi/SipiIT.scala +++ b/integration/src/test/scala/org/knora/sipi/SipiIT.scala @@ -23,7 +23,7 @@ import scala.util.Try import org.knora.sipi.MockDspApiServer.verify.* import org.knora.webapi.config.AppConfig -import org.knora.webapi.messages.admin.responder.sipimessages.* +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.util.KnoraSystemInstances.Users.SystemUser import org.knora.webapi.routing.JwtService import org.knora.webapi.routing.JwtServiceLive diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala index 7df1ed2e00..22e739c52e 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala @@ -9,8 +9,8 @@ import org.apache.pekko.http.scaladsl.model.* import org.apache.pekko.http.scaladsl.model.headers.BasicHttpCredentials import org.knora.webapi.E2ESpec +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM -import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.routing.Authenticator diff --git a/integration/src/test/scala/org/knora/webapi/responders/admin/AssetPermissionsResponderSpec.scala b/integration/src/test/scala/org/knora/webapi/responders/admin/AssetPermissionsResponderSpec.scala index dbafbaed11..cebb54bc45 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/admin/AssetPermissionsResponderSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/admin/AssetPermissionsResponderSpec.scala @@ -8,9 +8,9 @@ package org.knora.webapi.responders.admin import org.apache.pekko.testkit.* import org.knora.webapi.* +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM -import org.knora.webapi.messages.admin.responder.sipimessages.* import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.routing.UnsafeZioRun import org.knora.webapi.sharedtestdata.SharedTestDataADM 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 39e0b369da..9eb059547f 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 @@ -174,6 +174,21 @@ object ProjectRestrictedViewSettingsGetResponseADM { DeriveJsonCodec.gen[ProjectRestrictedViewSettingsGetResponseADM] } +/** + * Represents the JSON response to a request for a information about a `FileValue`. + * + * @param permissionCode a code representing the user's maximum permission on the file. + * @param restrictedViewSettings the project's restricted view settings. + */ +case class PermissionCodeAndProjectRestrictedViewSettings( + permissionCode: Int, + restrictedViewSettings: Option[ProjectRestrictedViewSettingsADM], +) extends AdminResponse +object PermissionCodeAndProjectRestrictedViewSettings { + implicit val codec: JsonCodec[PermissionCodeAndProjectRestrictedViewSettings] = + DeriveJsonCodec.gen[PermissionCodeAndProjectRestrictedViewSettings] +} + /** * Represents an answer to a project creating/modifying operation. * diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala deleted file mode 100644 index e5a0387269..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright © 2021 - 2024 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.messages.admin.responder.sipimessages - -import zio.json.DeriveJsonCodec -import zio.json.JsonCodec - -import org.knora.webapi.messages.admin.responder.AdminResponse -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM - -/** - * Represents the JSON response to a request for a information about a `FileValue`. - * - * @param permissionCode a code representing the user's maximum permission on the file. - * @param restrictedViewSettings the project's restricted view settings. - */ -case class PermissionCodeAndProjectRestrictedViewSettings( - permissionCode: Int, - restrictedViewSettings: Option[ProjectRestrictedViewSettingsADM], -) extends AdminResponse -object PermissionCodeAndProjectRestrictedViewSettings { - implicit val codec: JsonCodec[PermissionCodeAndProjectRestrictedViewSettings] = - DeriveJsonCodec.gen[PermissionCodeAndProjectRestrictedViewSettings] -} diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/AssetPermissionsResponder.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/AssetPermissionsResponder.scala index b3115f2563..ef5ab36111 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/AssetPermissionsResponder.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/AssetPermissionsResponder.scala @@ -11,8 +11,8 @@ import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotFoundException import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier -import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.store.triplestoremessages.IriSubjectV2 import org.knora.webapi.messages.store.triplestoremessages.LiteralV2 import org.knora.webapi.messages.store.triplestoremessages.SparqlExtendedConstructResponse diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala index a7294549e0..816f42d639 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpoints.scala @@ -11,7 +11,7 @@ import sttp.tapir.generic.auto.schemaForCaseClass import sttp.tapir.json.zio.jsonBody import zio.ZLayer -import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.slice.admin.api.AdminPathVariables.projectShortcode import org.knora.webapi.slice.admin.api.Codecs.TapirCodec.sparqlEncodedString import org.knora.webapi.slice.admin.api.FilesPathVar.filename diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpointsHandler.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpointsHandler.scala index c1cee756c5..6498b9f5a8 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpointsHandler.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/FilesEndpointsHandler.scala @@ -7,8 +7,8 @@ package org.knora.webapi.slice.admin.api import zio.ZLayer +import org.knora.webapi.messages.admin.responder.projectsmessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier -import org.knora.webapi.messages.admin.responder.sipimessages.PermissionCodeAndProjectRestrictedViewSettings import org.knora.webapi.responders.admin.AssetPermissionsResponder import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.common.api.HandlerMapper From 927be0ccebc899cbf07e924ca1070af5c894712b Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Tue, 5 Mar 2024 21:51:19 +0100 Subject: [PATCH 14/16] fix tests --- .../org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index f8faf1753f..b1d8e9459e 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -122,9 +122,10 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { assert(response.status === StatusCodes.OK) val settings = - ProjectRestrictedViewSettingsADM.codec + ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) .getOrElse(throw new AssertionError("Could not decode response")) + .settings settings.size should be(Some("!512,512")) settings.watermark should be(true) @@ -149,9 +150,10 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { assert(response.status === StatusCodes.OK) val settings: ProjectRestrictedViewSettingsADM = - ProjectRestrictedViewSettingsADM.codec + ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) .getOrElse(throw new AssertionError("Could not decode response")) + .settings settings.size should be(Some("!512,512")) settings.watermark should be(true) @@ -165,9 +167,10 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { assert(response.status === StatusCodes.OK) val settings: ProjectRestrictedViewSettingsADM = - ProjectRestrictedViewSettingsADM.codec + ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) .getOrElse(throw new AssertionError("Could not decode response")) + .settings settings.size should be(Some("!512,512")) settings.watermark should be(true) From 51a49222562541782990c3e80e634b3aabe68e30 Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Wed, 6 Mar 2024 08:29:53 +0100 Subject: [PATCH 15/16] Apply suggestions --- .../org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala | 6 +++--- .../org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala index 22e739c52e..cabf1e81f8 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/AdminFilesE2ESpec.scala @@ -50,7 +50,7 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { val result: PermissionCodeAndProjectRestrictedViewSettings = PermissionCodeAndProjectRestrictedViewSettings.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("JSON decoding failed")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) assert(result == PermissionCodeAndProjectRestrictedViewSettings(8, None)) } @@ -67,7 +67,7 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { val result: PermissionCodeAndProjectRestrictedViewSettings = PermissionCodeAndProjectRestrictedViewSettings.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("JSON decoding failed")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) assert( result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), @@ -94,7 +94,7 @@ class AdminFilesE2ESpec extends E2ESpec with TriplestoreJsonProtocol { val result: PermissionCodeAndProjectRestrictedViewSettings = PermissionCodeAndProjectRestrictedViewSettings.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("JSON decoding failed")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) assert( result == PermissionCodeAndProjectRestrictedViewSettings(1, Some(ProjectRestrictedViewSettingsADM(None, false))), diff --git a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala index b1d8e9459e..d231e3cdbb 100644 --- a/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala +++ b/integration/src/test/scala/org/knora/webapi/e2e/admin/ProjectsADME2ESpec.scala @@ -124,7 +124,7 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { val settings = ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("Could not decode response")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) .settings settings.size should be(Some("!512,512")) @@ -152,7 +152,7 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { val settings: ProjectRestrictedViewSettingsADM = ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("Could not decode response")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) .settings settings.size should be(Some("!512,512")) @@ -169,7 +169,7 @@ class ProjectsADME2ESpec extends E2ESpec with ProjectsADMJsonProtocol { val settings: ProjectRestrictedViewSettingsADM = ProjectRestrictedViewSettingsGetResponseADM.codec .decodeJson(responseToString(response)) - .getOrElse(throw new AssertionError("Could not decode response")) + .getOrElse(throw new AssertionError(s"Could not decode response for ${responseToString(response)}.")) .settings settings.size should be(Some("!512,512")) From 8dc114808cb0d0e4f7e48157338cd1c0f531980c Mon Sep 17 00:00:00 2001 From: Balduin Landolt <33053745+BalduinLandolt@users.noreply.github.com> Date: Wed, 6 Mar 2024 15:31:36 +0100 Subject: [PATCH 16/16] remove redundant trait --- .../admin/responder/KnoraResponseADM.scala | 2 -- .../ProjectsMessagesADM.scala | 13 ++++--- .../knora/webapi/routing/RouteUtilADM.scala | 34 +++++++++---------- .../common/api/KnoraResponseRenderer.scala | 4 +-- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala index 44ab56f0bf..949cdad144 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/KnoraResponseADM.scala @@ -13,5 +13,3 @@ import org.knora.webapi.messages.traits.Jsonable trait KnoraResponseADM extends Jsonable trait AdminKnoraResponseADM extends KnoraResponseADM - -trait AdminResponse 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 9eb059547f..7fdfe40588 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 @@ -30,7 +30,6 @@ import org.knora.webapi.core.RelayedMessage import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM -import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.ProjectCreateRequest @@ -102,7 +101,7 @@ object ProjectCodec { * * @param projects information about all existing projects. */ -case class ProjectsGetResponse(projects: Seq[ProjectADM]) extends AdminResponse +case class ProjectsGetResponse(projects: Seq[ProjectADM]) object ProjectsGetResponse { // can be removed as soon as ProjectADM can define its own codec import ProjectCodec.projectCodec @@ -114,7 +113,7 @@ object ProjectsGetResponse { * * @param project all information about the project. */ -case class ProjectGetResponse(project: ProjectADM) extends AdminResponse +case class ProjectGetResponse(project: ProjectADM) object ProjectGetResponse { // can be removed as soon as ProjectADM can define its own codec import ProjectCodec.projectCodec @@ -148,7 +147,7 @@ case class ProjectAdminMembersGetResponseADM(members: Seq[User]) * * @param keywords a list of keywords. */ -case class ProjectsKeywordsGetResponse(keywords: Seq[String]) extends AdminResponse +case class ProjectsKeywordsGetResponse(keywords: Seq[String]) object ProjectsKeywordsGetResponse { implicit val codec: JsonCodec[ProjectsKeywordsGetResponse] = DeriveJsonCodec.gen[ProjectsKeywordsGetResponse] } @@ -158,7 +157,7 @@ object ProjectsKeywordsGetResponse { * * @param keywords a list of keywords. */ -case class ProjectKeywordsGetResponse(keywords: Seq[String]) extends AdminResponse +case class ProjectKeywordsGetResponse(keywords: Seq[String]) object ProjectKeywordsGetResponse { implicit val codec: JsonCodec[ProjectKeywordsGetResponse] = DeriveJsonCodec.gen[ProjectKeywordsGetResponse] } @@ -168,7 +167,7 @@ object ProjectKeywordsGetResponse { * * @param settings the restricted view settings. */ -case class ProjectRestrictedViewSettingsGetResponseADM(settings: ProjectRestrictedViewSettingsADM) extends AdminResponse +case class ProjectRestrictedViewSettingsGetResponseADM(settings: ProjectRestrictedViewSettingsADM) object ProjectRestrictedViewSettingsGetResponseADM { implicit val codec: JsonCodec[ProjectRestrictedViewSettingsGetResponseADM] = DeriveJsonCodec.gen[ProjectRestrictedViewSettingsGetResponseADM] @@ -183,7 +182,7 @@ object ProjectRestrictedViewSettingsGetResponseADM { case class PermissionCodeAndProjectRestrictedViewSettings( permissionCode: Int, restrictedViewSettings: Option[ProjectRestrictedViewSettingsADM], -) extends AdminResponse +) object PermissionCodeAndProjectRestrictedViewSettings { implicit val codec: JsonCodec[PermissionCodeAndProjectRestrictedViewSettings] = DeriveJsonCodec.gen[PermissionCodeAndProjectRestrictedViewSettings] diff --git a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala index e703fe4935..15e3193e2f 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/RouteUtilADM.scala @@ -23,7 +23,6 @@ import org.knora.webapi.IRI import org.knora.webapi.core.MessageRelay import org.knora.webapi.messages.ResponderRequest.KnoraRequestADM import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.groupsmessages.* import org.knora.webapi.messages.admin.responder.projectsmessages.* @@ -89,23 +88,24 @@ object RouteUtilADM { } } - def transformResponseIntoExternalFormat( - response: AdminResponse, - ): ZIO[StringFormatter, Throwable, AdminResponse] = ZIO.serviceWithZIO[StringFormatter] { sf => - ZIO.attempt { - def projectAsExternalRepresentation(project: ProjectADM): ProjectADM = { - val ontologiesExternal = - project.ontologies.map(sf.toSmartIri(_)).map(_.toOntologySchema(ApiV2Complex).toString) - project.copy(ontologies = ontologiesExternal) + def transformResponseIntoExternalFormat[A](response: A): ZIO[StringFormatter, Throwable, A] = + ZIO + .serviceWithZIO[StringFormatter] { sf => + ZIO.attempt { + def projectAsExternalRepresentation(project: ProjectADM): ProjectADM = { + val ontologiesExternal = + project.ontologies.map(sf.toSmartIri(_)).map(_.toOntologySchema(ApiV2Complex).toString) + project.copy(ontologies = ontologiesExternal) + } + + response match { + case ProjectsGetResponse(projects) => ProjectsGetResponse(projects.map(projectAsExternalRepresentation)) + case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) + case _ => response + } + } } - - response match { - case ProjectsGetResponse(projects) => ProjectsGetResponse(projects.map(projectAsExternalRepresentation)) - case ProjectGetResponse(project) => ProjectGetResponse(projectAsExternalRepresentation(project)) - case _ => response - } - } - } + .map(_.asInstanceOf[A]) /** * Sends a message to a responder and completes the HTTP request by returning the response as JSON. diff --git a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala index 8961b6825c..cb434aca8a 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/common/api/KnoraResponseRenderer.scala @@ -16,7 +16,6 @@ import org.knora.webapi.SchemaRendering import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.AdminKnoraResponseADM -import org.knora.webapi.messages.admin.responder.AdminResponse import org.knora.webapi.messages.util.rdf.RdfFormat import org.knora.webapi.messages.v2.responder.KnoraResponseV2 import org.knora.webapi.routing.RouteUtilADM @@ -42,11 +41,10 @@ final class KnoraResponseRenderer(config: AppConfig, stringFormatter: StringForm .provide(ZLayer.succeed(stringFormatter)) .mapAttempt(_.asInstanceOf[A]) - def toExternal[A <: AdminResponse](response: A): Task[A] = + def toExternal[A](response: A): Task[A] = RouteUtilADM .transformResponseIntoExternalFormat(response) .provide(ZLayer.succeed(stringFormatter)) - .mapAttempt(_.asInstanceOf[A]) }