Skip to content

Commit

Permalink
Move http client to kernel (#5217)
Browse files Browse the repository at this point in the history
Co-authored-by: Simon Dumas <simon.dumas@epfl.ch>
  • Loading branch information
imsdu and Simon Dumas authored Nov 1, 2024
1 parent 5db7b62 commit c560ab3
Show file tree
Hide file tree
Showing 55 changed files with 125 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import ch.epfl.bluebrain.nexus.delta.routes.IdentitiesRoutes
import ch.epfl.bluebrain.nexus.delta.sdk.PriorityRoute
import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck
import ch.epfl.bluebrain.nexus.delta.sdk.auth.{AuthTokenProvider, OpenIdAuthService}
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClient
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClient
import ch.epfl.bluebrain.nexus.delta.sdk.identities.{Identities, IdentitiesImpl}
import ch.epfl.bluebrain.nexus.delta.sdk.model.BaseUri
import ch.epfl.bluebrain.nexus.delta.sdk.provisioning.ProjectProvisioning
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import akka.http.scaladsl.model.{HttpRequest, Uri}
import cats.effect.{Clock, IO}
import ch.epfl.bluebrain.nexus.delta.Main.pluginsMaxPriority
import ch.epfl.bluebrain.nexus.delta.config.AppConfig
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClient
import ch.epfl.bluebrain.nexus.delta.kernel.utils.ClasspathResourceLoader
import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.contexts
import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.{ContextValue, RemoteContextResolution}
import ch.epfl.bluebrain.nexus.delta.rdf.utils.JsonKeyOrdering
import ch.epfl.bluebrain.nexus.delta.routes.RealmsRoutes
import ch.epfl.bluebrain.nexus.delta.sdk._
import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClient
import ch.epfl.bluebrain.nexus.delta.sdk.identities.Identities
import ch.epfl.bluebrain.nexus.delta.sdk.model.MetadataContextValue
import ch.epfl.bluebrain.nexus.delta.sdk.realms.{Realms, RealmsImpl}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch.epfl.bluebrain.nexus.delta.sdk.http
package ch.epfl.bluebrain.nexus.delta.kernel.http

import akka.actor.ActorSystem
import akka.http.javadsl.model.headers.{AcceptEncoding, HttpEncodingRange}
Expand All @@ -15,7 +15,7 @@ import ch.epfl.bluebrain.nexus.delta.kernel.AkkaSource
import ch.epfl.bluebrain.nexus.delta.kernel.utils.IOFuture
import ch.epfl.bluebrain.nexus.delta.kernel.utils.IOFuture.defaultCancelable
import ch.epfl.bluebrain.nexus.delta.kernel.circe.CirceUnmarshalling._
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError._
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError._
import ch.epfl.bluebrain.nexus.delta.kernel.syntax._
import io.circe.{Decoder, Json}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ch.epfl.bluebrain.nexus.delta.sdk.http
package ch.epfl.bluebrain.nexus.delta.kernel.http

import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientConfig.logger
import ch.epfl.bluebrain.nexus.delta.kernel.{Logger, RetryStrategy, RetryStrategyConfig}
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientConfig.logger
import pureconfig.ConfigReader
import pureconfig.error.CannotConvert
import pureconfig.generic.semiauto.deriveReader
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch.epfl.bluebrain.nexus.delta.sdk.http
package ch.epfl.bluebrain.nexus.delta.kernel.http

import akka.http.scaladsl.model.headers.HttpEncoding
import akka.http.scaladsl.model.{HttpHeader, HttpRequest, StatusCode, StatusCodes}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ch.epfl.bluebrain.nexus.delta.sdk.http
package ch.epfl.bluebrain.nexus.delta.kernel.http

import akka.http.scaladsl.model.StatusCodes.GatewayTimeout
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError.{HttpConnectError, HttpServerStatusError, HttpTimeoutError, HttpUnexpectedError}
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError.{HttpConnectError, HttpServerStatusError, HttpTimeoutError, HttpUnexpectedError}

trait HttpClientWorthRetry extends (HttpClientError => Boolean)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ch.epfl.bluebrain.nexus.delta.sdk.http
package ch.epfl.bluebrain.nexus.delta.kernel.http

import akka.actor.ActorSystem
import akka.http.scaladsl.model.MediaTypes.{`application/json`, `application/octet-stream`}
Expand All @@ -8,48 +8,48 @@ import akka.stream.scaladsl.Source
import akka.testkit.TestKit
import akka.util.ByteString
import cats.effect.IO
import ch.epfl.bluebrain.nexus.delta.kernel.RetryStrategyConfig.OnceStrategyConfig
import cats.effect.unsafe.implicits._
import ch.epfl.bluebrain.nexus.delta.kernel.AkkaSource
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClient.HttpSingleRequest
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError.{HttpClientStatusError, HttpSerializationError, HttpServerStatusError, HttpUnexpectedError}
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientSpec.{Count, Value}
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientWorthRetry.onServerError
import ch.epfl.bluebrain.nexus.delta.sdk.syntax._
import ch.epfl.bluebrain.nexus.testkit.CirceLiteral
import ch.epfl.bluebrain.nexus.testkit.scalatest.EitherValues
import ch.epfl.bluebrain.nexus.testkit.scalatest.ce.CatsEffectSpec
import ch.epfl.bluebrain.nexus.delta.kernel.RetryStrategyConfig.OnceStrategyConfig
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClient.HttpSingleRequest
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError.{HttpClientStatusError, HttpSerializationError, HttpServerStatusError, HttpUnexpectedError}
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientSpec.{Count, Value}
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientWorthRetry.onServerError
import io.circe.generic.semiauto._
import io.circe.literal._
import io.circe.parser.parse
import io.circe.syntax._
import io.circe.{Decoder, Encoder, Json}
import org.scalatest.BeforeAndAfterEach
import org.scalatest.concurrent.ScalaFutures
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AsyncWordSpecLike
import org.scalatest.{Assertion, BeforeAndAfterEach}

import java.util.concurrent.atomic.AtomicInteger
import scala.concurrent.Future
import scala.concurrent.duration._

class HttpClientSpec
extends TestKit(ActorSystem("HttpClientSpec"))
with CatsEffectSpec
with CirceLiteral
with ScalaFutures
with AsyncWordSpecLike
with BeforeAndAfterEach
with EitherValues {
with Matchers {

implicit def ioToFutureAssertion(io: IO[Assertion]): Future[Assertion] = io.unsafeToFuture()

implicit private val config: HttpClientConfig = HttpClientConfig(OnceStrategyConfig(200.millis), onServerError, false)

private val value1 = Value("first", 1, deprecated = false)
private val value2 = Value("second", 2, deprecated = true)

private val baseUri = Uri("http://localhost/v1")
private val getUri = baseUri / s"values/first"
private val baseUri = "http://localhost/v1"
private val getUri = Uri(s"$baseUri/values/first")
private val reqGetValue = HttpRequest(uri = getUri)
private val count = Count()
private val streamUri = baseUri / "values/events"
private val streamUri = Uri(s"$baseUri/values/events")
private val reqStreamValues = HttpRequest(uri = streamUri)
private val clientErrorUri = baseUri / "values/errors/client"
private val clientErrorUri = Uri(s"$baseUri/values/errors/client")
private val reqClientError = HttpRequest(uri = clientErrorUri)
private val serverErrorUri = baseUri / "values/errors/server"
private val serverErrorUri = Uri(s"$baseUri/values/errors/server")
private val reqServerError = HttpRequest(uri = serverErrorUri)

private def toSource(values: List[Json]): AkkaSource =
Expand Down Expand Up @@ -86,36 +86,57 @@ class HttpClientSpec
val client = HttpClient(httpSingleReq)

"return the Value response" in {
client.fromJsonTo[Value](reqGetValue).accepted shouldEqual value1
count.values shouldEqual Count(reqGetValue = 1).values
client.fromJsonTo[Value](reqGetValue).map { obtained =>
obtained shouldEqual value1
count.values shouldEqual Count(reqGetValue = 1).values
}
}

"return the AkkaSource response" in {
val stream = client.toDataBytes(reqStreamValues).accepted
stream
.runFold(Vector.empty[Value]) { (acc, c) => acc :+ parse(c.utf8String).rightValue.as[Value].rightValue }
.futureValue shouldEqual Vector(value1, value2)
count.values shouldEqual Count(reqStreamValues = 1).values
def parseValue(value: String) =
parse(value).flatMap(_.as[Value]).getOrElse(throw new IllegalStateException("Could not be parsed to value"))

def sourceToVector(source: AkkaSource) = source
.runFold(Vector.empty[Value]) { (acc, c) => acc :+ parseValue(c.utf8String) }
for {
source <- client.toDataBytes(reqStreamValues)
values <- IO.fromFuture(IO.delay(sourceToVector(source)))
} yield {
values shouldEqual Vector(value1, value2)
count.values shouldEqual Count(reqStreamValues = 1).values
}
}

"fail Decoding the Int response" in {
client.fromJsonTo[Int](reqGetValue).rejectedWith[HttpSerializationError]
count.values shouldEqual Count(reqGetValue = 1).values
recoverToSucceededIf[HttpSerializationError] {
client.fromJsonTo[Int](reqGetValue).map(_ => succeed)
}.map { _ =>
count.values shouldEqual Count(reqGetValue = 1).values
}
}

"fail with HttpUnexpectedError while retrying" in {
client.toJson(HttpRequest(uri = "http://other.com")).rejectedWith[HttpUnexpectedError]
count.values shouldEqual Count(reqOtherError = 2).values
recoverToSucceededIf[HttpUnexpectedError] {
client.toJson(HttpRequest(uri = "http://other.com")).map(_ => succeed)
}.map { _ =>
count.values shouldEqual Count(reqOtherError = 2).values
}
}

"fail with HttpServerStatusError while retrying" in {
client.toJson(reqServerError).rejectedWith[HttpServerStatusError]
count.values shouldEqual Count(reqServerError = 2).values
recoverToSucceededIf[HttpServerStatusError] {
client.toJson(reqServerError).map(_ => succeed)
}.map { _ =>
count.values shouldEqual Count(reqServerError = 2).values
}
}

"fail with HttpClientStatusError" in {
client.toJson(reqClientError).rejectedWith[HttpClientStatusError]
count.values shouldEqual Count(reqClientError = 1).values
recoverToSucceededIf[HttpClientStatusError] {
client.toJson(reqClientError).map(_ => succeed)
}.map { _ =>
count.values shouldEqual Count(reqClientError = 1).values
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package ch.epfl.bluebrain.nexus.delta.plugins.blazegraph

import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlClientError
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlClientError.WrappedHttpClientError
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError

object BlazegraphErrorParser {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package ch.epfl.bluebrain.nexus.delta.plugins.blazegraph
import akka.actor.ActorSystem
import cats.effect.{Clock, IO}
import ch.epfl.bluebrain.nexus.delta.kernel.dependency.ServiceDependency
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.kernel.utils.{ClasspathResourceLoader, UUIDF}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.BlazegraphClient
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.config.BlazegraphViewsConfig
Expand All @@ -19,7 +20,6 @@ import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck
import ch.epfl.bluebrain.nexus.delta.sdk.deletion.ProjectDeletionTask
import ch.epfl.bluebrain.nexus.delta.sdk.directives.DeltaSchemeDirectives
import ch.epfl.bluebrain.nexus.delta.sdk.fusion.FusionConfig
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.sdk.identities.Identities
import ch.epfl.bluebrain.nexus.delta.sdk.identities.model.ServiceAccount
import ch.epfl.bluebrain.nexus.delta.sdk.model._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ import cats.effect.IO
import cats.syntax.all._
import ch.epfl.bluebrain.nexus.delta.kernel.dependency.ComponentDescription.ServiceDescription
import ch.epfl.bluebrain.nexus.delta.kernel.dependency.ComponentDescription.ServiceDescription.ResolvedServiceDescription
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientError}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.BlazegraphClient.timeoutHeader
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlClientError.{InvalidCountRequest, WrappedHttpClientError}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlQueryResponseType.{Aux, SparqlResultsJson}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.config.BlazegraphViewsConfig.Credentials
import ch.epfl.bluebrain.nexus.delta.rdf.query.SparqlQuery
import ch.epfl.bluebrain.nexus.delta.rdf.query.SparqlQuery.SparqlConstructQuery
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientError}
import ch.epfl.bluebrain.nexus.delta.sdk.syntax._

import scala.concurrent.duration._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers.{Accept, HttpCredentials}
import cats.effect.IO
import cats.syntax.all._
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientError}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlClientError.{InvalidUpdateRequest, WrappedHttpClientError}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlQueryResponse.{SparqlJsonLdResponse, SparqlNTriplesResponse, SparqlRdfXmlResponse, SparqlResultsResponse, SparqlXmlResultsResponse}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.SparqlQueryResponseType._
import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.BNode
import ch.epfl.bluebrain.nexus.delta.rdf.graph.NTriples
import ch.epfl.bluebrain.nexus.delta.rdf.query.SparqlQuery
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientError}
import ch.epfl.bluebrain.nexus.delta.sdk.syntax._
import io.circe.Json
import io.circe.syntax._
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client

import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError

/**
* Error that can occur when using an [[SparqlClient]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ch.epfl.bluebrain.nexus.delta.kernel.Secret
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.config.BlazegraphViewsConfig.Credentials
import ch.epfl.bluebrain.nexus.delta.sdk.Defaults
import ch.epfl.bluebrain.nexus.delta.sdk.instances._
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientConfig
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientConfig
import ch.epfl.bluebrain.nexus.delta.sdk.model.search.PaginationConfig
import ch.epfl.bluebrain.nexus.delta.sourcing.config.{BatchConfig, EventLogConfig}
import com.typesafe.config.Config
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package ch.epfl.bluebrain.nexus.delta.plugins.blazegraph
import akka.actor.ActorSystem
import cats.effect.{IO, Resource}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.BlazegraphClient
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientSetup
import ch.epfl.bluebrain.nexus.testkit.blazegraph.BlazegraphContainer
import ch.epfl.bluebrain.nexus.testkit.http.HttpClientSetup
import munit.CatsEffectSuite
import munit.catseffect.IOFixture

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.RemoteContextResolution
import ch.epfl.bluebrain.nexus.delta.rdf.query.SparqlQuery
import ch.epfl.bluebrain.nexus.delta.rdf.query.SparqlQuery.SparqlConstructQuery
import ch.epfl.bluebrain.nexus.delta.sdk.ConfigFixtures
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError.{HttpClientStatusError, HttpServerStatusError}
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError.{HttpClientStatusError, HttpServerStatusError}
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.sdk.syntax._
import ch.epfl.bluebrain.nexus.testkit.blazegraph.BlazegraphDocker
import ch.epfl.bluebrain.nexus.testkit.scalatest.ce.CatsEffectSpec
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import cats.data.NonEmptySet
import cats.effect.IO
import cats.syntax.all._
import ch.epfl.bluebrain.nexus.delta.kernel.RetryStrategyConfig.AlwaysGiveUp
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientConfig, HttpClientWorthRetry}
import ch.epfl.bluebrain.nexus.delta.kernel.search.Pagination
import ch.epfl.bluebrain.nexus.delta.kernel.utils.UUIDF
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.BlazegraphViewsQuery.BlazegraphQueryContext
Expand All @@ -28,7 +29,6 @@ import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclSimpleCheck
import ch.epfl.bluebrain.nexus.delta.sdk.acls.model.AclAddress
import ch.epfl.bluebrain.nexus.delta.sdk.error.ServiceError.AuthorizationFailed
import ch.epfl.bluebrain.nexus.delta.sdk.generators.ProjectGen
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientConfig, HttpClientWorthRetry}
import ch.epfl.bluebrain.nexus.delta.sdk.identities.model.Caller
import ch.epfl.bluebrain.nexus.delta.sdk.implicits._
import ch.epfl.bluebrain.nexus.delta.sdk.model._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ch.epfl.bluebrain.nexus.delta.plugins.compositeviews

import akka.actor.ActorSystem
import cats.effect.{Clock, IO}
import ch.epfl.bluebrain.nexus.delta.kernel.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.kernel.utils.{ClasspathResourceLoader, UUIDF}
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.client.BlazegraphClient
import ch.epfl.bluebrain.nexus.delta.plugins.blazegraph.model.DefaultProperties
Expand All @@ -25,7 +26,6 @@ import ch.epfl.bluebrain.nexus.delta.sdk.auth.AuthTokenProvider
import ch.epfl.bluebrain.nexus.delta.sdk.deletion.ProjectDeletionTask
import ch.epfl.bluebrain.nexus.delta.sdk.directives.DeltaSchemeDirectives
import ch.epfl.bluebrain.nexus.delta.sdk.fusion.FusionConfig
import ch.epfl.bluebrain.nexus.delta.sdk.http.{HttpClient, HttpClientConfig}
import ch.epfl.bluebrain.nexus.delta.sdk.identities.Identities
import ch.epfl.bluebrain.nexus.delta.sdk.model._
import ch.epfl.bluebrain.nexus.delta.sdk.model.metrics.ScopedEventMetricEncoder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import akka.http.scaladsl.model.Uri
import akka.http.scaladsl.model.Uri.Query
import cats.effect.IO
import cats.syntax.all._
import ch.epfl.bluebrain.nexus.delta.kernel.http.HttpClientError
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.indexing.CompositeViewDef.ActiveViewDef
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.indexing.projectionIndex
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.model.CompositeViewProjection.ElasticSearchProjection
import ch.epfl.bluebrain.nexus.delta.plugins.compositeviews.model.CompositeViewRejection.WrappedElasticSearchClientError
import ch.epfl.bluebrain.nexus.delta.plugins.elasticsearch.client.ElasticSearchClient
import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck
import ch.epfl.bluebrain.nexus.delta.sdk.error.ServiceError.AuthorizationFailed
import ch.epfl.bluebrain.nexus.delta.sdk.http.HttpClientError
import ch.epfl.bluebrain.nexus.delta.sdk.identities.model.Caller
import ch.epfl.bluebrain.nexus.delta.sdk.model.IdSegment
import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SortList
Expand Down
Loading

0 comments on commit c560ab3

Please sign in to comment.