Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Migrate getAllGroups route to tapir (DEV-1588) #2984

Merged
merged 13 commits into from
Jan 9, 2024
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 @@ -151,6 +152,9 @@ object LayersTest {
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 @@ -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 @@ -101,6 +102,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 @@ -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,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 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)
}

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,17 +15,14 @@ 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)

}

object UsersEndpoints {
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]
}