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 3c5c98aeba..05541fa5d5 100644 --- a/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala +++ b/integration/src/test/scala/org/knora/webapi/core/LayersTest.scala @@ -28,19 +28,13 @@ import org.knora.webapi.responders.v2.ontology.CardinalityHandlerLive 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.AdminModule 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.AdminApiModule import org.knora.webapi.slice.admin.api.service.PermissionsRestService -import org.knora.webapi.slice.admin.api.service.ProjectADMRestService -import org.knora.webapi.slice.admin.api.service.ProjectsADMRestServiceLive -import org.knora.webapi.slice.admin.api.service.StoreRestService import org.knora.webapi.slice.admin.api.service.UsersRestService import org.knora.webapi.slice.admin.domain.service.* -import org.knora.webapi.slice.admin.domain.service.MaintenanceService -import org.knora.webapi.slice.admin.repo.service.KnoraGroupRepoLive -import org.knora.webapi.slice.admin.repo.service.KnoraProjectRepoLive -import org.knora.webapi.slice.admin.repo.service.KnoraUserRepoLive +import org.knora.webapi.slice.admin.domain.service.ProjectExportStorageService import org.knora.webapi.slice.common.api.* import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper import org.knora.webapi.slice.infrastructure.api.ManagementEndpoints @@ -54,7 +48,6 @@ import org.knora.webapi.slice.ontology.repo.service.OntologyCacheLive import org.knora.webapi.slice.ontology.repo.service.OntologyRepoLive import org.knora.webapi.slice.ontology.repo.service.PredicateRepositoryLive import org.knora.webapi.slice.resourceinfo.ResourceInfoLayers -import org.knora.webapi.slice.resourceinfo.api.service.RestResourceInfoService import org.knora.webapi.slice.resourceinfo.domain.IriConverter import org.knora.webapi.slice.search.api.SearchApiRoutes import org.knora.webapi.slice.search.api.SearchEndpoints @@ -80,86 +73,31 @@ object LayersTest { /** * The `Environment`s that we require for the tests to run - with or without Sipi */ - type DefaultTestEnvironmentWithoutSipi = LayersLive.DspEnvironmentLive with FusekiTestContainer with TestClientService - type DefaultTestEnvironmentWithSipi = DefaultTestEnvironmentWithoutSipi - with SipiTestContainer - with DspIngestTestContainer - with SharedVolumes.Images + type DefaultTestEnvironmentWithoutSipi = + LayersLive.DspEnvironmentLive & FusekiTestContainer & TestClientService + + type DefaultTestEnvironmentWithSipi = + DefaultTestEnvironmentWithoutSipi & SipiTestContainer & DspIngestTestContainer & SharedVolumes.Images + + type CommonR0 = + pekko.actor.ActorSystem & AppConfigurationsTest & JwtService & SipiService & StringFormatter - type CommonR0 = pekko.actor.ActorSystem - with AppConfigurationsTest - with JwtService - with SipiService - with StringFormatter type CommonR = - ApiRoutes - with AdminApiEndpoints - with ApiV2Endpoints - with AppRouter - with AssetPermissionsResponder - with Authenticator - with AuthorizationRestService - with CacheService - with CacheServiceRequestMessageHandler - with CardinalityHandler - with CardinalityService - with ConstructResponseUtilV2 - with ConstructTransformer - with DspIngestClient - with FilesEndpoints - with FilesEndpointsHandler - with GravsearchTypeInspectionRunner - with GroupsResponderADM - with GroupsService - with HttpServer - with IIIFRequestMessageHandler - with InferenceOptimizationService - with IriConverter - with IriService - with KnoraProjectRepoLive - with ListsResponder - with ListsResponderV2 - with MessageRelay - with OntologyCache - with OntologyHelpers - with OntologyInferencer - with OntologyRepo - with OntologyResponderV2 - with PasswordService - with PermissionUtilADM - with PermissionsResponderADM - with PermissionsRestService - with PredicateObjectMapper - with ProjectADMRestService - with ProjectService - with ProjectExportService - with ProjectExportStorageService - with ProjectImportService - with ProjectsResponderADM - with QueryTraverser - with RepositoryUpdater - with ResourceUtilV2 - with ResourcesResponderV2 - with RestCardinalityService - with RestResourceInfoService - with SearchApiRoutes - with SearchResponderV2 - with StandoffResponderV2 - with StandoffTagUtilV2 - with State - with StoreRestService - with TestClientService - with TriplestoreService - with UsersResponder - with UsersRestService - with KnoraUserService - with UserService - with ValuesResponderV2 + ApiRoutes & AdminApiEndpoints & ApiV2Endpoints & AppRouter & AssetPermissionsResponder & Authenticator & + AuthorizationRestService & CacheServiceRequestMessageHandler & CardinalityHandler & ConstructResponseUtilV2 & + DspIngestClient & GravsearchTypeInspectionRunner & GroupsResponderADM & HttpServer & IIIFRequestMessageHandler & + InferenceOptimizationService & IriConverter & ListsResponder & ListsResponderV2 & MessageRelay & OntologyCache & + OntologyHelpers & OntologyInferencer & OntologyRepo & OntologyResponderV2 & PermissionUtilADM & + PermissionsResponderADM & PermissionsRestService & ProjectExportService & ProjectExportStorageService & + ProjectImportService & ProjectService & ProjectsResponderADM & QueryTraverser & RepositoryUpdater & + ResourceUtilV2 & ResourcesResponderV2 & RestCardinalityService & SearchApiRoutes & SearchResponderV2 & + StandoffResponderV2 & StandoffTagUtilV2 & State & TestClientService & TriplestoreService & UserService & + UsersResponder & UsersRestService & ValuesResponderV2 private val commonLayersForAllIntegrationTests = ZLayer.makeSome[CommonR0, CommonR]( - AdminApiEndpoints.layer, - AdminApiRoutes.layer, + AdminModule.layer, + AdminApiModule.layer, ApiRoutes.layer, ApiV2Endpoints.layer, AppRouter.layer, @@ -174,35 +112,18 @@ object LayersTest { ConstructResponseUtilV2Live.layer, ConstructTransformer.layer, DspIngestClientLive.layer, - FilesEndpoints.layer, - FilesEndpointsHandler.layer, GravsearchTypeInspectionRunner.layer, - GroupsEndpoints.layer, - GroupsEndpointsHandler.layer, GroupsResponderADMLive.layer, - GroupsRestServiceLive.layer, - GroupsService.layer, HandlerMapper.layer, HttpServer.layer, IIIFRequestMessageHandlerLive.layer, InferenceOptimizationService.layer, IriConverter.layer, IriService.layer, - KnoraGroupRepoLive.layer, - KnoraProjectRepoLive.layer, KnoraResponseRenderer.layer, - KnoraUserRepoLive.layer, - KnoraUserService.layer, KnoraUserToUserConverter.layer, - ListRestService.layer, - ListsEndpoints.layer, - ListsEndpointsHandlers.layer, ListsResponder.layer, ListsResponderV2.layer, - MaintenanceEndpoints.layer, - MaintenanceEndpointsHandlers.layer, - MaintenanceRestService.layer, - MaintenanceService.layer, ManagementRoutes.layer, MessageRelayLive.layer, OntologyCacheLive.layer, @@ -210,21 +131,13 @@ object LayersTest { OntologyInferencer.layer, OntologyRepoLive.layer, OntologyResponderV2Live.layer, - PasswordService.layer, PermissionUtilADMLive.layer, - PermissionsEndpoints.layer, - PermissionsEndpointsHandlers.layer, PermissionsResponderADMLive.layer, - PermissionsRestService.layer, PredicateObjectMapper.layer, PredicateRepositoryLive.layer, - ProjectService.layer, ProjectExportServiceLive.layer, ProjectExportStorageServiceLive.layer, ProjectImportServiceLive.layer, - ProjectsADMRestServiceLive.layer, - ProjectsEndpoints.layer, - ProjectsEndpointsHandler.layer, ProjectsResponderADMLive.layer, QueryTraverser.layer, RepositoryUpdater.layer, @@ -238,31 +151,19 @@ object LayersTest { StandoffResponderV2Live.layer, StandoffTagUtilV2Live.layer, State.layer, - StoreEndpoints.layer, - StoreEndpointsHandler.layer, - StoreRestService.layer, TapirToPekkoInterpreter.layer, TestClientService.layer, TriplestoreServiceLive.layer, UserService.layer, - UsersEndpoints.layer, - UsersEndpointsHandler.layer, UsersResponder.layer, - UsersRestService.layer, ValuesResponderV2Live.layer, ManagementEndpoints.layer, ) private val fusekiAndSipiTestcontainers = ZLayer.make[ - AppConfigurations - with DspIngestTestContainer - with FusekiTestContainer - with JwtService - with SharedVolumes.Images - with SipiService - with SipiTestContainer - with StringFormatter, + AppConfigurations & DspIngestTestContainer & FusekiTestContainer & JwtService & SharedVolumes.Images & + SipiService & SipiTestContainer & StringFormatter, ]( AppConfigForTestContainers.testcontainers, DspIngestClientLive.layer, @@ -276,7 +177,7 @@ object LayersTest { ) private val fusekiTestcontainers = - ZLayer.make[FusekiTestContainer with AppConfigurations with JwtService with SipiService with StringFormatter]( + ZLayer.make[FusekiTestContainer & AppConfigurations & JwtService & SipiService & StringFormatter]( AppConfigForTestContainers.fusekiOnlyTestcontainer, FusekiTestContainer.layer, SipiServiceMock.layer, diff --git a/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala b/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala index 05fdcee907..71b9b20cfa 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala @@ -6,7 +6,11 @@ package org.knora.webapi.core import org.apache.pekko -import zio.* +import org.apache.pekko.actor.ActorRef +import org.apache.pekko.actor.Props +import org.apache.pekko.routing.RoundRobinPool +import zio.ZIO +import zio.ZLayer import org.knora.webapi.core import org.knora.webapi.messages.util.ConstructResponseUtilV2 @@ -15,36 +19,35 @@ import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 import org.knora.webapi.responders.v2.ResourceUtilV2 import org.knora.webapi.responders.v2.ontology.CardinalityHandler import org.knora.webapi.responders.v2.ontology.OntologyHelpers -import org.knora.webapi.settings.APPLICATION_MANAGER_ACTOR_NAME import org.knora.webapi.slice.ontology.domain.service.CardinalityService import org.knora.webapi.slice.ontology.domain.service.OntologyRepo import org.knora.webapi.slice.ontology.repo.service.OntologyCache -import pekko.actor.{ActorRef, Props} -import pekko.routing.RoundRobinPool - final case class AppRouter private (system: pekko.actor.ActorSystem, ref: ActorRef) object AppRouter { + val layer: ZLayer[ pekko.actor.ActorSystem & CardinalityHandler & CardinalityService & ConstructResponseUtilV2 & MessageRelay & OntologyCache & OntologyHelpers & OntologyRepo & PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2, Nothing, AppRouter, ] = - ZLayer { - for { - system <- ZIO.service[pekko.actor.ActorSystem] - messageRelay <- ZIO.service[MessageRelay] - runtime <- - ZIO.runtime[ - CardinalityHandler & CardinalityService & ConstructResponseUtilV2 & OntologyCache & OntologyHelpers & - OntologyRepo & PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2, - ] - ref = system.actorOf( - Props(core.actors.RoutingActor(messageRelay, runtime)).withRouter(new RoundRobinPool(1_000)), - name = APPLICATION_MANAGER_ACTOR_NAME, - ) - } yield AppRouter(system, ref) - }.tap(_ => ZIO.logInfo(">>> AppRouter Initialized <<<")) + ZLayer + .fromZIO( + for { + system <- ZIO.service[pekko.actor.ActorSystem] + messageRelay <- ZIO.service[MessageRelay] + runtime <- + ZIO.runtime[ + CardinalityHandler & CardinalityService & ConstructResponseUtilV2 & OntologyCache & OntologyHelpers & + OntologyRepo & PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2, + ] + ref = system.actorOf( + Props(core.actors.RoutingActor(messageRelay, runtime)).withRouter(new RoundRobinPool(1_000)), + "applicationManager", + ) + } yield AppRouter(system, ref), + ) + .tap(_ => ZIO.logInfo(">>> AppRouter Initialized <<<")) } 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 fefa458695..9b311cf68e 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala @@ -23,24 +23,19 @@ import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2Live import org.knora.webapi.responders.IriService import org.knora.webapi.responders.admin.* +import org.knora.webapi.responders.admin.ListsResponder import org.knora.webapi.responders.v2.* import org.knora.webapi.responders.v2.ontology.CardinalityHandler import org.knora.webapi.responders.v2.ontology.CardinalityHandlerLive 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.AdminModule 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.AdminApiModule import org.knora.webapi.slice.admin.api.service.PermissionsRestService -import org.knora.webapi.slice.admin.api.service.ProjectADMRestService -import org.knora.webapi.slice.admin.api.service.ProjectsADMRestServiceLive -import org.knora.webapi.slice.admin.api.service.StoreRestService import org.knora.webapi.slice.admin.api.service.UsersRestService import org.knora.webapi.slice.admin.domain.service.* -import org.knora.webapi.slice.admin.repo.service.KnoraGroupRepoLive -import org.knora.webapi.slice.admin.repo.service.KnoraProjectRepoLive -import org.knora.webapi.slice.admin.repo.service.KnoraUserRepoLive import org.knora.webapi.slice.common.api.* import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper import org.knora.webapi.slice.infrastructure.api.ManagementEndpoints @@ -48,13 +43,11 @@ import org.knora.webapi.slice.infrastructure.api.ManagementRoutes import org.knora.webapi.slice.ontology.api.service.RestCardinalityService import org.knora.webapi.slice.ontology.api.service.RestCardinalityServiceLive import org.knora.webapi.slice.ontology.domain.service.CardinalityService -import org.knora.webapi.slice.ontology.domain.service.OntologyRepo import org.knora.webapi.slice.ontology.repo.service.OntologyCache import org.knora.webapi.slice.ontology.repo.service.OntologyCacheLive import org.knora.webapi.slice.ontology.repo.service.OntologyRepoLive import org.knora.webapi.slice.ontology.repo.service.PredicateRepositoryLive import org.knora.webapi.slice.resourceinfo.ResourceInfoLayers -import org.knora.webapi.slice.resourceinfo.api.service.RestResourceInfoService import org.knora.webapi.slice.resourceinfo.domain.IriConverter import org.knora.webapi.slice.search.api.SearchApiRoutes import org.knora.webapi.slice.search.api.SearchEndpoints @@ -76,27 +69,25 @@ object LayersLive { */ type DspEnvironmentLive = ActorSystem & AdminApiEndpoints & ApiRoutes & ApiV2Endpoints & AppConfigurations & AppRouter & - AssetPermissionsResponder & Authenticator & AuthorizationRestService & CacheService & - CacheServiceRequestMessageHandler & CardinalityHandler & CardinalityService & ConstructResponseUtilV2 & - ConstructTransformer & GravsearchTypeInspectionRunner & GroupsService & GroupsResponderADM & HttpServer & + AssetPermissionsResponder & Authenticator & AuthorizationRestService & + CacheServiceRequestMessageHandler & CardinalityHandler & ConstructResponseUtilV2 & + GravsearchTypeInspectionRunner & GroupsResponderADM & HttpServer & IIIFRequestMessageHandler & InferenceOptimizationService & InstrumentationServerConfig & IriConverter & - IriService & JwtService & KnoraProjectRepo & KnoraUserService & ListsResponder & ListsResponderV2 & - MessageRelay & OntologyCache & OntologyHelpers & OntologyInferencer & OntologyRepo & OntologyResponderV2 & - PasswordService & PermissionsResponderADM & PermissionsRestService & PermissionUtilADM & PredicateObjectMapper & - ProjectADMRestService & ProjectService & ProjectExportService & ProjectExportStorageService & + JwtService & ListsResponder & ListsResponderV2 & MessageRelay & OntologyCache & OntologyHelpers & + OntologyInferencer & OntologyResponderV2 & PermissionsResponderADM & PermissionsRestService & + PermissionUtilADM & ProjectExportService & ProjectExportStorageService & ProjectImportService & ProjectsResponderADM & QueryTraverser & RepositoryUpdater & ResourcesResponderV2 & - ResourceUtilV2 & ResourceUtilV2 & RestCardinalityService & RestResourceInfoService & SearchApiRoutes & - SearchResponderV2 & SipiService & StandoffResponderV2 & StandoffTagUtilV2 & State & StoreRestService & - StringFormatter & TriplestoreService & UserService & UsersResponder & UsersRestService & ValuesResponderV2 + ResourceUtilV2 & ResourceUtilV2 & RestCardinalityService & SearchApiRoutes & + SearchResponderV2 & SipiService & StandoffResponderV2 & StandoffTagUtilV2 & State & StringFormatter & + TriplestoreService & UserService & UsersResponder & UsersRestService & ValuesResponderV2 /** * All effect layers needed to provide the `Environment` */ val dspLayersLive: ULayer[DspEnvironmentLive] = ZLayer.make[DspEnvironmentLive]( - org.knora.webapi.core.ActorSystem.layer, - AdminApiEndpoints.layer, - AdminApiRoutes.layer, + AdminApiModule.layer, + AdminModule.layer, ApiRoutes.layer, ApiV2Endpoints.layer, AppConfig.layer, @@ -112,14 +103,8 @@ object LayersLive { ConstructResponseUtilV2Live.layer, ConstructTransformer.layer, DspIngestClientLive.layer, - FilesEndpoints.layer, - FilesEndpointsHandler.layer, GravsearchTypeInspectionRunner.layer, - GroupsEndpoints.layer, - GroupsEndpointsHandler.layer, GroupsResponderADMLive.layer, - GroupsRestServiceLive.layer, - GroupsService.layer, HandlerMapper.layer, HttpServer.layer, IIIFRequestMessageHandlerLive.layer, @@ -127,21 +112,11 @@ object LayersLive { IriConverter.layer, IriService.layer, JwtServiceLive.layer, - KnoraGroupRepoLive.layer, - KnoraProjectRepoLive.layer, KnoraResponseRenderer.layer, - KnoraUserRepoLive.layer, - KnoraUserService.layer, KnoraUserToUserConverter.layer, - ListRestService.layer, - ListsEndpoints.layer, - ListsEndpointsHandlers.layer, ListsResponder.layer, ListsResponderV2.layer, - MaintenanceEndpoints.layer, - MaintenanceEndpointsHandlers.layer, - MaintenanceRestService.layer, - MaintenanceService.layer, + ManagementEndpoints.layer, ManagementRoutes.layer, MessageRelayLive.layer, OntologyCacheLive.layer, @@ -149,21 +124,13 @@ object LayersLive { OntologyInferencer.layer, OntologyRepoLive.layer, OntologyResponderV2Live.layer, - PasswordService.layer, PermissionUtilADMLive.layer, - PermissionsEndpoints.layer, - PermissionsEndpointsHandlers.layer, PermissionsResponderADMLive.layer, - PermissionsRestService.layer, PredicateObjectMapper.layer, PredicateRepositoryLive.layer, - ProjectService.layer, ProjectExportServiceLive.layer, ProjectExportStorageServiceLive.layer, ProjectImportServiceLive.layer, - ProjectsADMRestServiceLive.layer, - ProjectsEndpoints.layer, - ProjectsEndpointsHandler.layer, ProjectsResponderADMLive.layer, QueryTraverser.layer, RepositoryUpdater.layer, @@ -178,18 +145,12 @@ object LayersLive { StandoffResponderV2Live.layer, StandoffTagUtilV2Live.layer, State.layer, - StoreEndpoints.layer, - StoreEndpointsHandler.layer, - StoreRestService.layer, StringFormatter.live, TapirToPekkoInterpreter.layer, TriplestoreServiceLive.layer, UserService.layer, - UsersEndpoints.layer, - UsersEndpointsHandler.layer, UsersResponder.layer, - UsersRestService.layer, ValuesResponderV2Live.layer, - ManagementEndpoints.layer, + org.knora.webapi.core.ActorSystem.layer, ) } diff --git a/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala b/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala index 596326342f..eaec4dbfab 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/actors/RoutingActor.scala @@ -5,7 +5,7 @@ package org.knora.webapi.core.actors -import org.apache.pekko +import org.apache.pekko.actor.Actor import zio.* import dsp.errors.UnexpectedMessageException @@ -14,7 +14,7 @@ import org.knora.webapi.core.RelayedMessage import org.knora.webapi.messages.util.ConstructResponseUtilV2 import org.knora.webapi.messages.util.PermissionUtilADM import org.knora.webapi.messages.util.standoff.StandoffTagUtilV2 -import org.knora.webapi.responders.v2.* +import org.knora.webapi.responders.v2.ResourceUtilV2 import org.knora.webapi.responders.v2.ontology.CardinalityHandler import org.knora.webapi.responders.v2.ontology.OntologyHelpers import org.knora.webapi.slice.ontology.domain.service.CardinalityService @@ -22,8 +22,6 @@ import org.knora.webapi.slice.ontology.domain.service.OntologyRepo import org.knora.webapi.slice.ontology.repo.service.OntologyCache import org.knora.webapi.util.ActorUtil -import pekko.actor.Actor - final case class RoutingActor( messageRelay: MessageRelay, implicit val runtime: Runtime[ @@ -31,6 +29,7 @@ final case class RoutingActor( PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2, ], ) extends Actor { + def receive: Receive = { case msg: RelayedMessage => ActorUtil.zio2Message(sender(), messageRelay.ask[Any](msg)) case other => diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponder.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponder.scala index 84afd62ecf..83b613205e 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponder.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ListsResponder.scala @@ -33,7 +33,7 @@ import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.ListProperties.ListIri import org.knora.webapi.slice.admin.domain.model.ListProperties.ListName import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.admin.domain.service.ProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper @@ -48,7 +48,7 @@ final case class ListsResponder( appConfig: AppConfig, auth: AuthorizationRestService, iriService: IriService, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, mapper: PredicateObjectMapper, triplestore: TriplestoreService, implicit val stringFormatter: StringFormatter, @@ -589,7 +589,7 @@ final case class ListsResponder( for { /* Verify that the project exists by retrieving it. We need the project information so that we can calculate the data graph and IRI for the new node. */ - project <- projectRepo + project <- knoraProjectService .findById(projectIri) .someOrFail(BadRequestException(s"Project '$projectIri' not found.")) @@ -758,7 +758,7 @@ final case class ListsResponder( private def ensureUserIsAdminOrProjectOwner(listIri: ListIri, user: User): Task[KnoraProject] = getProjectIriFromNode(listIri.value) - .flatMap(projectRepo.findById) + .flatMap(knoraProjectService.findById) .someOrFail(BadRequestException(s"Project not found for node $listIri")) .tap(auth.ensureSystemAdminOrProjectAdmin(user, _)) @@ -1505,7 +1505,7 @@ final case class ListsResponder( * @return an [[IRI]]. */ private def getDataNamedGraph(projectIri: ProjectIri): Task[IRI] = - projectRepo + knoraProjectService .findById(projectIri) .someOrFail(BadRequestException(s"Project '$projectIri' not found.")) .map(ProjectService.projectDataNamedGraphV2(_).value) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala index f7227cbc69..8f544f8e54 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/PermissionsResponderADM.scala @@ -45,7 +45,7 @@ import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode import org.knora.webapi.slice.admin.domain.model.PermissionIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.store.triplestore.api.TriplestoreService import org.knora.webapi.store.triplestore.api.TriplestoreService.Queries.Ask @@ -242,7 +242,7 @@ final case class PermissionsResponderADMLive( iriService: IriService, messageRelay: MessageRelay, triplestore: TriplestoreService, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, auth: AuthorizationRestService, implicit val stringFormatter: StringFormatter, ) extends PermissionsResponderADM @@ -1529,7 +1529,7 @@ final case class PermissionsResponderADMLive( projectIri <- ZIO .fromEither(ProjectIri.from(createRequest.forProject)) .mapError(BadRequestException.apply) - project <- projectRepo + project <- knoraProjectService .findById(projectIri) .someOrFail(NotFoundException(s"Project ${projectIri.value} not found")) _ <- auth.ensureSystemAdminSystemUserOrProjectAdmin(user, project) @@ -2224,14 +2224,14 @@ final case class PermissionsResponderADMLive( object PermissionsResponderADMLive { val layer: URLayer[ - AppConfig & AuthorizationRestService & IriService & KnoraProjectRepo & MessageRelay & StringFormatter & TriplestoreService, + AppConfig & AuthorizationRestService & IriService & KnoraProjectService & MessageRelay & StringFormatter & TriplestoreService, PermissionsResponderADMLive, ] = ZLayer.fromZIO { for { au <- ZIO.service[AuthorizationRestService] ac <- ZIO.service[AppConfig] is <- ZIO.service[IriService] - kpr <- ZIO.service[KnoraProjectRepo] + kpr <- ZIO.service[KnoraProjectService] mr <- ZIO.service[MessageRelay] ts <- ZIO.service[TriplestoreService] sf <- ZIO.service[StringFormatter] diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala index 54b913ba8e..090ace9a6a 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/OntologyResponderV2.scala @@ -21,7 +21,6 @@ import org.knora.webapi.core.MessageHandler import org.knora.webapi.core.MessageRelay import org.knora.webapi.messages.* import org.knora.webapi.messages.IriConversions.* -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.triplestoremessages.SmartIriLiteralV2 import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.twirl.queries.sparql @@ -37,7 +36,7 @@ import org.knora.webapi.responders.v2.ontology.CardinalityHandler import org.knora.webapi.responders.v2.ontology.OntologyHelpers import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.ontology.domain.service.CardinalityService import org.knora.webapi.slice.ontology.domain.service.OntologyRepo import org.knora.webapi.slice.ontology.repo.service.OntologyCache @@ -75,7 +74,7 @@ final case class OntologyResponderV2Live( ontologyCache: OntologyCache, ontologyHelpers: OntologyHelpers, ontologyRepo: OntologyRepo, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, triplestoreService: TriplestoreService, cacheService: CacheService, implicit val stringFormatter: StringFormatter, @@ -542,8 +541,9 @@ final case class OntologyResponderV2Live( ) // Make the internal ontology IRI. - projectId <- IriIdentifier.fromString(projectIri.toString).toZIO.mapError(e => BadRequestException(e.getMessage)) - project <- projectRepo.findById(projectId).someOrFail(BadRequestException(s"Project not found: $projectIri")) + projectId <- ZIO.fromEither(ProjectIri.from(projectIri.toString)).mapError(e => BadRequestException(e)) + project <- + knoraProjectService.findById(projectId).someOrFail(BadRequestException(s"Project not found: $projectIri")) internalOntologyIri = stringFormatter.makeProjectSpecificInternalOntologyIri( validOntologyName, createOntologyRequest.isShared, @@ -2967,7 +2967,7 @@ final case class OntologyResponderV2Live( object OntologyResponderV2Live { val layer: URLayer[ - AppConfig & CardinalityHandler & CardinalityService & IriService & KnoraProjectRepo & MessageRelay & OntologyCache & + AppConfig & CardinalityHandler & CardinalityService & IriService & KnoraProjectService & MessageRelay & OntologyCache & OntologyHelpers & OntologyRepo & StringFormatter & TriplestoreService & CacheService, OntologyResponderV2, ] = ZLayer.fromZIO { @@ -2976,7 +2976,7 @@ object OntologyResponderV2Live { ch <- ZIO.service[CardinalityHandler] cs <- ZIO.service[CardinalityService] is <- ZIO.service[IriService] - kr <- ZIO.service[KnoraProjectRepo] + kr <- ZIO.service[KnoraProjectService] oc <- ZIO.service[OntologyCache] oh <- ZIO.service[OntologyHelpers] or <- ZIO.service[OntologyRepo] diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala index 3616c8069e..12c96e3f7d 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/ResourcesResponderV2.scala @@ -7,6 +7,7 @@ package org.knora.webapi.responders.v2 import com.typesafe.scalalogging.LazyLogging import zio.* +import zio.ZIO import java.time.Instant import java.util.UUID @@ -22,7 +23,6 @@ import org.knora.webapi.core.MessageHandler import org.knora.webapi.core.MessageRelay import org.knora.webapi.messages.* import org.knora.webapi.messages.IriConversions.* -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileRequest import org.knora.webapi.messages.store.sipimessages.SipiGetTextFileResponse import org.knora.webapi.messages.twirl.queries.sparql @@ -44,8 +44,9 @@ import org.knora.webapi.responders.IriLocker import org.knora.webapi.responders.IriService import org.knora.webapi.responders.Responder import org.knora.webapi.responders.v2.resources.CreateResourceV2Handler +import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.admin.domain.service.ProjectService import org.knora.webapi.store.iiif.errors.SipiException import org.knora.webapi.store.triplestore.api.TriplestoreService @@ -86,7 +87,7 @@ final case class ResourcesResponderV2Live( standoffTagUtilV2: StandoffTagUtilV2, resourceUtilV2: ResourceUtilV2, permissionUtilADM: PermissionUtilADM, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, searchResponderV2: SearchResponderV2, implicit val stringFormatter: StringFormatter, ) extends ResourcesResponderV2 @@ -153,7 +154,6 @@ final case class ResourcesResponderV2Live( standoffTagUtilV2, resourceUtilV2, permissionUtilADM, - projectRepo, searchResponderV2, this, stringFormatter, @@ -1551,14 +1551,15 @@ final case class ResourcesResponderV2Live( ): Task[ResourceAndValueVersionHistoryResponseV2] = for { // Get the project; checks if a project with given IRI exists. - projectId <- IriIdentifier - .fromString(projectResourceHistoryEventsGetRequest.projectIri) - .toZIO - .mapError(e => BadRequestException(e.getMessage)) - _ <- projectRepo.findById(projectId).someOrFail(NotFoundException(s"Project ${projectId.value.value} not found")) + projectId <- ZIO + .fromEither(ProjectIri.from(projectResourceHistoryEventsGetRequest.projectIri)) + .mapError(e => BadRequestException(e)) + _ <- knoraProjectService + .findById(projectId) + .someOrFail(NotFoundException(s"Project ${projectId.value} not found")) // Do a SELECT prequery to get the IRIs of the resources that belong to the project. - prequery = sparql.v2.txt.getAllResourcesInProjectPrequery(projectId.value.value) + prequery = sparql.v2.txt.getAllResourcesInProjectPrequery(projectId.value) sparqlSelectResponse <- triplestore.query(Select(prequery)) mainResourceIris = sparqlSelectResponse.results.bindings.map(_.rowMap("resource")) // For each resource IRI return history events @@ -1996,7 +1997,7 @@ final case class ResourcesResponderV2Live( object ResourcesResponderV2Live { val layer: URLayer[ - AppConfig & ConstructResponseUtilV2 & IriService & KnoraProjectRepo & MessageRelay & PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2 & SearchResponderV2 & StringFormatter & TriplestoreService, + AppConfig & ConstructResponseUtilV2 & IriService & KnoraProjectService & MessageRelay & PermissionUtilADM & ResourceUtilV2 & StandoffTagUtilV2 & SearchResponderV2 & StringFormatter & TriplestoreService, ResourcesResponderV2, ] = ZLayer.fromZIO { for { @@ -2008,7 +2009,7 @@ object ResourcesResponderV2Live { su <- ZIO.service[StandoffTagUtilV2] ru <- ZIO.service[ResourceUtilV2] pu <- ZIO.service[PermissionUtilADM] - pr <- ZIO.service[KnoraProjectRepo] + pr <- ZIO.service[KnoraProjectService] sr <- ZIO.service[SearchResponderV2] sf <- ZIO.service[StringFormatter] handler <- mr.subscribe(ResourcesResponderV2Live(config, iriS, mr, ts, cu, su, ru, pu, pr, sr, sf)) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/v2/resources/CreateResourceV2Handler.scala b/webapi/src/main/scala/org/knora/webapi/responders/v2/resources/CreateResourceV2Handler.scala index 89a6cbe614..34603d65df 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/v2/resources/CreateResourceV2Handler.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/v2/resources/CreateResourceV2Handler.scala @@ -37,7 +37,6 @@ import org.knora.webapi.responders.IriService import org.knora.webapi.responders.v2.* import org.knora.webapi.responders.v2.resources.CheckObjectClassConstraints import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo import org.knora.webapi.slice.admin.domain.service.ProjectService import org.knora.webapi.slice.ontology.domain.model.Cardinality.AtLeastOne import org.knora.webapi.slice.ontology.domain.model.Cardinality.ExactlyOne @@ -55,7 +54,6 @@ final case class CreateResourceV2Handler( standoffTagUtilV2: StandoffTagUtilV2, resourceUtilV2: ResourceUtilV2, permissionUtilADM: PermissionUtilADM, - projectRepo: KnoraProjectRepo, searchResponderV2: SearchResponderV2, getResources: GetResources, implicit val stringFormatter: StringFormatter, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala b/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala index edc5e047bb..7b5d5f808b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/ApiRoutes.scala @@ -25,15 +25,11 @@ import org.knora.webapi.responders.v2.ValuesResponderV2 import org.knora.webapi.routing import org.knora.webapi.routing.v2.* import org.knora.webapi.slice.admin.api.AdminApiRoutes -import org.knora.webapi.slice.admin.api.ProjectsEndpointsHandler -import org.knora.webapi.slice.admin.api.service.ProjectADMRestService -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo import org.knora.webapi.slice.admin.domain.service.UserService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.infrastructure.api.ManagementRoutes import org.knora.webapi.slice.ontology.api.service.RestCardinalityService import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoutes -import org.knora.webapi.slice.resourceinfo.api.service.RestResourceInfoService import org.knora.webapi.slice.resourceinfo.domain.IriConverter import org.knora.webapi.slice.search.api.SearchApiRoutes import org.knora.webapi.store.iiif.api.SipiService @@ -48,7 +44,7 @@ object ApiRoutes { * All routes composed together. */ val layer: URLayer[ - ActorSystem & AuthorizationRestService & AdminApiRoutes & AppConfig & AppRouter & core.State & IriConverter & KnoraProjectRepo & MessageRelay & ManagementRoutes & ProjectADMRestService & ProjectsEndpointsHandler & ResourceInfoRoutes & RestCardinalityService & RestResourceInfoService & routing.Authenticator & SearchApiRoutes & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, + ActorSystem & AuthorizationRestService & AdminApiRoutes & AppConfig & AppRouter & core.State & IriConverter & MessageRelay & ManagementRoutes & ResourceInfoRoutes & RestCardinalityService & routing.Authenticator & SearchApiRoutes & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, ApiRoutes, ] = ZLayer { @@ -63,7 +59,7 @@ object ApiRoutes { routeData <- ZIO.succeed(KnoraRouteData(sys, router.ref, appConfig)) runtime <- ZIO.runtime[ - AppConfig & AuthorizationRestService & core.State & IriConverter & KnoraProjectRepo & MessageRelay & ProjectADMRestService & RestCardinalityService & RestResourceInfoService & routing.Authenticator & SearchApiRoutes & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, + AppConfig & AuthorizationRestService & core.State & IriConverter & MessageRelay & RestCardinalityService & routing.Authenticator & SearchApiRoutes & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, ] } yield ApiRoutesImpl( routeData, @@ -92,7 +88,7 @@ private final case class ApiRoutesImpl( managementRoutes: ManagementRoutes, appConfig: AppConfig, implicit val runtime: Runtime[ - AppConfig & AuthorizationRestService & core.State & IriConverter & KnoraProjectRepo & MessageRelay & ProjectADMRestService & RestCardinalityService & RestResourceInfoService & routing.Authenticator & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, + AppConfig & AuthorizationRestService & core.State & IriConverter & MessageRelay & RestCardinalityService & routing.Authenticator & SearchResponderV2 & SipiService & StringFormatter & UserService & ValuesResponderV2, ], ) extends ApiRoutes with AroundDirectives { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala index b7d8028475..85efc4f68f 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala @@ -37,7 +37,6 @@ import org.knora.webapi.routing.RouteUtilV2 import org.knora.webapi.routing.RouteUtilZ import org.knora.webapi.slice.admin.domain.service.UserService import org.knora.webapi.slice.common.api.ApiV2.Headers.xKnoraAcceptProject -import org.knora.webapi.slice.resourceinfo.api.service.RestResourceInfoService import org.knora.webapi.slice.resourceinfo.domain.IriConverter import org.knora.webapi.store.iiif.api.SipiService @@ -46,7 +45,7 @@ import org.knora.webapi.store.iiif.api.SipiService */ final case class ResourcesRouteV2(appConfig: AppConfig)( private implicit val runtime: Runtime[ - AppConfig & Authenticator & IriConverter & MessageRelay & RestResourceInfoService & SearchResponderV2 & SipiService & StringFormatter & UserService, + AppConfig & Authenticator & IriConverter & MessageRelay & SearchResponderV2 & SipiService & StringFormatter & UserService, ], ) extends LazyLogging { private val sipiConfig: Sipi = appConfig.sipi diff --git a/webapi/src/main/scala/org/knora/webapi/settings/package.scala b/webapi/src/main/scala/org/knora/webapi/settings/package.scala deleted file mode 100644 index e0d37c7ca3..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/settings/package.scala +++ /dev/null @@ -1,116 +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 - -package object settings { - - val APPLICATION_MANAGER_ACTOR_NAME = "applicationManager" - val APPLICATION_MANAGER_ACTOR_PATH = "/user/" + APPLICATION_MANAGER_ACTOR_NAME - - val RESPONDER_MANAGER_ACTOR_NAME: String = "responderManager" - val RESPONDER_MANAGER_ACTOR_PATH: String = "/user/" + APPLICATION_MANAGER_ACTOR_NAME + RESPONDER_MANAGER_ACTOR_NAME - - val RESOURCES_V1_ACTOR_NAME: String = "resourcesV1" - val RESOURCES_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + RESOURCES_V1_ACTOR_NAME - - val VALUES_V1_ACTOR_NAME: String = "valuesV1" - val VALUES_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + VALUES_V1_ACTOR_NAME - - val SIPI_ROUTER_V1_ACTOR_NAME: String = "sipiRouterV1" - val SIPI_ROUTER_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + SIPI_ROUTER_V1_ACTOR_NAME - - val STANDOFF_V1_ACTOR_NAME: String = "standoffV1" - val STANDOFF_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + STANDOFF_V1_ACTOR_NAME - - val USERS_V1_ACTOR_NAME: String = "usersV1" - val USERS_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + USERS_V1_ACTOR_NAME - - val LISTS_V1_ACTOR_NAME: String = "listsV1" - val LISTS_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + LISTS_V1_ACTOR_NAME - - val SEARCH_V1_ACTOR_NAME: String = "searchV1" - val SEARCH_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + SEARCH_V1_ACTOR_NAME - - val ONTOLOGY_V1_ACTOR_NAME: String = "ontologyV1" - val ONTOLOGY_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + ONTOLOGY_V1_ACTOR_NAME - - val PROJECTS_V1_ACTOR_NAME: String = "projectsV1" - val PROJECTS_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + PROJECTS_V1_ACTOR_NAME - - val CKAN_V1_ACTOR_NAME: String = "ckanV1" - val CKAN_V1_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + CKAN_V1_ACTOR_NAME - - // ------------------------------------------------------------------------------------------ - // --------------------------------------- V2 Routers --------------------------------------- - // ------------------------------------------------------------------------------------------ - - val ONTOLOGY_V2_ACTOR_NAME: String = "ontologyV2" - val ONTOLOGY_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + ONTOLOGY_V2_ACTOR_NAME - - val SEARCH_V2_ACTOR_NAME: String = "searchV2" - val SEARCH_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + SEARCH_V2_ACTOR_NAME - - val RESOURCES_V2_ACTOR_NAME: String = "resourcesV2" - val RESOURCES_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + RESOURCES_V2_ACTOR_NAME - - val VALUES_V2_ACTOR_NAME: String = "valuesV2" - val VALUES_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + VALUES_V2_ACTOR_NAME - - val PERSISTENT_MAP_V2_ACTOR_NAME: String = "persistentMapV2" - val PERSISTENT_MAP_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + PERSISTENT_MAP_V2_ACTOR_NAME - - val STANDOFF_V2_ACTOR_NAME: String = "standoffV2" - val STANDOFF_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + STANDOFF_V2_ACTOR_NAME - - val LISTS_V2_ACTOR_NAME: String = "listsV2" - val LISTS_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + LISTS_V2_ACTOR_NAME - - val SIPI_ROUTER_V2_ACTOR_NAME: String = "sipiRouterV2" - val SIPI_ROUTER_V2_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + SIPI_ROUTER_V2_ACTOR_NAME - - // ------------------------------------------------------------------------------------------ - // ------------------------------------- Admin Routers -------------------------------------- - // ------------------------------------------------------------------------------------------ - - val GROUPS_ADM_ACTOR_NAME: String = "groupsADM" - val GROUPS_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + GROUPS_ADM_ACTOR_NAME - - val LISTS_ADM_ACTOR_NAME: String = "listsADM" - val LISTS_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + LISTS_ADM_ACTOR_NAME - - val ONTOLOGIES_ADM_ACTOR_NAME: String = "ontologiesADM" - val ONTOLOGIES_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + ONTOLOGIES_ADM_ACTOR_NAME - - val PERMISSIONS_ADM_ACTOR_NAME: String = "permissionsADM" - val PERMISSIONS_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + PERMISSIONS_ADM_ACTOR_NAME - - val PROJECTS_ADM_ACTOR_NAME: String = "projectsADM" - val PROJECTS_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + PROJECTS_ADM_ACTOR_NAME - - val STORE_ADM_ACTOR_NAME: String = "storeADM" - val STORE_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + STORE_ADM_ACTOR_NAME - - val USERS_ADM_ACTOR_NAME: String = "usersADM" - val USERS_ADM_ACTOR_PATH: String = RESPONDER_MANAGER_ACTOR_PATH + "/" + USERS_ADM_ACTOR_NAME - - val StoreManagerActorName: String = "storeManager" - val StoreManagerActorPath: String = "/user/" + APPLICATION_MANAGER_ACTOR_NAME + StoreManagerActorName - - /* Triplestores */ - - val TriplestoreManagerActorName: String = "triplestoreManager" - val TriplestoreManagerActorPath: String = StoreManagerActorPath + "/" + TriplestoreManagerActorName - - val HttpTriplestoreActorName: String = "httpTriplestoreRouter" - val FakeTriplestoreActorName: String = "fakeTriplestore" - - /* Sipi */ - - val IIIFManagerActorName: String = "iiifManager" - val IIIFManagerActorPath: String = StoreManagerActorPath + "/" + IIIFManagerActorName - - val SipiConnectorActorName: String = "sipiConnector" -} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/AdminModule.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/AdminModule.scala new file mode 100644 index 0000000000..198009acae --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/AdminModule.scala @@ -0,0 +1,34 @@ +/* + * 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 + +import zio.ZLayer + +import org.knora.webapi.config.AppConfig +import org.knora.webapi.responders.IriService +import org.knora.webapi.slice.admin.domain.AdminDomainModule +import org.knora.webapi.slice.admin.domain.service.* +import org.knora.webapi.slice.admin.domain.service.GroupService +import org.knora.webapi.slice.admin.domain.service.KnoraGroupService +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService +import org.knora.webapi.slice.admin.domain.service.PasswordService +import org.knora.webapi.slice.admin.domain.service.ProjectService +import org.knora.webapi.slice.admin.repo.AdminRepoModule +import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper +import org.knora.webapi.slice.ontology.domain.service.OntologyRepo +import org.knora.webapi.store.cache.CacheService +import org.knora.webapi.store.triplestore.api.TriplestoreService + +object AdminModule { + + type Dependencies = + AppConfig & CacheService & IriService & OntologyRepo & PredicateObjectMapper & TriplestoreService + + type Provided = + GroupService & KnoraGroupService & KnoraProjectService & KnoraUserService & MaintenanceService & PasswordService & ProjectService + + val layer: ZLayer[Dependencies, Nothing, Provided] = AdminRepoModule.layer >>> AdminDomainModule.layer +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiModule.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiModule.scala new file mode 100644 index 0000000000..66aecaf4b8 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/AdminApiModule.scala @@ -0,0 +1,73 @@ +/* + * 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.config.AppConfig +import org.knora.webapi.responders.admin.AssetPermissionsResponder +import org.knora.webapi.responders.admin.GroupsResponderADM +import org.knora.webapi.responders.admin.ListsResponder +import org.knora.webapi.responders.admin.PermissionsResponderADM +import org.knora.webapi.responders.admin.ProjectsResponderADM +import org.knora.webapi.responders.admin.UsersResponder +import org.knora.webapi.slice.admin.api.service.GroupsRestService +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.ProjectRestService +import org.knora.webapi.slice.admin.api.service.StoreRestService +import org.knora.webapi.slice.admin.api.service.UsersRestService +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService +import org.knora.webapi.slice.admin.domain.service.KnoraUserService +import org.knora.webapi.slice.admin.domain.service.KnoraUserToUserConverter +import org.knora.webapi.slice.admin.domain.service.MaintenanceService +import org.knora.webapi.slice.admin.domain.service.PasswordService +import org.knora.webapi.slice.admin.domain.service.ProjectExportService +import org.knora.webapi.slice.admin.domain.service.ProjectImportService +import org.knora.webapi.slice.admin.domain.service.ProjectService +import org.knora.webapi.slice.admin.domain.service.UserService +import org.knora.webapi.slice.common.api.* +import org.knora.webapi.slice.common.api.KnoraResponseRenderer +import org.knora.webapi.slice.ontology.repo.service.OntologyCache +import org.knora.webapi.store.cache.CacheService +import org.knora.webapi.store.triplestore.api.TriplestoreService + +object AdminApiModule { + + type Dependencies = + AppConfig & AssetPermissionsResponder & AuthorizationRestService & BaseEndpoints & CacheService & GroupsResponderADM & HandlerMapper & KnoraProjectService & KnoraResponseRenderer & KnoraUserService & KnoraUserToUserConverter & ListsResponder & MaintenanceService & OntologyCache & PasswordService & PermissionsResponderADM & ProjectExportService & ProjectImportService & ProjectService & ProjectsResponderADM & TapirToPekkoInterpreter & TriplestoreService & UserService & UsersResponder + + type Provided = AdminApiEndpoints & AdminApiRoutes & UsersRestService & PermissionsRestService + + val layer: ZLayer[Dependencies, Nothing, Provided] = + ZLayer.makeSome[Dependencies, Provided]( + AdminApiEndpoints.layer, + AdminApiRoutes.layer, + FilesEndpoints.layer, + FilesEndpointsHandler.layer, + GroupsEndpoints.layer, + GroupsEndpointsHandler.layer, + GroupsRestService.layer, + ListRestService.layer, + ListsEndpoints.layer, + ListsEndpointsHandlers.layer, + MaintenanceRestService.layer, + MaintenanceEndpoints.layer, + MaintenanceEndpointsHandlers.layer, + PermissionsEndpoints.layer, + PermissionsEndpointsHandlers.layer, + PermissionsRestService.layer, + ProjectRestService.layer, + ProjectsEndpoints.layer, + ProjectsEndpointsHandler.layer, + StoreRestService.layer, + StoreEndpoints.layer, + StoreEndpointsHandler.layer, + UsersRestService.layer, + UsersEndpoints.layer, + UsersEndpointsHandler.layer, + ) +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ListsEndpointsHandlers.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ListsEndpointsHandlers.scala index abee5dff30..46495cbb79 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ListsEndpointsHandlers.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ListsEndpointsHandlers.scala @@ -23,7 +23,7 @@ import org.knora.webapi.slice.admin.api.Requests.* import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.ListProperties.ListIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.api.HandlerMapper import org.knora.webapi.slice.common.api.PublicEndpointHandler @@ -32,11 +32,11 @@ import org.knora.webapi.slice.common.api.SecuredEndpointHandler final case class ListRestService( auth: AuthorizationRestService, listsResponder: ListsResponder, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, ) { def listChange(iri: ListIri, request: ListChangeRequest, user: User): Task[NodeInfoGetResponseADM] = for { _ <- ZIO.fail(BadRequestException("List IRI in path and body must match")).when(iri != request.listIri) - project <- projectRepo + project <- knoraProjectService .findById(request.projectIri) .someOrFail(BadRequestException("Project not found")) _ <- auth.ensureSystemAdminOrProjectAdmin(user, project) @@ -80,7 +80,7 @@ final case class ListRestService( } yield response def listCreateRootNode(req: ListCreateRootNodeRequest, user: User): Task[ListGetResponseADM] = for { - project <- projectRepo + project <- knoraProjectService .findById(req.projectIri) .someOrFail(BadRequestException("Project not found")) _ <- auth.ensureSystemAdminOrProjectAdmin(user, project) @@ -89,7 +89,7 @@ final case class ListRestService( } yield response def listCreateChildNode(req: ListCreateChildNodeRequest, user: User): Task[ChildNodeInfoGetResponseADM] = for { - project <- projectRepo + project <- knoraProjectService .findById(req.projectIri) .someOrFail(BadRequestException("Project not found")) _ <- auth.ensureSystemAdminOrProjectAdmin(user, project) diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpointsHandler.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpointsHandler.scala index 2cb3f3b525..6d0640e2a5 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpointsHandler.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/ProjectsEndpointsHandler.scala @@ -19,7 +19,7 @@ import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndRespon import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.ProjectUpdateRequest import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.RestrictedViewResponse import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.SetRestrictedViewRequest -import org.knora.webapi.slice.admin.api.service.ProjectADMRestService +import org.knora.webapi.slice.admin.api.service.ProjectRestService import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.common.api.HandlerMapper import org.knora.webapi.slice.common.api.PublicEndpointHandler @@ -27,7 +27,7 @@ import org.knora.webapi.slice.common.api.SecuredEndpointHandler final case class ProjectsEndpointsHandler( projectsEndpoints: ProjectsEndpoints, - restService: ProjectADMRestService, + restService: ProjectRestService, mapper: HandlerMapper, ) { @@ -154,19 +154,19 @@ final case class ProjectsEndpointsHandler( val postAdminProjectsByShortcodeExportHandler = SecuredEndpointHandler( projectsEndpoints.Secured.postAdminProjectsByShortcodeExport, - user => (id: ShortcodeIdentifier) => restService.exportProject(id, user), + user => (id: ShortcodeIdentifier) => restService.exportProject(id.value, user), ) val postAdminProjectsByShortcodeExportAwaitingHandler = SecuredEndpointHandler( projectsEndpoints.Secured.postAdminProjectsByShortcodeExportAwaiting, - user => (id: ShortcodeIdentifier) => restService.exportProjectAwaiting(id, user), + user => (id: ShortcodeIdentifier) => restService.exportProjectAwaiting(id.value, user), ) val postAdminProjectsByShortcodeImportHandler = SecuredEndpointHandler( projectsEndpoints.Secured.postAdminProjectsByShortcodeImport, - user => (id: ShortcodeIdentifier) => restService.importProject(id, user), + user => (id: ShortcodeIdentifier) => restService.importProject(id.value, user), ) val postAdminProjectsHandler = 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 63f6abbcb1..db5cf8198a 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 @@ -19,27 +19,18 @@ import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.api.KnoraResponseRenderer -trait GroupsRestService { - def getGroups: Task[GroupsGetResponseADM] - def getGroupByIri(iri: GroupIri): Task[GroupGetResponseADM] - def getGroupMembers(iri: GroupIri, user: User): Task[GroupMembersGetResponseADM] - def postGroup(request: GroupCreateRequest, user: User): Task[GroupGetResponseADM] - def putGroup(iri: GroupIri, request: GroupUpdateRequest, user: User): Task[GroupGetResponseADM] - def putGroupStatus(iri: GroupIri, request: GroupStatusUpdateRequest, user: User): Task[GroupGetResponseADM] - def deleteGroup(iri: GroupIri, user: User): Task[GroupGetResponseADM] -} - -final case class GroupsRestServiceLive( +final case class GroupsRestService( auth: AuthorizationRestService, responder: GroupsResponderADM, format: KnoraResponseRenderer, -) extends GroupsRestService { - override def getGroups: Task[GroupsGetResponseADM] = for { +) { + + def getGroups: Task[GroupsGetResponseADM] = for { internal <- responder.groupsGetADM.map(GroupsGetResponseADM.apply) external <- format.toExternalADM(internal) } yield external - override def getGroupByIri(iri: GroupIri): Task[GroupGetResponseADM] = + def getGroupByIri(iri: GroupIri): Task[GroupGetResponseADM] = for { internal <- responder .groupGetADM(iri.value) @@ -48,13 +39,13 @@ final case class GroupsRestServiceLive( external <- format.toExternalADM(internal) } yield external - override def getGroupMembers(iri: GroupIri, user: User): Task[GroupMembersGetResponseADM] = + def getGroupMembers(iri: GroupIri, user: User): Task[GroupMembersGetResponseADM] = for { internal <- responder.groupMembersGetRequest(iri, user) external <- format.toExternalADM(internal) } yield external - override def postGroup(request: GroupCreateRequest, user: User): Task[GroupGetResponseADM] = + def postGroup(request: GroupCreateRequest, user: User): Task[GroupGetResponseADM] = for { _ <- auth.ensureSystemAdminOrProjectAdmin(user, request.project) uuid <- Random.nextUUID @@ -62,7 +53,7 @@ final case class GroupsRestServiceLive( external <- format.toExternalADM(internal) } yield external - override def putGroup(iri: GroupIri, request: GroupUpdateRequest, user: User): Task[GroupGetResponseADM] = + def putGroup(iri: GroupIri, request: GroupUpdateRequest, user: User): Task[GroupGetResponseADM] = for { _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID @@ -70,7 +61,7 @@ final case class GroupsRestServiceLive( external <- format.toExternalADM(internal) } yield external - override def putGroupStatus(iri: GroupIri, request: GroupStatusUpdateRequest, user: User): Task[GroupGetResponseADM] = + def putGroupStatus(iri: GroupIri, request: GroupStatusUpdateRequest, user: User): Task[GroupGetResponseADM] = for { _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID @@ -78,7 +69,7 @@ final case class GroupsRestServiceLive( external <- format.toExternalADM(internal) } yield external - override def deleteGroup(iri: GroupIri, user: User): Task[GroupGetResponseADM] = + def deleteGroup(iri: GroupIri, user: User): Task[GroupGetResponseADM] = for { _ <- auth.ensureSystemAdminOrProjectAdminOfGroup(user, iri) uuid <- Random.nextUUID @@ -87,6 +78,6 @@ final case class GroupsRestServiceLive( } yield external } -object GroupsRestServiceLive { - val layer = ZLayer.derive[GroupsRestServiceLive] +object GroupsRestService { + val layer = ZLayer.derive[GroupsRestService] } 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 1712953257..111b03f12d 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 @@ -33,13 +33,13 @@ import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.PermissionIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.api.KnoraResponseRenderer final case class PermissionsRestService( responder: PermissionsResponderADM, - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, auth: AuthorizationRestService, format: KnoraResponseRenderer, ) { @@ -61,7 +61,7 @@ final case class PermissionsRestService( } yield project private def ensureProjectIriExistsAndUserHasAccess(projectIri: ProjectIri, user: User): Task[KnoraProject] = - projectRepo + knoraProjectService .findById(projectIri) .someOrFail(NotFoundException(s"Project ${projectIri.value} not found")) .tap(auth.ensureSystemAdminOrProjectAdmin(user, _)) 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/ProjectRestService.scala similarity index 73% rename from webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala rename to webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectRestService.scala index 3995e406d8..f2cfdd6091 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/ProjectRestService.scala @@ -7,7 +7,6 @@ package org.knora.webapi.slice.admin.api.service import zio.* -import dsp.errors.BadRequestException import dsp.errors.NotFoundException import org.knora.webapi.messages.admin.responder.projectsmessages.* import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* @@ -23,69 +22,20 @@ import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode import org.knora.webapi.slice.admin.domain.model.KnoraProject.Status import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.admin.domain.service.ProjectExportService import org.knora.webapi.slice.admin.domain.service.ProjectImportService -import org.knora.webapi.slice.admin.domain.service.ProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.api.KnoraResponseRenderer -trait ProjectADMRestService { - - def listAllProjects(): Task[ProjectsGetResponse] - - def findProject(id: ProjectIdentifierADM): Task[ProjectGetResponse] - - def createProject(createReq: ProjectCreateRequest, user: User): Task[ProjectOperationResponseADM] - - def updateProject( - id: IriIdentifier, - updateReq: ProjectUpdateRequest, - user: User, - ): Task[ProjectOperationResponseADM] - - def deleteProject(id: IriIdentifier, user: User): Task[ProjectOperationResponseADM] - - def getAllProjectData(id: IriIdentifier, user: User): Task[ProjectDataGetResponseADM] - - def exportProject(shortcode: String, user: User): Task[Unit] - def exportProject(id: ShortcodeIdentifier, user: User): Task[Unit] - - def exportProjectAwaiting(id: ShortcodeIdentifier, user: User): Task[ProjectExportInfoResponse] - - def importProject(shortcode: String, user: User): Task[ProjectImportResponse] - - def importProject(shortcode: ShortcodeIdentifier, user: User): Task[ProjectImportResponse] = - importProject(shortcode.value.value, user) - - def listExports(user: User): Task[Chunk[ProjectExportInfoResponse]] - - def getProjectMembers(user: User, id: ProjectIdentifierADM): Task[ProjectMembersGetResponseADM] - - def getProjectAdminMembers(user: User, id: ProjectIdentifierADM): Task[ProjectAdminMembersGetResponseADM] - - def listAllKeywords(): Task[ProjectsKeywordsGetResponse] - - def getKeywordsByProjectIri(iri: ProjectIri): Task[ProjectKeywordsGetResponse] - - def getProjectRestrictedViewSettings(id: ProjectIdentifierADM): Task[ProjectRestrictedViewSettingsGetResponseADM] - - def updateProjectRestrictedViewSettings( - id: ProjectIdentifierADM, - user: User, - setSizeReq: SetRestrictedViewRequest, - ): Task[RestrictedViewResponse] -} - -final case class ProjectsADMRestServiceLive( +final case class ProjectRestService( format: KnoraResponseRenderer, responder: ProjectsResponderADM, - projectRepo: KnoraProjectRepo, - projectService: ProjectService, + knoraProjectService: KnoraProjectService, projectExportService: ProjectExportService, projectImportService: ProjectImportService, permissionService: AuthorizationRestService, -) extends ProjectADMRestService { +) { /** * Returns all projects as a [[ProjectsGetResponse]]. @@ -185,9 +135,10 @@ final case class ProjectsADMRestServiceLive( */ def getAllProjectData(id: IriIdentifier, user: User): Task[ProjectDataGetResponseADM] = for { - project <- projectRepo.findById(id).some.orElseFail(NotFoundException(s"Project ${id.value} not found.")) - _ <- permissionService.ensureSystemAdminOrProjectAdmin(user, project) - result <- projectExportService.exportProjectTriples(project).map(_.toFile.toPath) + project <- + knoraProjectService.findById(id.value).some.orElseFail(NotFoundException(s"Project ${id.value} not found.")) + _ <- permissionService.ensureSystemAdminOrProjectAdmin(user, project) + result <- projectExportService.exportProjectTriples(project).map(_.toFile.toPath) } yield ProjectDataGetResponseADM(result) /** @@ -275,61 +226,52 @@ final case class ProjectsADMRestServiceLive( * @param req Contains the values to be set. * @return [[RestrictedViewResponse]]. */ - override def updateProjectRestrictedViewSettings( + def updateProjectRestrictedViewSettings( id: ProjectIdentifierADM, user: User, req: SetRestrictedViewRequest, ): Task[RestrictedViewResponse] = for { - project <- projectRepo.findById(id).someOrFail(NotFoundException(s"Project '${getId(id)}' not found.")) + project <- knoraProjectService.findById(id).someOrFail(NotFoundException(s"Project '${getId(id)}' not found.")) _ <- permissionService.ensureSystemAdminOrProjectAdmin(user, project) restrictedView <- req.toRestrictedView - newSettings <- projectService.setProjectRestrictedView(project, restrictedView) + newSettings <- knoraProjectService.setProjectRestrictedView(project, restrictedView) } yield RestrictedViewResponse.from(newSettings) - override def exportProject(shortcodeStr: String, user: User): Task[Unit] = - convertStringToShortcodeId(shortcodeStr).flatMap(exportProject(_, user)) - - override def exportProject(id: ShortcodeIdentifier, user: User): Task[Unit] = for { + def exportProject(id: Shortcode, user: User): Task[Unit] = for { _ <- permissionService.ensureSystemAdmin(user) - project <- projectRepo.findById(id).someOrFail(NotFoundException(s"Project $id not found.")) + project <- knoraProjectService.findByShortcode(id).someOrFail(NotFoundException(s"Project $id not found.")) _ <- projectExportService.exportProject(project).logError.forkDaemon } yield () - override def exportProjectAwaiting(id: ShortcodeIdentifier, user: User): Task[ProjectExportInfoResponse] = for { - _ <- permissionService.ensureSystemAdmin(user) - project <- projectRepo.findById(id).someOrFail(NotFoundException(s"Project $id not found.")) + def exportProjectAwaiting(shortcode: Shortcode, user: User): Task[ProjectExportInfoResponse] = for { + _ <- permissionService.ensureSystemAdmin(user) + project <- knoraProjectService + .findByShortcode(shortcode) + .someOrFail(NotFoundException(s"Project ${shortcode.value} not found.")) exportInfo <- projectExportService.exportProject(project).logError } yield exportInfo - private def convertStringToShortcodeId(shortcodeStr: String): IO[BadRequestException, ShortcodeIdentifier] = - ZIO.fromEither(Shortcode.from(shortcodeStr)).mapBoth(BadRequestException.apply, ShortcodeIdentifier.from) - - override def importProject( - shortcodeStr: String, + def importProject( + shortcode: Shortcode, user: User, ): Task[ProjectImportResponse] = for { - _ <- permissionService.ensureSystemAdmin(user) - shortcode <- convertStringToShortcodeId(shortcodeStr) + _ <- permissionService.ensureSystemAdmin(user) path <- projectImportService - .importProject(shortcode.value, user) + .importProject(shortcode, user) .flatMap { case Some(export) => export.toAbsolutePath.map(_.toString) case None => ZIO.fail(NotFoundException(s"Project export for ${shortcode.value} not found.")) } } yield ProjectImportResponse(path) - override def listExports(user: User): Task[Chunk[ProjectExportInfoResponse]] = for { + def listExports(user: User): Task[Chunk[ProjectExportInfoResponse]] = for { _ <- permissionService.ensureSystemAdmin(user) exports <- projectExportService.listExports().map(_.map(ProjectExportInfoResponse(_))) } yield exports - } -object ProjectsADMRestServiceLive { - val layer: URLayer[ - KnoraResponseRenderer & ProjectsResponderADM & KnoraProjectRepo & ProjectExportService & ProjectService & ProjectImportService & AuthorizationRestService, - ProjectsADMRestServiceLive, - ] = ZLayer.fromFunction(ProjectsADMRestServiceLive.apply _) +object ProjectRestService { + val layer = ZLayer.derive[ProjectRestService] } 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 a04edfd800..9923872c83 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 @@ -31,7 +31,6 @@ import org.knora.webapi.slice.admin.domain.model.PasswordHash import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.admin.domain.model.UserIri import org.knora.webapi.slice.admin.domain.model.Username -import org.knora.webapi.slice.admin.domain.service.KnoraUserRepo import org.knora.webapi.slice.admin.domain.service.KnoraUserService import org.knora.webapi.slice.admin.domain.service.KnoraUserToUserConverter import org.knora.webapi.slice.admin.domain.service.PasswordService @@ -46,7 +45,6 @@ final case class UsersRestService( userService: UserService, knoraUserService: KnoraUserService, knoraUserToUserConverter: KnoraUserToUserConverter, - userRepo: KnoraUserRepo, passwordService: PasswordService, projectService: ProjectService, responder: UsersResponder, @@ -100,7 +98,7 @@ final case class UsersRestService( } yield external private def getKnoraUserOrNotFound(userIri: UserIri) = - userRepo.findById(userIri).someOrFail(NotFoundException(s"User with iri ${userIri.value} not found.")) + knoraUserService.findById(userIri).someOrFail(NotFoundException(s"User with iri ${userIri.value} not found.")) def getProjectAdminMemberShipsByUserIri(userIri: UserIri): Task[UserProjectAdminMembershipsGetResponseADM] = for { diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/AdminDomainModule.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/AdminDomainModule.scala new file mode 100644 index 0000000000..6f8dff70e5 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/AdminDomainModule.scala @@ -0,0 +1,41 @@ +/* + * 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.domain + +import zio.ZLayer + +import org.knora.webapi.config.AppConfig +import org.knora.webapi.responders.IriService +import org.knora.webapi.slice.admin.domain.service.* +import org.knora.webapi.slice.admin.domain.service.GroupService +import org.knora.webapi.slice.admin.domain.service.KnoraGroupService.KnoraGroupService +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService +import org.knora.webapi.slice.admin.domain.service.PasswordService +import org.knora.webapi.slice.admin.domain.service.ProjectService +import org.knora.webapi.slice.admin.repo.AdminRepoModule +import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper +import org.knora.webapi.slice.ontology.domain.service.OntologyRepo +import org.knora.webapi.store.cache.CacheService +import org.knora.webapi.store.triplestore.api.TriplestoreService + +object AdminDomainModule { + + type Dependencies = + AppConfig & AdminRepoModule.Provided & CacheService & IriService & OntologyRepo & PredicateObjectMapper & TriplestoreService + + type Provided = + GroupService & KnoraGroupService & KnoraProjectService & KnoraUserService & MaintenanceService & PasswordService & ProjectService + + val layer = ZLayer.makeSome[Dependencies, Provided]( + GroupService.layer, + KnoraGroupService.layer, + KnoraProjectService.layer, + KnoraUserService.layer, + MaintenanceService.layer, + PasswordService.layer, + ProjectService.layer, + ) +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupsService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupService.scala similarity index 63% rename from webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupsService.scala rename to webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupService.scala index 60a41ca0ff..021854e0a3 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupsService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/GroupService.scala @@ -7,10 +7,10 @@ package org.knora.webapi.slice.admin.domain.service import zio.ZLayer -final case class GroupsService( - private val groupRepo: KnoraGroupRepo, +final case class GroupService( + private val knoraGroupService: KnoraGroupService, ) {} -object GroupsService { - def layer = ZLayer.derive[GroupsService] +object GroupService { + def layer = ZLayer.derive[GroupService] } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraGroupService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraGroupService.scala new file mode 100644 index 0000000000..645c986679 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraGroupService.scala @@ -0,0 +1,24 @@ +/* + * 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.domain.service + +import zio.Task +import zio.ZLayer + +import org.knora.webapi.slice.admin.domain.model.GroupIri +import org.knora.webapi.slice.admin.domain.model.KnoraGroup + +case class KnoraGroupService(knoraGroupRepo: KnoraGroupRepo) { + + def findById(id: GroupIri): Task[Option[KnoraGroup]] = knoraGroupRepo.findById(id) + +} + +object KnoraGroupService { + object KnoraGroupService { + val layer = ZLayer.derive[KnoraGroupService] + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectService.scala new file mode 100644 index 0000000000..ed77ce8225 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraProjectService.scala @@ -0,0 +1,33 @@ +/* + * 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.domain.service + +import zio.Task +import zio.ZLayer + +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM +import org.knora.webapi.slice.admin.domain.model.KnoraProject +import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri +import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode +import org.knora.webapi.slice.admin.domain.model.RestrictedView + +final case class KnoraProjectService(knoraProjectRepo: KnoraProjectRepo) { + def findById(id: ProjectIri): Task[Option[KnoraProject]] = knoraProjectRepo.findById(id) + def findById(id: ProjectIdentifierADM): Task[Option[KnoraProject]] = knoraProjectRepo.findById(id) + def findByShortcode(code: Shortcode): Task[Option[KnoraProject]] = knoraProjectRepo.findByShortcode(code) + def findAll(): Task[List[KnoraProject]] = knoraProjectRepo.findAll() + def setProjectRestrictedView(project: KnoraProject, settings: RestrictedView): Task[RestrictedView] = { + val newSettings = settings match { + case RestrictedView.Watermark(false) => RestrictedView.default + case s => s + } + knoraProjectRepo.save(project.copy(restrictedView = newSettings)).as(newSettings) + } +} + +object KnoraProjectService { + val layer = ZLayer.derive[KnoraProjectService] +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraUserService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraUserService.scala index c72cf2d9c1..d8296de4b3 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraUserService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/KnoraUserService.scala @@ -28,6 +28,7 @@ import org.knora.webapi.slice.admin.domain.model.Password import org.knora.webapi.slice.admin.domain.model.PasswordHash import org.knora.webapi.slice.admin.domain.model.SystemAdmin import org.knora.webapi.slice.admin.domain.model.User +import org.knora.webapi.slice.admin.domain.model.UserIri import org.knora.webapi.slice.admin.domain.model.UserStatus import org.knora.webapi.slice.admin.domain.model.Username import org.knora.webapi.slice.admin.domain.service.KnoraUserService.Errors.UserServiceError @@ -40,6 +41,10 @@ case class KnoraUserService( private val passwordService: PasswordService, private val cacheService: CacheService, ) { + def findById(userIri: UserIri): Task[Option[KnoraUser]] = userRepo.findById(userIri) + def findByEmail(email: Email): Task[Option[KnoraUser]] = userRepo.findByEmail(email) + def findByUsername(username: Username): Task[Option[KnoraUser]] = userRepo.findByUsername(username) + def findAll(): Task[Seq[KnoraUser]] = userRepo.findAll() def updateSystemAdminStatus(knoraUser: KnoraUser, status: SystemAdmin): Task[KnoraUser] = updateUser(knoraUser, UserChangeRequest(systemAdmin = Some(status))) diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/MaintenanceService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/MaintenanceService.scala index 36ea1a799b..50e4eb77ce 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/MaintenanceService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/MaintenanceService.scala @@ -20,7 +20,7 @@ import org.knora.webapi.store.triplestore.api.TriplestoreService.Queries.Select import org.knora.webapi.store.triplestore.api.TriplestoreService.Queries.Update final case class MaintenanceService( - projectRepo: KnoraProjectRepo, + knoraProjectService: KnoraProjectService, triplestoreService: TriplestoreService, mapper: PredicateObjectMapper, ) { @@ -34,7 +34,7 @@ final case class MaintenanceService( } def getKnoraProject(project: ProjectWithBakFiles): ZStream[Any, Throwable, KnoraProject] = { - val getProjectZio: IO[Option[Throwable], KnoraProject] = projectRepo + val getProjectZio: IO[Option[Throwable], KnoraProject] = knoraProjectService .findByShortcode(project.id) .some .tapSomeError { case None => ZIO.logInfo(s"Project ${project.id} not found, skipping.") } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectService.scala index 0287fc09f8..f633fd8450 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/ProjectService.scala @@ -21,11 +21,11 @@ import org.knora.webapi.store.cache.CacheService final case class ProjectService( private val ontologyRepo: OntologyRepo, - private val projectRepo: KnoraProjectRepo, + private val knoraProjectService: KnoraProjectService, private val cacheService: CacheService, ) { - def findAll: Task[List[Project]] = projectRepo.findAll().flatMap(ZIO.foreachPar(_)(toProjectADM)) + def findAll: Task[List[Project]] = knoraProjectService.findAll().flatMap(ZIO.foreachPar(_)(toProjectADM)) def findById(id: ProjectIri): Task[Option[Project]] = findByProjectIdentifier(ProjectIdentifierADM.from(id)) @@ -36,7 +36,7 @@ final case class ProjectService( cacheService.getProjectADM(projectId).flatMap { case Some(project) => ZIO.some(project) case None => - projectRepo.findById(projectId).flatMap(ZIO.foreach(_)(toProjectADM)).tap { + knoraProjectService.findById(projectId).flatMap(ZIO.foreach(_)(toProjectADM)).tap { case Some(prj) => cacheService.putProjectADM(prj) case None => ZIO.unit } @@ -78,13 +78,13 @@ final case class ProjectService( def findAllProjectsKeywords: Task[ProjectsKeywordsGetResponse] = for { - projects <- projectRepo.findAll() + projects <- knoraProjectService.findAll() keywords = projects.flatMap(_.keywords.map(_.value)).distinct.sorted } yield ProjectsKeywordsGetResponse(keywords) def findProjectKeywordsBy(id: ProjectIdentifierADM): Task[Option[ProjectKeywordsGetResponse]] = for { - projectMaybe <- projectRepo.findById(id) + projectMaybe <- knoraProjectService.findById(id) keywordsMaybe = projectMaybe.map(_.keywords.map(_.value)) result = keywordsMaybe.map(ProjectKeywordsGetResponse(_)) } yield result @@ -97,16 +97,8 @@ final case class ProjectService( .map(_ :+ projectGraph) } - def setProjectRestrictedView(project: KnoraProject, settings: RestrictedView): Task[RestrictedView] = { - val newSettings = settings match { - case RestrictedView.Watermark(false) => RestrictedView.default - case s => s - } - projectRepo.save(project.copy(restrictedView = newSettings)).as(newSettings) - } - def setProjectRestrictedView(project: Project, settings: RestrictedView): Task[RestrictedView] = - setProjectRestrictedView(toKnoraProject(project, settings), settings) + knoraProjectService.setProjectRestrictedView(toKnoraProject(project, settings), settings) } object ProjectService { diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/UserService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/UserService.scala index 4dafc875cd..b94e501bc8 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/UserService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/domain/service/UserService.scala @@ -17,25 +17,25 @@ import org.knora.webapi.slice.admin.domain.model.Username import org.knora.webapi.store.cache.CacheService final case class UserService( - private val userRepo: KnoraUserRepo, + private val knoraUserService: KnoraUserService, private val userToKnoraUserConverter: KnoraUserToUserConverter, private val cacheService: CacheService, ) { def findUserByIri(iri: UserIri): Task[Option[User]] = - fromCacheOrRepo(iri, cacheService.getUserByIri, userRepo.findById) + fromCacheOrRepo(iri, cacheService.getUserByIri, knoraUserService.findById) def findUsersByIris(iris: Seq[UserIri]): Task[Seq[User]] = ZIO.foreach(iris)(findUserByIri).map(_.flatten) def findUserByEmail(email: Email): Task[Option[User]] = - fromCacheOrRepo(email, cacheService.getUserByEmail, userRepo.findByEmail) + fromCacheOrRepo(email, cacheService.getUserByEmail, knoraUserService.findByEmail) def findUserByUsername(username: Username): Task[Option[User]] = - fromCacheOrRepo(username, cacheService.getUserByUsername, userRepo.findByUsername) + fromCacheOrRepo(username, cacheService.getUserByUsername, knoraUserService.findByUsername) def findAll: Task[Seq[User]] = - userRepo.findAll().flatMap(ZIO.foreach(_)(userToKnoraUserConverter.toUser)) + knoraUserService.findAll().flatMap(ZIO.foreach(_)(userToKnoraUserConverter.toUser)) private def fromCacheOrRepo[A]( id: A, diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/AdminRepoModule.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/AdminRepoModule.scala new file mode 100644 index 0000000000..509f78b6cd --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/repo/AdminRepoModule.scala @@ -0,0 +1,29 @@ +/* + * 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.repo + +import zio.ZLayer + +import org.knora.webapi.slice.admin.domain.service.KnoraGroupRepo +import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraUserRepo +import org.knora.webapi.slice.admin.repo.service.KnoraGroupRepoLive +import org.knora.webapi.slice.admin.repo.service.KnoraProjectRepoLive +import org.knora.webapi.slice.admin.repo.service.KnoraUserRepoLive +import org.knora.webapi.store.cache.CacheService +import org.knora.webapi.store.triplestore.api.TriplestoreService + +object AdminRepoModule { + + type Dependencies = TriplestoreService & CacheService + type Provided = KnoraGroupRepo & KnoraProjectRepo & KnoraUserRepo + + val layer = ZLayer.makeSome[Dependencies, Provided]( + KnoraGroupRepoLive.layer, + KnoraProjectRepoLive.layer, + KnoraUserRepoLive.layer, + ) +} diff --git a/webapi/src/main/scala/org/knora/webapi/slice/common/api/AuthorizationRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/common/api/AuthorizationRestService.scala index d6ce8426ec..953e847b0b 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/common/api/AuthorizationRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/common/api/AuthorizationRestService.scala @@ -13,8 +13,8 @@ import org.knora.webapi.slice.admin.domain.model.GroupIri import org.knora.webapi.slice.admin.domain.model.KnoraProject import org.knora.webapi.slice.admin.domain.model.KnoraProject.ProjectIri import org.knora.webapi.slice.admin.domain.model.User -import org.knora.webapi.slice.admin.domain.service.KnoraGroupRepo -import org.knora.webapi.slice.admin.domain.service.KnoraProjectRepo +import org.knora.webapi.slice.admin.domain.service.KnoraGroupService +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.common.api.AuthorizationRestService.isActive import org.knora.webapi.slice.common.api.AuthorizationRestService.isSystemAdmin import org.knora.webapi.slice.common.api.AuthorizationRestService.isSystemAdminOrProjectAdminInAnyProject @@ -90,8 +90,10 @@ object AuthorizationRestService { isSystemUser(user) || isSystemAdmin(user) || user.permissions.isProjectAdminInAnyProject() } -final case class AuthorizationRestServiceLive(projectRepo: KnoraProjectRepo, groupsRepo: KnoraGroupRepo) - extends AuthorizationRestService { +final case class AuthorizationRestServiceLive( + knoraProjectService: KnoraProjectService, + knoraGroupService: KnoraGroupService, +) extends AuthorizationRestService { override def ensureSystemAdmin(user: User): IO[ForbiddenException, Unit] = { lazy val msg = s"You are logged in with username '${user.username}', but only a system administrator has permissions for this operation." @@ -102,7 +104,7 @@ final case class AuthorizationRestServiceLive(projectRepo: KnoraProjectRepo, gro groupIri: GroupIri, ): IO[ForbiddenException, KnoraProject] = for { - group <- groupsRepo + group <- knoraGroupService .findById(groupIri) .orDie .someOrFail(ForbiddenException(s"Group with IRI '${groupIri.value}' not found")) @@ -116,7 +118,7 @@ final case class AuthorizationRestServiceLive(projectRepo: KnoraProjectRepo, gro user: User, projectIri: ProjectIri, ): IO[ForbiddenException, KnoraProject] = - projectRepo + knoraProjectService .findById(projectIri) .orDie .someOrFail(ForbiddenException(s"Project with IRI '${projectIri.value}' not found")) diff --git a/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/AuthorizationRestServiceSpec.scala b/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/AuthorizationRestServiceSpec.scala index 6ca6cecc8c..0ec6a5b0a7 100644 --- a/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/AuthorizationRestServiceSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/AuthorizationRestServiceSpec.scala @@ -18,6 +18,8 @@ import org.knora.webapi.messages.OntologyConstants.KnoraAdmin.SystemProject import org.knora.webapi.messages.admin.responder.permissionsmessages.PermissionsDataADM import org.knora.webapi.slice.admin.domain.model.User import org.knora.webapi.slice.admin.domain.repo.KnoraProjectRepoInMemory +import org.knora.webapi.slice.admin.domain.service.KnoraGroupService.KnoraGroupService +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.admin.repo.service.KnoraGroupRepoInMemory import org.knora.webapi.slice.common.api.AuthorizationRestService import org.knora.webapi.slice.common.api.AuthorizationRestServiceLive @@ -116,5 +118,11 @@ object AuthorizationRestServiceSpec extends ZIOSpecDefault { } yield assert(exit)(failsWithA[ForbiddenException]) }, ), - ).provide(AuthorizationRestServiceLive.layer, KnoraProjectRepoInMemory.layer, KnoraGroupRepoInMemory.layer) + ).provide( + AuthorizationRestServiceLive.layer, + KnoraProjectService.layer, + KnoraProjectRepoInMemory.layer, + KnoraGroupService.layer, + KnoraGroupRepoInMemory.layer, + ) } diff --git a/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/MaintenanceServiceSpec.scala b/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/MaintenanceServiceSpec.scala index 2024cabb5b..7385456cdd 100644 --- a/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/MaintenanceServiceSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/slice/admin/api/service/MaintenanceServiceSpec.scala @@ -17,6 +17,7 @@ import org.knora.webapi.TestDataFactory import org.knora.webapi.messages.StringFormatter import org.knora.webapi.slice.admin.api.model.MaintenanceRequests.* import org.knora.webapi.slice.admin.domain.repo.KnoraProjectRepoInMemory +import org.knora.webapi.slice.admin.domain.service.KnoraProjectService import org.knora.webapi.slice.admin.domain.service.MaintenanceService import org.knora.webapi.slice.admin.domain.service.ProjectService import org.knora.webapi.slice.common.repo.service.PredicateObjectMapper @@ -115,6 +116,7 @@ object MaintenanceServiceSpec extends ZIOSpecDefault { }, ).provide( MaintenanceService.layer, + KnoraProjectService.layer, KnoraProjectRepoInMemory.layer, emptyDatasetRefLayer >>> TriplestoreServiceInMemory.layer, PredicateObjectMapper.layer,