Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

feat: Add resources/info endpoint (DEV-792) #2309

Merged
merged 26 commits into from Dec 19, 2022
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
37fd1ce
Add route for getting information for resources /v2/resources/info
seakayone Nov 29, 2022
e378fad
Merge branch 'main' into wip/add-resources-info-DEV-792
seakayone Dec 15, 2022
e967b0f
Use URIO type alias
seakayone Dec 15, 2022
6a9ee95
fmt
seakayone Dec 15, 2022
3ab1478
rename IriConverterLive and IriConverterLiveSpec
seakayone Dec 16, 2022
d5c573d
rename layer accessors for StringFormatter
seakayone Dec 16, 2022
6f78287
regenerate type annotation for layer in ApiRoutes
seakayone Dec 16, 2022
9a0c4ab
rename title
seakayone Dec 16, 2022
65712e5
Remove unused class
seakayone Dec 16, 2022
4a2a0b7
Rename ResourceInfoRepoLive
seakayone Dec 16, 2022
71404ea
Rename ResourceInfoRepoFake
seakayone Dec 16, 2022
a8d9e76
More renaming and organize layers
seakayone Dec 16, 2022
4627d1a
fmt
seakayone Dec 16, 2022
14aed93
clarify types of ResourceInfoRepoFake
seakayone Dec 16, 2022
e695eb5
Retain pattern of throwing an exception in the RouteUtilV2 getRequire…
seakayone Dec 16, 2022
1b36d8a
Remove translation of external to internal IRI from ResourceRouteV2 a…
seakayone Dec 16, 2022
0e93589
Clarify that exception is intentionally thrown from try
seakayone Dec 16, 2022
2272e16
Add docu fo the ApplyUpgradePluginToTestData
seakayone Dec 16, 2022
3954bfd
fmt
seakayone Dec 16, 2022
2bf016a
Update webapi/src/it/scala/org/knora/webapi/slice/resourceinfo/api/Ir…
seakayone Dec 16, 2022
06bd297
Remove $ from class and filename
seakayone Dec 16, 2022
113973a
Merge branch 'main' into wip/add-resources-info-DEV-792
seakayone Dec 19, 2022
2acfb76
add missing layers to LayersTest
seakayone Dec 19, 2022
0c72d47
Add types
seakayone Dec 19, 2022
e36e68f
sort lines
seakayone Dec 19, 2022
8b163ff
Add StringFormatter
seakayone Dec 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
65 changes: 40 additions & 25 deletions webapi/src/it/scala/org/knora/webapi/core/LayersTest.scala
@@ -1,9 +1,10 @@
package org.knora.webapi.core

import zio.ZLayer
import org.knora.webapi.auth.JWTService
import org.knora.webapi.config.AppConfigForTestContainers
import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.routing.ApiRoutes
import org.knora.webapi.slice.resourceinfo.domain.IriConverter
import org.knora.webapi.store.cache.CacheServiceManager
import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl
import org.knora.webapi.store.iiif.IIIFServiceManager
Expand All @@ -15,6 +16,10 @@ import org.knora.webapi.store.triplestore.upgrade.RepositoryUpdater
import org.knora.webapi.testcontainers.FusekiTestContainer
import org.knora.webapi.testcontainers.SipiTestContainer
import org.knora.webapi.testservices.TestClientService
import zio.ZLayer

import org.knora.webapi.slice.resourceinfo.api.RestResourceInfoService
import org.knora.webapi.slice.resourceinfo.domain.ResourceInfoRepo

object LayersTest {

Expand All @@ -33,21 +38,23 @@ object LayersTest {
ApiRoutes.layer,
AppConfigForTestContainers.testcontainers,
AppRouter.layer,
CacheServiceManager.layer,
CacheServiceInMemImpl.layer,
CacheServiceManager.layer,
FusekiTestContainer.layer,
HttpServer.layer,
IIIFServiceManager.layer,
IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer
IriConverter.layer,
JWTService.layer,
RepositoryUpdater.layer,
ResourceInfoRepo.layer,
RestResourceInfoService.layer,
SipiTestContainer.layer,
State.layer,
TriplestoreServiceManager.layer,
StringFormatter.test,
TestClientService.layer,
TriplestoreServiceHttpConnectorImpl.layer,
// testcontainers
SipiTestContainer.layer,
FusekiTestContainer.layer,
// Test services
TestClientService.layer
TriplestoreServiceManager.layer
)

/**
Expand All @@ -59,20 +66,22 @@ object LayersTest {
ApiRoutes.layer,
AppConfigForTestContainers.fusekiOnlyTestcontainer,
AppRouter.layer,
CacheServiceManager.layer,
CacheServiceInMemImpl.layer,
CacheServiceManager.layer,
FusekiTestContainer.layer,
HttpServer.layer,
IIIFServiceManager.layer,
IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer
IriConverter.layer,
JWTService.layer,
RepositoryUpdater.layer,
ResourceInfoRepo.layer,
RestResourceInfoService.layer,
State.layer,
TriplestoreServiceManager.layer,
StringFormatter.live,
TestClientService.layer,
TriplestoreServiceHttpConnectorImpl.layer,
// testcontainers
FusekiTestContainer.layer,
// Test services
TestClientService.layer
TriplestoreServiceManager.layer
)

/**
Expand All @@ -84,20 +93,22 @@ object LayersTest {
ApiRoutes.layer,
AppConfigForTestContainers.fusekiOnlyTestcontainer,
AppRouter.layer,
CacheServiceManager.layer,
CacheServiceInMemImpl.layer,
CacheServiceManager.layer,
FusekiTestContainer.layer,
HttpServer.layer,
IIIFServiceManager.layer,
IIIFServiceSipiImpl.layer, // alternative: MockSipiImpl.layer
IIIFServiceSipiImpl.layer,
IriConverter.layer,
JWTService.layer,
RepositoryUpdater.layer,
ResourceInfoRepo.layer,
RestResourceInfoService.layer,
State.layer,
TriplestoreServiceManager.layer,
StringFormatter.live,
TestClientService.layer,
TriplestoreServiceHttpConnectorImpl.layer,
// testcontainers
FusekiTestContainer.layer,
// Test services
TestClientService.layer
TriplestoreServiceManager.layer
)

/**
Expand All @@ -119,9 +130,11 @@ object LayersTest {
State.layer,
TriplestoreServiceManager.layer,
TriplestoreServiceHttpConnectorImpl.layer,
// testcontainers
RestResourceInfoService.layer,
ResourceInfoRepo.layer,
IriConverter.layer,
StringFormatter.live,
FusekiTestContainer.layer,
// Test services
TestClientService.layer
)

Expand All @@ -144,9 +157,11 @@ object LayersTest {
State.layer,
TriplestoreServiceManager.layer,
TriplestoreServiceHttpConnectorImpl.layer,
// testcontainers
RestResourceInfoService.layer,
ResourceInfoRepo.layer,
IriConverter.layer,
StringFormatter.live,
FusekiTestContainer.layer,
// Test services
TestClientService.layer
)
}
Expand Up @@ -58,7 +58,7 @@ class ResourcesV1R2RSpec extends R2RSpec {
private val resourcesPathV1 =
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV1(routeData).makeRoute)
private val resourcesPathV2 =
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute)
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData, null).makeRoute)
private val valuesPathV1 =
DSPApiDirectives.handleErrors(system, appConfig)(new ValuesRouteV1(routeData).makeRoute)

Expand Down
Expand Up @@ -25,7 +25,7 @@ import org.knora.webapi.routing.v2.ResourcesRouteV2
*/
class JSONLDHandlingV2R2RSpec extends R2RSpec {

private val resourcesPath = new ResourcesRouteV2(routeData).makeRoute
private val resourcesPath = new ResourcesRouteV2(routeData, null).makeRoute

implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(
appConfig.defaultTimeoutAsDuration
Expand Down
Expand Up @@ -66,7 +66,7 @@ class OntologyV2R2RSpec extends R2RSpec {
private val ontologiesPath =
DSPApiDirectives.handleErrors(system, appConfig)(new OntologiesRouteV2(routeData).makeRoute)
private val resourcesPath =
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute)
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData, null).makeRoute)

implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(
appConfig.defaultTimeoutAsDuration
Expand Down
Expand Up @@ -54,7 +54,7 @@ class SearchRouteV2R2RSpec extends R2RSpec {
private val searchPath =
DSPApiDirectives.handleErrors(system, appConfig)(new SearchRouteV2(routeData).makeRoute)
private val resourcePath =
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData).makeRoute)
DSPApiDirectives.handleErrors(system, appConfig)(new ResourcesRouteV2(routeData, null).makeRoute)
private val standoffPath =
DSPApiDirectives.handleErrors(system, appConfig)(new StandoffRouteV2(routeData).makeRoute)
private val valuesPath =
Expand Down
@@ -0,0 +1,22 @@
package org.knora.webapi.slice.resourceinfo.api

import org.knora.webapi.messages.StringFormatter
import org.knora.webapi.slice.resourceinfo.domain
import org.knora.webapi.slice.resourceinfo.domain.{InternalIri, IriConverter}
import zio.test._

object IriConverterLiveSpec$ extends ZIOSpecDefault {

def spec = suite("IriConverter")(
seakayone marked this conversation as resolved.
Show resolved Hide resolved
test("should not convert the projectIri") {
for {
internal <- IriConverter.asInternalIri("http://project-iri")
} yield assertTrue(internal == domain.InternalIri("http://project-iri"))
},
test("should convert a resourceClassIri") {
for {
internal <- IriConverter.asInternalIri("http://0.0.0.0:3333/ontology/0001/anything/v2#Thing")
} yield assertTrue(internal == InternalIri("http://www.knora.org/ontology/0001/anything#Thing"))
}
).provide(IriConverter.layer, StringFormatter.test)
}
Expand Up @@ -8,9 +8,12 @@ package org.knora.webapi.store.triplestore.upgrade.plugins
import com.typesafe.scalalogging.Logger
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpecLike

import scala.util.Failure
import scala.util.Success
import java.io.BufferedInputStream
import java.io.ByteArrayInputStream
import java.io.FileInputStream
import scala.util.Using

import org.knora.webapi.messages.util.ErrorHandlingMap
import org.knora.webapi.messages.util.rdf._
Expand All @@ -37,6 +40,18 @@ abstract class UpgradePluginSpec extends AnyWordSpecLike with Matchers {
rdfModel
}

/**
* Parses a TriG String and returns it as an [[RdfModel]].
*
* @param s the [[String]] content of a "TriG file".
* @return an [[RdfModel]].
*/
def stringToModel(s: String): RdfModel =
Using(new ByteArrayInputStream(s.getBytes))(rdfFormatUtil.inputStreamToRdfModel(_, TriG)) match {
case Success(value) => value
case Failure(e) => throw new IllegalArgumentException("Invalid model", e)
}

/**
* Wraps expected SPARQL SELECT results in a [[SparqlSelectResultBody]].
*
Expand Down
10 changes: 3 additions & 7 deletions webapi/src/main/scala/org/knora/webapi/config/AppConfig.scala
Expand Up @@ -8,6 +8,8 @@ package org.knora.webapi.config
import com.typesafe.config.ConfigFactory
import zio._
import zio.config._
import zio.config.magnolia._
import zio.config.typesafe._

import java.nio.file.Files
import java.nio.file.Path
Expand All @@ -19,13 +21,9 @@ 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 typesafe._
import magnolia._

/**
* Represents the configuration as defined in application.conf.
*/
Expand Down Expand Up @@ -272,7 +270,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 @@ -283,8 +280,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
26 changes: 15 additions & 11 deletions webapi/src/main/scala/org/knora/webapi/core/HttpServerZ.scala
Expand Up @@ -4,24 +4,28 @@
*/

package org.knora.webapi.core
import zhttp.http.HttpApp
import zhttp.service.Server
import zio.ZLayer
import zio._

import org.knora.webapi.config.AppConfig
import org.knora.webapi.routing.admin.ProjectsRouteZ
import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute

object HttpServerZ {

val layer: ZLayer[AppRouter & AppConfig & State & ProjectsRouteZ, Nothing, Unit] =
ZLayer {
for {
appConfig <- ZIO.service[AppConfig]
projectsRoute <- ZIO.service[ProjectsRouteZ]
r = projectsRoute.route
port = appConfig.knoraApi.externalZioPort
_ <- Server.start(port, r).forkDaemon
_ <- ZIO.logInfo(">>> Acquire ZIO HTTP Server <<<")
} yield ()
}
private val apiRoutes: URIO[ResourceInfoRoute with ProjectsRouteZ, HttpApp[Any, Nothing]] = for {
projectsRoute <- ZIO.service[ProjectsRouteZ].map(_.route)
riRoute <- ZIO.service[ResourceInfoRoute].map(_.route)
} yield projectsRoute ++ riRoute

val layer: ZLayer[ResourceInfoRoute with ProjectsRouteZ with AppConfig, Nothing, Unit] = ZLayer {
for {
port <- ZIO.service[AppConfig].map(_.knoraApi.externalZioPort)
routes <- apiRoutes
_ <- Server.start(port, routes).forkDaemon
_ <- ZIO.logInfo(">>> Acquire ZIO HTTP Server <<<")
} yield ()
}
}
@@ -1,3 +1,8 @@
/*
* Copyright © 2021 - 2022 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.core

import zhttp.service.Server
Expand Down
16 changes: 13 additions & 3 deletions webapi/src/main/scala/org/knora/webapi/core/LayersLive.scala
Expand Up @@ -10,8 +10,13 @@ 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.routing.admin.ProjectsRouteZ
import org.knora.webapi.slice.resourceinfo.api.ResourceInfoRoute
import org.knora.webapi.slice.resourceinfo.api.RestResourceInfoService
import org.knora.webapi.slice.resourceinfo.domain.IriConverter
import org.knora.webapi.slice.resourceinfo.domain.ResourceInfoRepo
import org.knora.webapi.store.cache.CacheServiceManager
import org.knora.webapi.store.cache.api.CacheService
import org.knora.webapi.store.cache.impl.CacheServiceInMemImpl
Expand Down Expand Up @@ -53,17 +58,22 @@ object LayersLive {
ApiRoutes.layer,
AppConfig.live,
AppRouter.layer,
CacheServiceManager.layer,
CacheServiceInMemImpl.layer,
CacheServiceManager.layer,
HttpServer.layer,
HttpServerZ.layer, // this is the new ZIO HTTP server layer
IIIFServiceManager.layer,
IIIFServiceSipiImpl.layer,
IriConverter.layer,
JWTService.layer,
ProjectsRouteZ.layer,
RepositoryUpdater.layer,
ResourceInfoRepo.layer,
ResourceInfoRoute.layer,
RestResourceInfoService.layer,
State.layer,
TriplestoreServiceManager.layer,
StringFormatter.live,
TriplestoreServiceHttpConnectorImpl.layer,
ProjectsRouteZ.layer
TriplestoreServiceManager.layer
)
}
@@ -1,3 +1,8 @@
/*
* Copyright © 2021 - 2022 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.instrumentation.index

import zhttp.html.Html
Expand Down
@@ -1,3 +1,8 @@
/*
* Copyright © 2021 - 2022 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.instrumentation.prometheus

import zhttp.http._
Expand Down