Skip to content

Commit

Permalink
refactor: Modularize layers (#3132)
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Mar 21, 2024
1 parent 70e0172 commit 9ef26c9
Show file tree
Hide file tree
Showing 32 changed files with 428 additions and 512 deletions.
151 changes: 26 additions & 125 deletions integration/src/test/scala/org/knora/webapi/core/LayersTest.scala
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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,
Expand All @@ -174,57 +112,32 @@ 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,
OntologyHelpersLive.layer,
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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
43 changes: 23 additions & 20 deletions webapi/src/main/scala/org/knora/webapi/core/AppRouter.scala
Expand Up @@ -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
Expand All @@ -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 <<<"))
}

0 comments on commit 9ef26c9

Please sign in to comment.