Skip to content

Commit

Permalink
add zio route
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Dec 14, 2022
1 parent 66b0a80 commit 1b54f11
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 65 deletions.
25 changes: 8 additions & 17 deletions webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala
Expand Up @@ -6,24 +6,17 @@
package org.knora.webapi.config

import com.typesafe.config.ConfigFactory
import zio._
import zio.config._

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import scala.concurrent.duration
import scala.util.Failure
import scala.util.Success
import scala.util.Try

import dsp.errors.FileWriteException
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.messages.util.rdf.RdfFeatureFactory
import org.knora.webapi.util.cache.CacheUtil
import zio._
import zio.config._
import zio.config.magnolia._
import zio.config.typesafe._

import typesafe._
import magnolia._
import java.nio.file.{Files, Path, Paths}
import scala.concurrent.duration
import scala.util.{Failure, Success, Try}

/**
* Represents the configuration as defined in application.conf.
Expand Down Expand Up @@ -265,7 +258,6 @@ object AppConfig {
for {
c <- configFromSource.orDie
_ <- ZIO.attempt(RdfFeatureFactory.init(c)).orDie // needs early init before first usage
_ <- ZIO.attempt(StringFormatter.init(c)).orDie // needs early init before first usage
} yield c
}.tap(_ => ZIO.logInfo(">>> AppConfig Live Initialized <<<"))

Expand All @@ -276,8 +268,7 @@ object AppConfig {
ZLayer {
for {
c <- configFromSource.orDie
_ <- ZIO.attempt(RdfFeatureFactory.init(c)).orDie // needs early init before first usage
_ <- ZIO.attempt(StringFormatter.initForTest()).orDie // needs early init before first usage
_ <- ZIO.attempt(RdfFeatureFactory.init(c)).orDie // needs early init before first usage
} yield c
}.tap(_ => ZIO.logInfo(">>> AppConfig Test Initialized <<<"))

Expand Down
Expand Up @@ -7,19 +7,23 @@ package org.knora.webapi.core

import org.knora.webapi.config.AppConfig
import org.knora.webapi.routing.HealthRouteWithZIOHttp
import org.knora.webapi.slice.resourceinfo.api.{ResourceInfoRoute, RestResourceInfoService}
import org.knora.webapi.slice.resourceinfo.api.{IriConverter, ResourceInfoRoute, RestResourceInfoService}
import zhttp.service.Server
import zio.{ZLayer, _}

object HttpServerWithZIOHttp {

val routes = HealthRouteWithZIOHttp() ++ ResourceInfoRoute()

val layer: ZLayer[RestResourceInfoService with State with AppConfig, Nothing, Unit] =
val layer: ZLayer[
RestResourceInfoService with IriConverter with State with ResourceInfoRoute with AppConfig,
Nothing,
Unit
] =
ZLayer {
for {
appConfig <- ZIO.service[AppConfig]
riRoute <- ZIO.service[ResourceInfoRoute]
port = appConfig.knoraApi.externalZioPort
routes = HealthRouteWithZIOHttp() ++ riRoute.route
_ <- Server.start(port, routes).forkDaemon
_ <- ZIO.logInfo(s">>> Acquire ZIO HTTP Server on port $port<<<")
} yield ()
Expand Down
6 changes: 5 additions & 1 deletion webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala
Expand Up @@ -7,8 +7,9 @@ package org.knora.webapi.core

import org.knora.webapi.auth.JWTService
import org.knora.webapi.config.AppConfig
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.routing.ApiRoutes
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService
import org.knora.webapi.slice.resourceinfo.api.{IriConverter, LiveRestResourceInfoService, ResourceInfoRoute}
import org.knora.webapi.slice.resourceinfo.repo.LiveResourceInfoRepo
import org.knora.webapi.store.cache.CacheServiceManager
import org.knora.webapi.store.cache.api.CacheService
Expand Down Expand Up @@ -58,11 +59,14 @@ object LayersLive {
HttpServerWithZIOHttp.layer, // this is the new ZIO HTTP server layer
IIIFServiceManager.layer,
IIIFServiceSipiImpl.layer,
IriConverter.layer,
JWTService.layer,
LiveResourceInfoRepo.layer,
LiveRestResourceInfoService.layer,
RepositoryUpdater.layer,
ResourceInfoRoute.layer,
State.layer,
StringFormatter.liveLayer,
TriplestoreServiceManager.layer,
TriplestoreServiceHttpConnectorImpl.layer
)
Expand Down
Expand Up @@ -11,40 +11,35 @@ import akka.pattern._
import akka.util.Timeout
import com.google.gwt.safehtml.shared.UriUtils._
import com.typesafe.scalalogging.Logger
import org.apache.commons.lang3.StringUtils
import spray.json._

import java.nio.ByteBuffer
import java.time._
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoField
import java.time.temporal.TemporalAccessor
import java.util.Base64
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.util.Failure
import scala.util.Success
import scala.util.Try
import scala.util.matching.Regex

import dsp.errors._
import dsp.valueobjects.Iri
import dsp.valueobjects.IriErrorMessages
import dsp.valueobjects.{Iri, IriErrorMessages}
import org.apache.commons.lang3.StringUtils
import org.knora.webapi._
import org.knora.webapi.config.AppConfig
import org.knora.webapi.messages.IriConversions._
import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectADM
import org.knora.webapi.messages.store.triplestoremessages.SparqlAskRequest
import org.knora.webapi.messages.store.triplestoremessages.SparqlAskResponse
import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2
import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2
import org.knora.webapi.messages.store.triplestoremessages.{
SparqlAskRequest,
SparqlAskResponse,
StringLiteralSequenceV2,
StringLiteralV2
}
import org.knora.webapi.messages.v1.responder.projectmessages.ProjectInfoV1
import org.knora.webapi.messages.v2.responder.KnoraContentV2
import org.knora.webapi.messages.v2.responder.standoffmessages._
import org.knora.webapi.util.Base64UrlCheckDigit
import org.knora.webapi.util.JavaUtil
import org.knora.webapi.util.{Base64UrlCheckDigit, JavaUtil}
import spray.json._
import zio.ZLayer

import java.nio.ByteBuffer
import java.time._
import java.time.format.DateTimeFormatter
import java.time.temporal.{ChronoField, TemporalAccessor}
import java.util.concurrent.ConcurrentHashMap
import java.util.{Base64, UUID}
import scala.concurrent.{ExecutionContext, Future}
import scala.util.matching.Regex
import scala.util.{Failure, Success, Try}

/**
* Provides instances of [[StringFormatter]], as well as string formatting constants.
Expand Down Expand Up @@ -311,6 +306,16 @@ object StringFormatter {
creationFun()
})
)

val liveLayer: ZLayer[AppConfig, Nothing, StringFormatter] = ZLayer.fromFunction { appConfig: AppConfig =>
StringFormatter.init(appConfig)
StringFormatter.getGeneralInstance
}

val testLayer: ZLayer[Any, Nothing, StringFormatter] = ZLayer.fromFunction { () =>
StringFormatter.initForTest()
StringFormatter.getGeneralInstance
}
}

/**
Expand Down
Expand Up @@ -5,27 +5,36 @@

package org.knora.webapi.slice.resourceinfo.api

import org.knora.webapi.IRI
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.routing.RouteUtilV2
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.{ASC, Order, OrderBy, lastModificationDate}
import zhttp.http.HttpError.BadRequest
import zhttp.http._
import zio.ZIO
import zio.json.EncoderOps
import zio.prelude.Validation
import zio.{ZIO, ZLayer}

import org.knora.webapi.IRI
import org.knora.webapi.routing.RouteUtilV2
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.ASC
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.Order
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.OrderBy
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.lastModificationDate
final case class InternalIri(value: IRI)

object ResourceInfoRoute {
final case class IriConverter(stringFormatter: StringFormatter) {
def externalToInternalIri(iri: IRI): ZIO[Any, Throwable, InternalIri] =
ZIO.attempt(stringFormatter.toSmartIri(iri).internalIri).map(InternalIri(_))
}

def apply(): HttpApp[RestResourceInfoService, BadRequest] =
object IriConverter {
val layer = ZLayer.fromFunction(IriConverter(_))
}

final case class ResourceInfoRoute(iriConverter: IriConverter) {

val route: HttpApp[RestResourceInfoService with IriConverter, BadRequest] =
Http.collectZIO[Request] { case req @ Method.GET -> !! / "v2" / "resources" / "info" =>
(for {
p <- getParameters(req)
infoService <- ZIO.service[RestResourceInfoService]
result <- infoService.findByProjectAndResourceClass(p._1, p._2, (p._3, p._4))
p <- getParameters(req)
projectIri <- iriConverter.externalToInternalIri(p._1).mapError(err => BadRequest(err.getMessage))
resourceClassIri <- iriConverter.externalToInternalIri(p._2).mapError(err => BadRequest(err.getMessage))
result <- RestResourceInfoService.findByProjectAndResourceClass(projectIri, resourceClassIri, (p._3, p._4))
} yield result).fold(err => Response.fromHttpError(err), suc => Response.json(suc.toJson))
}

Expand Down Expand Up @@ -81,3 +90,7 @@ object ResourceInfoRoute {
projectIri
}
}

object ResourceInfoRoute {
val layer = ZLayer.fromFunction(ResourceInfoRoute(_))
}
Expand Up @@ -5,18 +5,22 @@

package org.knora.webapi.slice.resourceinfo.api

import org.knora.webapi.IRI
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.{Order, OrderBy}
import zio.UIO
import zio.macros.accessible

import org.knora.webapi.IRI
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.Order
import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.OrderBy

@accessible
trait RestResourceInfoService {
def findByProjectAndResourceClass(
projectIri: IRI,
resourceClass: IRI,
ordering: (OrderBy, Order)
): UIO[ListResponseDto]

def findByProjectAndResourceClass(
projectIri: InternalIri,
resourceClass: InternalIri,
ordering: (OrderBy, Order)
): UIO[ListResponseDto] = findByProjectAndResourceClass(projectIri.value, resourceClass.value, ordering)
}
Expand Up @@ -77,5 +77,5 @@ object ResourceInfoRouteSpec extends ZIOSpecDefault {
)
)
}
).provide(SpyLiveRestResourceInfoService.layer, TestResourceInfoRepo.layer)
).provide(SpyLiveRestResourceInfoService.layer, TestResourceInfoRepo.layer, IriConverter.layer)
}

0 comments on commit 1b54f11

Please sign in to comment.