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 authored Jan 9, 2024
1 parent 503b742 commit e5285ea
Show file tree
Hide file tree
Showing 12 changed files with 111 additions and 23 deletions.
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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]
}
Original file line number Diff line number Diff line change
@@ -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]
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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]
}
Original file line number Diff line number Diff line change
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.