From e5285eacabb00ec5b079d0e546cf3629199a0641 Mon Sep 17 00:00:00 2001 From: Marcin Procyk Date: Tue, 9 Jan 2024 18:01:49 +0100 Subject: [PATCH] refactor: Migrate getAllGroups route to tapir (DEV-1588) (#2984) --- .../org/knora/webapi/core/LayersTest.scala | 4 +++ .../org/knora/webapi/core/LayersLive.scala | 4 +++ .../responders/admin/GroupsResponderADM.scala | 2 ++ .../webapi/routing/admin/GroupsRouteADM.scala | 10 +----- .../webapi/routing/admin/UsersRouteADM.scala | 7 ---- .../slice/admin/api/AdminApiEndpoints.scala | 4 ++- .../slice/admin/api/AdminApiRoutes.scala | 6 ++-- .../slice/admin/api/GroupsEndpoints.scala | 32 +++++++++++++++++++ .../admin/api/GroupsEndpointsHandler.scala | 30 +++++++++++++++++ .../slice/admin/api/UsersEndpoints.scala | 6 ++-- .../admin/api/service/GroupsRestService.scala | 27 ++++++++++++++++ .../slice/common/api/DocsGenerator.scala | 2 ++ 12 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpoints.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpointsHandler.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala diff --git a/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala b/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala index a35259e5a2..e6b4db1af3 100644 --- a/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala +++ b/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala @@ -28,6 +28,7 @@ import org.knora.webapi.responders.v2.ontology.OntologyHelpers import org.knora.webapi.responders.v2.ontology.OntologyHelpersLive import org.knora.webapi.routing._ import org.knora.webapi.slice.admin.api._ +import org.knora.webapi.slice.admin.api.service.GroupsRestServiceLive import org.knora.webapi.slice.admin.api.service.MaintenanceRestService import org.knora.webapi.slice.admin.api.service.PermissionsRestService import org.knora.webapi.slice.admin.api.service.ProjectADMRestService @@ -156,6 +157,9 @@ object LayersTest { ConstructTransformer.layer, DspIngestClientLive.layer, GravsearchTypeInspectionRunner.layer, + GroupsEndpoints.layer, + GroupsEndpointsHandler.layer, + GroupsRestServiceLive.layer, GroupsResponderADMLive.layer, HandlerMapper.layer, HttpServer.layer, diff --git a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala index 4a8aabb4cf..4a867df60e 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala @@ -29,6 +29,7 @@ import org.knora.webapi.responders.v2.ontology.OntologyHelpers import org.knora.webapi.responders.v2.ontology.OntologyHelpersLive import org.knora.webapi.routing.* import org.knora.webapi.slice.admin.api.* +import org.knora.webapi.slice.admin.api.service.GroupsRestServiceLive import org.knora.webapi.slice.admin.api.service.MaintenanceRestService import org.knora.webapi.slice.admin.api.service.PermissionsRestService import org.knora.webapi.slice.admin.api.service.ProjectADMRestService @@ -106,6 +107,9 @@ object LayersLive { ConstructTransformer.layer, DspIngestClientLive.layer, GravsearchTypeInspectionRunner.layer, + GroupsEndpoints.layer, + GroupsEndpointsHandler.layer, + GroupsRestServiceLive.layer, GroupsResponderADMLive.layer, HandlerMapper.layer, HttpServer.layer, diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala index f541fbcc67..0a032a6b29 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/GroupsResponderADM.scala @@ -7,6 +7,7 @@ package org.knora.webapi.responders.admin import com.typesafe.scalalogging.LazyLogging import zio.* +import zio.macros.accessible import java.util.UUID @@ -48,6 +49,7 @@ import org.knora.webapi.util.ZioHelper /** * Returns information about groups. */ +@accessible trait GroupsResponderADM { /** diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala index 52c1afdbec..e95db62804 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala @@ -38,21 +38,13 @@ final case class GroupsRouteADM( private val groupsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "groups") override def makeRoute: Route = - getGroups() ~ - getGroup() ~ + getGroup() ~ getGroupMembers() ~ createGroup() ~ updateGroup() ~ changeGroupStatus() ~ deleteGroup() - /** - * Returns all groups. - */ - private def getGroups(): Route = path(groupsBasePath) { - get(runJsonRoute(GroupsGetRequestADM(), _)) - } - /** * Returns a single group identified by IRI. */ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala index fe806000f2..69f1763ca2 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala @@ -56,13 +56,6 @@ final case class UsersRouteADM()( addUserToGroupMembership() ~ removeUserFromGroupMembership() - /* return all users */ - def getUsers(): Route = path(usersBasePath) { - get { ctx => - runJsonRouteZ(Authenticator.getUserADM(ctx).map(user => UsersGetRequestADM(requestingUser = user)), ctx) - } - } - /* create a new user */ private def addUser(): Route = path(usersBasePath) { post { diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiEndpoints.scala index 83fd4771e8..cffa8b1792 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiEndpoints.scala @@ -9,6 +9,7 @@ import sttp.tapir.AnyEndpoint import zio.ZLayer final case class AdminApiEndpoints( + groupsEndpoints: GroupsEndpoints, maintenanceEndpoints: MaintenanceEndpoints, permissionsEndpoints: PermissionsEndpoints, projectsEndpoints: ProjectsEndpoints, @@ -16,7 +17,8 @@ final case class AdminApiEndpoints( ) { val endpoints: Seq[AnyEndpoint] = - maintenanceEndpoints.endpoints ++ + groupsEndpoints.endpoints ++ + maintenanceEndpoints.endpoints ++ permissionsEndpoints.endpoints ++ projectsEndpoints.endpoints ++ usersEndpoints.endpoints diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiRoutes.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiRoutes.scala index 2ae285bf8d..4fa993fb53 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiRoutes.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiRoutes.scala @@ -11,14 +11,16 @@ import zio.ZLayer import org.knora.webapi.slice.common.api.TapirToPekkoInterpreter final case class AdminApiRoutes( + groups: GroupsEndpointsHandler, maintenance: MaintenanceEndpointsHandlers, + permissions: PermissionsEndpointsHandlers, project: ProjectsEndpointsHandler, users: UsersEndpointsHandler, - permissions: PermissionsEndpointsHandlers, tapirToPekko: TapirToPekkoInterpreter ) { - private val handlers = maintenance.handlers ++ project.allHanders ++ users.allHanders ++ permissions.allHanders + private val handlers = + groups.handlers ++ maintenance.handlers ++ permissions.allHanders ++ project.allHanders ++ users.allHanders val routes: Seq[Route] = handlers.map(tapirToPekko.toRoute(_)) } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpoints.scala new file mode 100644 index 0000000000..6059fba3bd --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpoints.scala @@ -0,0 +1,32 @@ +/* + * 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.slice.admin.api + +import sttp.tapir.* +import sttp.tapir.generic.auto.* +import sttp.tapir.json.spray.jsonBody as sprayJsonBody +import zio.* + +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsGetResponseADM +import org.knora.webapi.messages.admin.responder.usersmessages.UsersADMJsonProtocol.groupsGetResponseADMFormat +import org.knora.webapi.slice.common.api.BaseEndpoints + +final case class GroupsEndpoints(baseEndpoints: BaseEndpoints) { + private val base = "admin" / "groups" + private val tags = List("Groups", "Admin API") + + val getGroups = baseEndpoints.publicEndpoint.get + .in(base) + .out(sprayJsonBody[GroupsGetResponseADM]) + .description("Returns all groups.") + .tags(tags) + + val endpoints: Seq[AnyEndpoint] = Seq(getGroups) +} + +object GroupsEndpoints { + val layer = ZLayer.derive[GroupsEndpoints] +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpointsHandler.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpointsHandler.scala new file mode 100644 index 0000000000..2c2bb00a23 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/GroupsEndpointsHandler.scala @@ -0,0 +1,30 @@ +/* + * 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.slice.admin.api + +import zio.ZLayer + +import org.knora.webapi.slice.admin.api.service.GroupsRestService +import org.knora.webapi.slice.common.api.EndpointAndZioHandler +import org.knora.webapi.slice.common.api.HandlerMapper + +case class GroupsEndpointsHandler( + endpoints: GroupsEndpoints, + restService: GroupsRestService, + mapper: HandlerMapper +) { + private val getGroupsHandler = + EndpointAndZioHandler( + endpoints.getGroups, + (_: Unit) => restService.getAllGroups + ) + + val handlers = List(getGroupsHandler).map(mapper.mapEndpointAndHandler(_)) +} + +object GroupsEndpointsHandler { + val layer = ZLayer.derive[GroupsEndpointsHandler] +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/UsersEndpoints.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/UsersEndpoints.scala index 97752511c5..d94d7ae0c4 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/UsersEndpoints.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/UsersEndpoints.scala @@ -15,13 +15,11 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UsersGetResponseA import org.knora.webapi.slice.common.api.BaseEndpoints final case class UsersEndpoints(baseEndpoints: BaseEndpoints) { - - private val projectsBase = "admin" / "users" - + private val base = "admin" / "users" private val tags = List("Users", "Admin API") val getUsers = baseEndpoints.securedEndpoint.get - .in(projectsBase) + .in(base) .out(sprayJsonBody[UsersGetResponseADM]) .description("Returns all users.") .tags(tags) 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 new file mode 100644 index 0000000000..2ee5bb5d35 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/GroupsRestService.scala @@ -0,0 +1,27 @@ +/* + * 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.slice.admin.api.service + +import zio.* +import zio.macros.accessible + +import org.knora.webapi.messages.admin.responder.groupsmessages.GroupsGetResponseADM +import org.knora.webapi.responders.admin.GroupsResponderADM + +@accessible +trait GroupsRestService { + def getAllGroups: Task[GroupsGetResponseADM] +} + +final case class GroupsRestServiceLive( + responder: GroupsResponderADM +) extends GroupsRestService { + override def getAllGroups: Task[GroupsGetResponseADM] = responder.groupsGetRequestADM +} + +object GroupsRestServiceLive { + val layer = ZLayer.derive[GroupsRestServiceLive] +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/common/api/DocsGenerator.scala b/webapi/src/main/scala/org/knora/webapi/slice/common/api/DocsGenerator.scala index ae9d1f34f6..62141b6303 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/common/api/DocsGenerator.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/common/api/DocsGenerator.scala @@ -25,6 +25,7 @@ import org.knora.webapi.messages.admin.responder.usersmessages.UserIdentifierADM import org.knora.webapi.messages.v2.routing.authenticationmessages.KnoraCredentialsV2 import org.knora.webapi.routing.Authenticator import org.knora.webapi.slice.admin.api.AdminApiEndpoints +import org.knora.webapi.slice.admin.api.GroupsEndpoints import org.knora.webapi.slice.admin.api.MaintenanceEndpoints import org.knora.webapi.slice.admin.api.PermissionsEndpoints import org.knora.webapi.slice.admin.api.ProjectsEndpoints @@ -66,6 +67,7 @@ object DocsGenerator extends ZIOAppDefault { ApiV2Endpoints.layer, BaseEndpoints.layer, DocsNoopAuthenticator.layer, + GroupsEndpoints.layer, MaintenanceEndpoints.layer, PermissionsEndpoints.layer, ProjectsEndpoints.layer,