From 9247db45900354953bca7cb90f03e6a4b06eab5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kleinbo=CC=88lting?= Date: Wed, 14 Dec 2022 10:56:22 +0100 Subject: [PATCH] fmt --- .../org/knora/webapi/config/AppConfig.scala | 15 +++-- .../webapi/core/HttpServerWithZIOHttp.scala | 10 ++- .../org/knora/webapi/core/LayersLive.scala | 8 ++- .../webapi/messages/StringFormatter.scala | 46 ++++++++------ .../resourceinfo/api/ResourceInfoRoute.scala | 23 ++++--- .../api/RestResourceInfoService.scala | 6 +- .../api/ResourceInfoRouteSpec.scala | 63 +++++++++++++------ .../api/SpyLiveRestResourceInfoService.scala | 11 ++-- 8 files changed, 118 insertions(+), 64 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala index 13c09d2b999..4960e99c0ca 100644 --- a/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala +++ b/webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala @@ -6,17 +6,22 @@ package org.knora.webapi.config import com.typesafe.config.ConfigFactory -import dsp.errors.FileWriteException -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 java.nio.file.{Files, Path, Paths} +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths import scala.concurrent.duration -import scala.util.{Failure, Success, Try} +import scala.util.Failure +import scala.util.Success +import scala.util.Try + +import dsp.errors.FileWriteException +import org.knora.webapi.messages.util.rdf.RdfFeatureFactory +import org.knora.webapi.util.cache.CacheUtil /** * Represents the configuration as defined in application.conf. diff --git a/webapi/src/main/scala/org/knora/webapi/core/HttpServerWithZIOHttp.scala b/webapi/src/main/scala/org/knora/webapi/core/HttpServerWithZIOHttp.scala index a9cf3ccc060..12b2882ad92 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/HttpServerWithZIOHttp.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/HttpServerWithZIOHttp.scala @@ -5,11 +5,15 @@ package org.knora.webapi.core +import zhttp.service.Server +import zio.ZLayer +import zio._ + import org.knora.webapi.config.AppConfig import org.knora.webapi.routing.HealthRouteWithZIOHttp -import org.knora.webapi.slice.resourceinfo.api.{IriConverter, ResourceInfoRoute, RestResourceInfoService} -import zhttp.service.Server -import zio.{ZLayer, _} +import org.knora.webapi.slice.resourceinfo.api.IriConverter +import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute +import org.knora.webapi.slice.resourceinfo.api.RestResourceInfoService object HttpServerWithZIOHttp { 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 b8143736ff9..e9835a654bf 100644 --- a/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala +++ b/webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala @@ -5,11 +5,16 @@ package org.knora.webapi.core +import zio.ULayer +import zio.ZLayer + 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.{IriConverter, LiveRestResourceInfoService, ResourceInfoRoute} +import org.knora.webapi.slice.resourceinfo.api.IriConverter +import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService +import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute import org.knora.webapi.slice.resourceinfo.repo.LiveResourceInfoRepo import org.knora.webapi.store.cache.CacheServiceManager import org.knora.webapi.store.cache.api.CacheService @@ -21,7 +26,6 @@ import org.knora.webapi.store.triplestore.TriplestoreServiceManager import org.knora.webapi.store.triplestore.api.TriplestoreService import org.knora.webapi.store.triplestore.impl.TriplestoreServiceHttpConnectorImpl import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater -import zio.{ULayer, ZLayer} object LayersLive { diff --git a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala index 41227fefa52..f68d9743a63 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -11,35 +11,41 @@ import akka.pattern._ import akka.util.Timeout import com.google.gwt.safehtml.shared.UriUtils._ import com.typesafe.scalalogging.Logger -import dsp.errors._ -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, - 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, 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.time.temporal.ChronoField +import java.time.temporal.TemporalAccessor +import java.util.Base64 +import java.util.UUID import java.util.concurrent.ConcurrentHashMap -import java.util.{Base64, UUID} -import scala.concurrent.{ExecutionContext, Future} +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 scala.util.{Failure, Success, Try} + +import dsp.errors._ +import dsp.valueobjects.Iri +import dsp.valueobjects.IriErrorMessages +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.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 /** * Provides instances of [[StringFormatter]], as well as string formatting constants. diff --git a/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRoute.scala b/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRoute.scala index dac77287eb2..5957573f9f1 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRoute.scala @@ -5,24 +5,31 @@ 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.ZLayer import zio.json.EncoderOps import zio.prelude.Validation -import zio.{ZIO, ZLayer} + +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 +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) final case class IriConverter(stringFormatter: StringFormatter) { - def externalToInternalIri(iri: IRI): ZIO[Any, Throwable, InternalIri] = + def asInternalIri(iri: IRI): ZIO[Any, Throwable, InternalIri] = ZIO.attempt(stringFormatter.toSmartIri(iri).internalIri).map(InternalIri(_)) } object IriConverter { + def asInternalIri(iri: IRI) = + ZIO.service[IriConverter].flatMap(_.asInternalIri(iri)) val layer = ZLayer.fromFunction(IriConverter(_)) } @@ -32,8 +39,8 @@ final case class ResourceInfoRoute(iriConverter: IriConverter) { Http.collectZIO[Request] { case req @ Method.GET -> !! / "v2" / "resources" / "info" => (for { p <- getParameters(req) - projectIri <- iriConverter.externalToInternalIri(p._1).mapError(err => BadRequest(err.getMessage)) - resourceClassIri <- iriConverter.externalToInternalIri(p._2).mapError(err => BadRequest(err.getMessage)) + projectIri <- iriConverter.asInternalIri(p._1).mapError(err => BadRequest(err.getMessage)) + resourceClassIri <- iriConverter.asInternalIri(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)) } diff --git a/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/RestResourceInfoService.scala b/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/RestResourceInfoService.scala index 0de4486262a..215ae86279b 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/RestResourceInfoService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/resourceinfo/api/RestResourceInfoService.scala @@ -5,11 +5,13 @@ 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( diff --git a/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRouteSpec.scala b/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRouteSpec.scala index 8b6b6d493da..dfafe8ab32d 100644 --- a/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRouteSpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/ResourceInfoRouteSpec.scala @@ -1,12 +1,13 @@ package org.knora.webapi.slice.resourceinfo.api import zhttp.http._ -import zio.test.Assertion.equalTo +import zio.ZIO import zio.test.ZIOSpecDefault import zio.test._ import java.util.UUID.randomUUID +import org.knora.webapi.messages.StringFormatter import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.ASC import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.DESC import org.knora.webapi.slice.resourceinfo.api.LiveRestResourceInfoService.creationDate @@ -18,44 +19,60 @@ import org.knora.webapi.slice.resourceinfo.repo.TestResourceInfoRepo object ResourceInfoRouteSpec extends ZIOSpecDefault { - private val routeToTest = ResourceInfoRoute() - private val testResourceClass = "http://test-resource-class/" + randomUUID private val testProjectIri = "http://test-project/" + randomUUID private val baseUrl = URL(!! / "v2" / "resources" / "info") private val projectHeader = Headers("x-knora-accept-project", testProjectIri) + private def sendRequest(req: Request) = + for { + route <- ZIO.service[ResourceInfoRoute].map(_.route) + response <- route(req) + } yield response + def spec = suite("ResourceInfoRoute /v2/resources/info")( test("given no required params/headers were passed should respond with BadRequest") { - assertZIO(routeToTest(Request(url = baseUrl)).map(_.status))(equalTo(Status.BadRequest)) + val request = Request(url = baseUrl) + for { + response <- sendRequest(request) + } yield assertTrue(response.status == Status.BadRequest) }, test("given more than one resource class should respond with BadRequest") { val url = baseUrl.setQueryParams(Map("resourceClass" -> List(testResourceClass, "http://anotherResourceClass"))) val request = Request(url = url, headers = projectHeader) - assertZIO(routeToTest(request).map(_.status))(equalTo(Status.BadRequest)) + for { + response <- sendRequest(request) + } yield assertTrue(response.status == Status.BadRequest) }, test("given no projectIri should respond with BadRequest") { val url = baseUrl.setQueryParams(Map("resourceClass" -> List(testResourceClass))) val request = Request(url = url) - assertZIO(routeToTest(request).map(_.status))(equalTo(Status.BadRequest)) + for { + response <- sendRequest(request) + } yield assertTrue(response.status == Status.BadRequest) }, test("given all mandatory parameters should respond with OK") { val url = baseUrl.setQueryParams(Map("resourceClass" -> List(testResourceClass))) val request = Request(url = url, headers = projectHeader) - assertZIO(routeToTest(request).map(_.status))(equalTo(Status.Ok)) + for { + response <- sendRequest(request) + } yield assertTrue(response.status == Status.Ok) }, test("given all parameters rest service should be called with default order") { val url = baseUrl.setQueryParams(Map("resourceClass" -> List(testResourceClass))) val request = Request(url = url, headers = projectHeader) - assertZIO(routeToTest(request) *> SpyLiveRestResourceInfoService.lastInvocation)( - equalTo( + for { + expectedResourceClassIri <- IriConverter.asInternalIri(testResourceClass).map(_.value) + expectedProjectIri <- IriConverter.asInternalIri(testProjectIri).map(_.value) + lastInvocation <- sendRequest(request) *> SpyLiveRestResourceInfoService.lastInvocation + } yield assertTrue( + lastInvocation == Map( - projectIriKey -> testProjectIri, - resourceClassKey -> testResourceClass, + projectIriKey -> expectedProjectIri, + resourceClassKey -> expectedResourceClassIri, orderingKey -> (lastModificationDate, ASC) ) - ) ) }, test("given all parameters rest service should be called with correct parameters") { @@ -67,15 +84,25 @@ object ResourceInfoRouteSpec extends ZIOSpecDefault { ) ) val request = Request(url = url, headers = projectHeader) - assertZIO(routeToTest(request) *> SpyLiveRestResourceInfoService.lastInvocation)( - equalTo( + for { + expectedProjectIri <- IriConverter.asInternalIri(testProjectIri).map(_.value) + expectedResourceClassIri <- IriConverter.asInternalIri(testResourceClass).map(_.value) + _ <- sendRequest(request) + lastInvocation <- SpyLiveRestResourceInfoService.lastInvocation + } yield assertTrue( + lastInvocation == Map( - projectIriKey -> testProjectIri, - resourceClassKey -> testResourceClass, + projectIriKey -> expectedProjectIri, + resourceClassKey -> expectedResourceClassIri, orderingKey -> (creationDate, DESC) ) - ) ) } - ).provide(SpyLiveRestResourceInfoService.layer, TestResourceInfoRepo.layer, IriConverter.layer) + ).provide( + ResourceInfoRoute.layer, + SpyLiveRestResourceInfoService.layer, + TestResourceInfoRepo.layer, + IriConverter.layer, + StringFormatter.testLayer + ) } diff --git a/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/SpyLiveRestResourceInfoService.scala b/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/SpyLiveRestResourceInfoService.scala index 868877e24dc..90af35cd29e 100644 --- a/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/SpyLiveRestResourceInfoService.scala +++ b/webapi/src/test/scala/org/knora/webapi/slice/resourceinfo/api/SpyLiveRestResourceInfoService.scala @@ -1,13 +1,12 @@ package org.knora.webapi.slice.resourceinfo.api +import zio._ + import org.knora.webapi.IRI -import org.knora.webapi.slice.resourceinfo.api.SpyLiveRestResourceInfoService.{ - orderingKey, - projectIriKey, - resourceClassKey -} +import org.knora.webapi.slice.resourceinfo.api.SpyLiveRestResourceInfoService.orderingKey +import org.knora.webapi.slice.resourceinfo.api.SpyLiveRestResourceInfoService.projectIriKey +import org.knora.webapi.slice.resourceinfo.api.SpyLiveRestResourceInfoService.resourceClassKey import org.knora.webapi.slice.resourceinfo.repo.TestResourceInfoRepo -import zio._ case class SpyLiveRestResourceInfoService( lastInvocation: Ref[Map[String, Any]],