Skip to content

Commit

Permalink
refactor: Migrate getAllGroups route to tapir (DEV-1588) (#2984)
Browse files Browse the repository at this point in the history
  • Loading branch information
mpro7 committed Jan 9, 2024
1 parent 503b742 commit e5285ea
Show file tree
Hide file tree
Showing 12 changed files with 111 additions and 23 deletions.
Expand Up @@ -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
Expand Down Expand Up @@ -156,6 +157,9 @@ object LayersTest {
ConstructTransformer.layer,
DspIngestClientLive.layer,
GravsearchTypeInspectionRunner.layer,
GroupsEndpoints.layer,
GroupsEndpointsHandler.layer,
GroupsRestServiceLive.layer,
GroupsResponderADMLive.layer,
HandlerMapper.layer,
HttpServer.layer,
Expand Down
4 changes: 4 additions & 0 deletions webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala
Expand Up @@ -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
Expand Down Expand Up @@ -106,6 +107,9 @@ object LayersLive {
ConstructTransformer.layer,
DspIngestClientLive.layer,
GravsearchTypeInspectionRunner.layer,
GroupsEndpoints.layer,
GroupsEndpointsHandler.layer,
GroupsRestServiceLive.layer,
GroupsResponderADMLive.layer,
HandlerMapper.layer,
HttpServer.layer,
Expand Down
Expand Up @@ -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

Expand Down Expand Up @@ -48,6 +49,7 @@ import org.knora.webapi.util.ZioHelper
/**
* Returns information about groups.
*/
@accessible
trait GroupsResponderADM {

/**
Expand Down
Expand Up @@ -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.
*/
Expand Down
Expand Up @@ -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 {
Expand Down
Expand Up @@ -9,14 +9,16 @@ import sttp.tapir.AnyEndpoint
import zio.ZLayer

final case class AdminApiEndpoints(
groupsEndpoints: GroupsEndpoints,
maintenanceEndpoints: MaintenanceEndpoints,
permissionsEndpoints: PermissionsEndpoints,
projectsEndpoints: ProjectsEndpoints,
usersEndpoints: UsersEndpoints
) {

val endpoints: Seq[AnyEndpoint] =
maintenanceEndpoints.endpoints ++
groupsEndpoints.endpoints ++
maintenanceEndpoints.endpoints ++
permissionsEndpoints.endpoints ++
projectsEndpoints.endpoints ++
usersEndpoints.endpoints
Expand Down
Expand Up @@ -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(_))
}
Expand Down
@@ -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]
}
@@ -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]
}
Expand Up @@ -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)
Expand Down
@@ -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]
}
Expand Up @@ -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
Expand Down Expand Up @@ -66,6 +67,7 @@ object DocsGenerator extends ZIOAppDefault {
ApiV2Endpoints.layer,
BaseEndpoints.layer,
DocsNoopAuthenticator.layer,
GroupsEndpoints.layer,
MaintenanceEndpoints.layer,
PermissionsEndpoints.layer,
ProjectsEndpoints.layer,
Expand Down

0 comments on commit e5285ea

Please sign in to comment.