diff --git a/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutes.scala b/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutes.scala index 34b6982acf..c54a3f604f 100644 --- a/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutes.scala +++ b/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutes.scala @@ -20,6 +20,8 @@ import ch.epfl.bluebrain.nexus.delta.sdk.identities.Identities 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.marshalling.{HttpResponseFields, OriginalSource, RdfMarshalling} +import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchResults +import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchResults.searchResultsJsonLdEncoder import ch.epfl.bluebrain.nexus.delta.sdk.model.{BaseUri, IdSegment, IdSegmentRef, ResourceF} import ch.epfl.bluebrain.nexus.delta.sdk.permissions.Permissions import ch.epfl.bluebrain.nexus.delta.sdk.permissions.Permissions.resolvers.{read => Read, write => Write} @@ -40,16 +42,13 @@ import io.circe.Json * the resolvers module * @param schemeDirectives * directives related to orgs and projects - * @param indexAction - * the indexing action on write operations */ final class ResolversRoutes( identities: Identities, aclCheck: AclCheck, resolvers: Resolvers, multiResolution: MultiResolution, - schemeDirectives: DeltaSchemeDirectives, - indexAction: IndexingAction.Execute[Resolver] + schemeDirectives: DeltaSchemeDirectives )(implicit baseUri: BaseUri, cr: RemoteContextResolution, @@ -86,17 +85,22 @@ final class ResolversRoutes( (baseUriPrefix(baseUri.prefix) & replaceUri("resolvers", schemas.resolvers)) { pathPrefix("resolvers") { extractCaller { implicit caller => - (projectRef & indexingMode) { (project, indexingMode) => - def index(resolver: ResolverResource): IO[Unit] = - indexAction(resolver.value.project, resolver, indexingMode) - val authorizeRead = authorizeFor(project, Read) - val authorizeWrite = authorizeFor(project, Write) + projectRef { project => + val authorizeRead = authorizeFor(project, Read) + val authorizeWrite = authorizeFor(project, Write) concat( + pathEndOrSingleSlash { + (get & authorizeRead) { + implicit val searchJsonLdEncoder: JsonLdEncoder[SearchResults[ResolverResource]] = + searchResultsJsonLdEncoder(Resolver.context) + emit(resolvers.list(project).widen[SearchResults[ResolverResource]]) + } + }, pathEndOrSingleSlash { // Create a resolver without an id segment (post & noParameter("rev") & entity(as[Json])) { payload => authorizeWrite { - emitMetadata(Created, resolvers.create(project, payload).flatTap(index)) + emitMetadata(Created, resolvers.create(project, payload)) } } }, @@ -109,17 +113,17 @@ final class ResolversRoutes( (parameter("rev".as[Int].?) & pathEndOrSingleSlash & entity(as[Json])) { case (None, payload) => // Create a resolver with an id segment - emitMetadata(Created, resolvers.create(resolver, project, payload).flatTap(index)) + emitMetadata(Created, resolvers.create(resolver, project, payload)) case (Some(rev), payload) => // Update a resolver - emitMetadata(resolvers.update(resolver, project, rev, payload).flatTap(index)) + emitMetadata(resolvers.update(resolver, project, rev, payload)) } } }, (delete & parameter("rev".as[Int])) { rev => authorizeWrite { // Deprecate a resolver - emitMetadataOrReject(resolvers.deprecate(resolver, project, rev).flatTap(index)) + emitMetadataOrReject(resolvers.deprecate(resolver, project, rev)) } }, // Fetches a resolver @@ -226,14 +230,13 @@ object ResolversRoutes { aclCheck: AclCheck, resolvers: Resolvers, multiResolution: MultiResolution, - schemeDirectives: DeltaSchemeDirectives, - index: IndexingAction.Execute[Resolver] + schemeDirectives: DeltaSchemeDirectives )(implicit baseUri: BaseUri, cr: RemoteContextResolution, ordering: JsonKeyOrdering, fusionConfig: FusionConfig ): Route = - new ResolversRoutes(identities, aclCheck, resolvers, multiResolution, schemeDirectives, index).routes + new ResolversRoutes(identities, aclCheck, resolvers, multiResolution, schemeDirectives).routes } diff --git a/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/wiring/ResolversModule.scala b/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/wiring/ResolversModule.scala index 9a4de5e3df..4bb78fa520 100644 --- a/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/wiring/ResolversModule.scala +++ b/delta/app/src/main/scala/ch/epfl/bluebrain/nexus/delta/wiring/ResolversModule.scala @@ -8,7 +8,6 @@ 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.ResolversRoutes -import ch.epfl.bluebrain.nexus.delta.sdk.IndexingAction.AggregateIndexingAction import ch.epfl.bluebrain.nexus.delta.sdk._ import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck import ch.epfl.bluebrain.nexus.delta.sdk.directives.DeltaSchemeDirectives @@ -16,11 +15,10 @@ import ch.epfl.bluebrain.nexus.delta.sdk.fusion.FusionConfig 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._ -import ch.epfl.bluebrain.nexus.delta.sdk.model.metrics.ScopedEventMetricEncoder import ch.epfl.bluebrain.nexus.delta.sdk.projects.FetchContext import ch.epfl.bluebrain.nexus.delta.sdk.projects.model.ApiMappings import ch.epfl.bluebrain.nexus.delta.sdk.resolvers._ -import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.{Resolver, ResolverEvent} +import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResolverEvent import ch.epfl.bluebrain.nexus.delta.sdk.sse.SseEncoder import ch.epfl.bluebrain.nexus.delta.sourcing.Transactors import izumi.distage.model.definition.{Id, ModuleDef} @@ -70,8 +68,6 @@ object ResolversModule extends ModuleDef { aclCheck: AclCheck, resolvers: Resolvers, schemeDirectives: DeltaSchemeDirectives, - indexingAction: AggregateIndexingAction, - shift: Resolver.Shift, multiResolution: MultiResolution, baseUri: BaseUri, cr: RemoteContextResolution @Id("aggregate"), @@ -83,8 +79,7 @@ object ResolversModule extends ModuleDef { aclCheck, resolvers, multiResolution, - schemeDirectives, - indexingAction(_, _, _)(shift) + schemeDirectives )( baseUri, cr, @@ -95,8 +90,6 @@ object ResolversModule extends ModuleDef { many[SseEncoder[_]].add { base: BaseUri => ResolverEvent.sseEncoder(base) } - many[ScopedEventMetricEncoder[_]].add { ResolverEvent.resolverEventMetricEncoder } - make[ResolverScopeInitialization].from { (resolvers: Resolvers, serviceAccount: ServiceAccount, config: AppConfig) => ResolverScopeInitialization(resolvers, serviceAccount, config.resolvers.defaults) } @@ -104,8 +97,6 @@ object ResolversModule extends ModuleDef { many[ApiMappings].add(Resolvers.mappings) - many[ResourceToSchemaMappings].add(Resolvers.resourcesToSchemas) - many[MetadataContextValue].addEffect(MetadataContextValue.fromFile("contexts/resolvers-metadata.json")) many[RemoteContextResolution].addEffect( @@ -120,10 +111,4 @@ object ResolversModule extends ModuleDef { many[PriorityRoute].add { (route: ResolversRoutes) => PriorityRoute(pluginsMaxPriority + 9, route.routes, requiresStrictEntity = true) } - - make[Resolver.Shift].from { (resolvers: Resolvers, base: BaseUri) => - Resolver.shift(resolvers)(base) - } - - many[ResourceShift[_, _, _]].ref[Resolver.Shift] } diff --git a/delta/app/src/test/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutesSpec.scala b/delta/app/src/test/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutesSpec.scala index b4fe308dcc..3f24bf8392 100644 --- a/delta/app/src/test/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutesSpec.scala +++ b/delta/app/src/test/scala/ch/epfl/bluebrain/nexus/delta/routes/ResolversRoutesSpec.scala @@ -8,7 +8,6 @@ import cats.effect.IO import ch.epfl.bluebrain.nexus.delta.kernel.utils.{UUIDF, UrlUtils} import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.Iri import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.{contexts, nxv, schema, schemas} -import ch.epfl.bluebrain.nexus.delta.sdk.IndexingAction 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.directives.DeltaSchemeDirectives @@ -121,9 +120,7 @@ class ResolversRoutesSpec extends BaseRouteSpec { private lazy val multiResolution = MultiResolution(fetchContext, resolverResolution) private lazy val routes = - Route.seal( - ResolversRoutes(identities, aclCheck, resolvers, multiResolution, groupDirectives, IndexingAction.noop) - ) + Route.seal(ResolversRoutes(identities, aclCheck, resolvers, multiResolution, groupDirectives)) private def withId(id: String, payload: Json) = payload.deepMerge(Json.obj("@id" -> id.asJson)) @@ -573,6 +570,21 @@ class ResolversRoutesSpec extends BaseRouteSpec { } } + "listing resolvers" should { + "succeed if the user has read access to the given project" in { + Get(s"/v1/resolvers/${project.ref}") ~> asBob ~> routes ~> check { + status shouldEqual StatusCodes.OK + response.asJson.asObject.value("_total").value shouldEqual Json.fromLong(3L) + } + } + + "fail if the user has no read access to the given project" in { + Get(s"/v1/resolvers/${project.ref}") ~> routes ~> check { + response.shouldBeForbidden + } + } + } + val idResourceEncoded = UrlUtils.encode(resourceId.toString) val idSchemaEncoded = UrlUtils.encode(schemaId.toString) val unknownResourceEncoded = UrlUtils.encode((nxv + "xxx").toString) diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/model/search/SearchParams.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/model/search/SearchParams.scala index 3292109020..ab495bb21d 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/model/search/SearchParams.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/model/search/SearchParams.scala @@ -7,10 +7,9 @@ import ch.epfl.bluebrain.nexus.delta.sdk.model.ResourceF import ch.epfl.bluebrain.nexus.delta.sdk.organizations.model.Organization import ch.epfl.bluebrain.nexus.delta.sdk.projects.model.Project import ch.epfl.bluebrain.nexus.delta.sdk.realms.model.Realm -import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.Resolver import ch.epfl.bluebrain.nexus.delta.sourcing.model.Identity.Subject import ch.epfl.bluebrain.nexus.delta.sourcing.model.ResourceRef.Latest -import ch.epfl.bluebrain.nexus.delta.sourcing.model.{Label, ProjectRef, ResourceRef} +import ch.epfl.bluebrain.nexus.delta.sourcing.model.{Label, ResourceRef} /** * Enumeration of the possible Search Parameters @@ -156,38 +155,4 @@ object SearchParams { ) } - /** - * Search parameters for resolvers - * - * @param project - * the option project of the resolver resources - * @param deprecated - * the optional deprecation status of resolver project resources - * @param rev - * the optional revision of the resolver resources - * @param createdBy - * the optional subject who created the resolver resource - * @param updatedBy - * the optional subject who updated the resolver - * @param types - * the types the resolver should contain - * @param filter - * the additional filter to select resolvers - */ - final case class ResolverSearchParams( - project: Option[ProjectRef] = None, - deprecated: Option[Boolean] = None, - rev: Option[Int] = None, - createdBy: Option[Subject] = None, - updatedBy: Option[Subject] = None, - types: Set[Iri] = Set(nxv.Resolver), - filter: Resolver => IO[Boolean] - ) extends SearchParams[Resolver] { - override val schema: Option[ResourceRef] = Some(Latest(nxvschemas.resolvers)) - - override def matches(resource: ResourceF[Resolver]): IO[Boolean] = - super.matches(resource).map(_ && project.forall(_ == resource.value.project)) - - } - } diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolverResolution.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolverResolution.scala index 47a24db77a..1a6218aab7 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolverResolution.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolverResolution.scala @@ -2,15 +2,13 @@ package ch.epfl.bluebrain.nexus.delta.sdk.resolvers import cats.effect.IO import cats.implicits._ -import ch.epfl.bluebrain.nexus.delta.kernel.search.Pagination import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.Iri +import ch.epfl.bluebrain.nexus.delta.sdk.ResourceShifts import ch.epfl.bluebrain.nexus.delta.sdk.acls.AclCheck import ch.epfl.bluebrain.nexus.delta.sdk.identities.model.Caller import ch.epfl.bluebrain.nexus.delta.sdk.jsonld.JsonLdContent import ch.epfl.bluebrain.nexus.delta.sdk.model.Fetch.Fetch import ch.epfl.bluebrain.nexus.delta.sdk.model.ResourceF -import ch.epfl.bluebrain.nexus.delta.sdk.model.search.ResultEntry -import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchParams.ResolverSearchParams import ch.epfl.bluebrain.nexus.delta.sdk.permissions.Permissions import ch.epfl.bluebrain.nexus.delta.sdk.permissions.model.Permission import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.ResolverResolution.{DeprecationCheck, ResolverResolutionResult} @@ -19,10 +17,8 @@ import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.Resolver.{CrossProjectR import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResolverResolutionRejection._ import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResourceResolutionReport.{ResolverFailedReport, ResolverReport, ResolverSuccessReport} import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.{Resolver, ResolverRejection, ResolverResolutionRejection, ResourceResolutionReport} -import ch.epfl.bluebrain.nexus.delta.sdk.{ResolverResource, ResourceShifts} import ch.epfl.bluebrain.nexus.delta.sourcing.model.{Identity, ProjectRef, ResourceRef} -import java.time.Instant import scala.collection.immutable.VectorMap /** @@ -229,10 +225,6 @@ object ResolverResolution { type ResolverResolutionResult[R] = (ResolverReport, Option[R]) - private val resolverSearchParams = ResolverSearchParams(deprecated = Some(false), filter = _ => IO.pure(true)) - - private val resolverOrdering: Ordering[ResolverResource] = Ordering[Instant] on (r => r.createdAt) - /** * Allows to check and exclude deprecated resources from the resolution * @param enabled @@ -264,17 +256,21 @@ object ResolverResolution { extractTypes: R => Set[Iri], readPermission: Permission, deprecationCheck: DeprecationCheck[R] - ) = new ResolverResolution( - checkAcls = (p: ProjectRef, identities: Set[Identity]) => aclCheck.authorizeFor(p, readPermission, identities), - listResolvers = (projectRef: ProjectRef) => - resolvers - .list(projectRef, Pagination.OnePage, resolverSearchParams, resolverOrdering) - .map { r => r.results.map { r: ResultEntry[ResolverResource] => r.source.value }.toList }, - fetchResolver = (id: Iri, projectRef: ProjectRef) => resolvers.fetchActiveResolver(id, projectRef), - fetch = fetch, - extractTypes, - deprecationCheck - ) + ) = { + def fetchActiveResolvers(project: ProjectRef) = resolvers + .list(project) + .map { r => + r.results.mapFilter { r => Option.unless(r.source.deprecated)(r.source.value) }.toList + } + new ResolverResolution( + checkAcls = (p: ProjectRef, identities: Set[Identity]) => aclCheck.authorizeFor(p, readPermission, identities), + listResolvers = fetchActiveResolvers, + fetchResolver = (id: Iri, projectRef: ProjectRef) => resolvers.fetchActiveResolver(id, projectRef), + fetch = fetch, + extractTypes, + deprecationCheck + ) + } /** * Resolution based on resolvers and reference exchanges diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/Resolvers.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/Resolvers.scala index a0e15997b4..cb96594eae 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/Resolvers.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/Resolvers.scala @@ -1,7 +1,6 @@ package ch.epfl.bluebrain.nexus.delta.sdk.resolvers import cats.effect.{Clock, IO} -import ch.epfl.bluebrain.nexus.delta.kernel.search.Pagination.FromPagination import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.Iri import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.{contexts, nxv, schemas} import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.ContextValue @@ -9,9 +8,8 @@ import ch.epfl.bluebrain.nexus.delta.sdk.ResolverResource import ch.epfl.bluebrain.nexus.delta.sdk.identities.model.Caller import ch.epfl.bluebrain.nexus.delta.sdk.instances._ import ch.epfl.bluebrain.nexus.delta.sdk.jsonld.ExpandIri -import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchParams.ResolverSearchParams import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchResults.UnscoredSearchResults -import ch.epfl.bluebrain.nexus.delta.sdk.model.{IdSegment, IdSegmentRef, ResourceToSchemaMappings} +import ch.epfl.bluebrain.nexus.delta.sdk.model.{IdSegment, IdSegmentRef} import ch.epfl.bluebrain.nexus.delta.sdk.projects.Projects import ch.epfl.bluebrain.nexus.delta.sdk.projects.model.ApiMappings import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.IdentityResolution.{ProvidedIdentities, UseCurrentCaller} @@ -23,7 +21,7 @@ import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model._ import ch.epfl.bluebrain.nexus.delta.sourcing.ScopedEntityDefinition.Tagger import ch.epfl.bluebrain.nexus.delta.sourcing.model.EntityDependency.DependsOn import ch.epfl.bluebrain.nexus.delta.sourcing.model.Identity.Subject -import ch.epfl.bluebrain.nexus.delta.sourcing.model.{EntityType, Label, ProjectRef} +import ch.epfl.bluebrain.nexus.delta.sourcing.model.{EntityType, ProjectRef} import ch.epfl.bluebrain.nexus.delta.sourcing.{ScopedEntityDefinition, StateMachine} import io.circe.Json @@ -130,40 +128,12 @@ trait Resolvers { /** * Lists all resolvers. * - * @param pagination - * the pagination settings - * @param params - * filter parameters for the listing - * @param ordering - * the response ordering - * @return - * a paginated results list - */ - def list( - pagination: FromPagination, - params: ResolverSearchParams, - ordering: Ordering[ResolverResource] - ): IO[UnscoredSearchResults[ResolverResource]] - - /** - * List resolvers within a project - * - * @param projectRef + * @param project * the project the resolvers belong to - * @param pagination - * the pagination settings - * @param params - * filter parameters - * @param ordering - * the response ordering + * @return + * the list of resolvers in that project */ - def list( - projectRef: ProjectRef, - pagination: FromPagination, - params: ResolverSearchParams, - ordering: Ordering[ResolverResource] - ): IO[UnscoredSearchResults[ResolverResource]] = - list(pagination, params.copy(project = Some(projectRef)), ordering) + def list(project: ProjectRef): IO[UnscoredSearchResults[ResolverResource]] } object Resolvers { @@ -182,13 +152,6 @@ object Resolvers { */ val mappings: ApiMappings = ApiMappings("resolver" -> schemas.resolvers, "defaultResolver" -> nxv.defaultResolver) - /** - * The resolver resource to schema mapping - */ - val resourcesToSchemas: ResourceToSchemaMappings = ResourceToSchemaMappings( - Label.unsafe("resolvers") -> schemas.resolvers - ) - private[delta] def next(state: Option[ResolverState], event: ResolverEvent): Option[ResolverState] = { def created(e: ResolverCreated): Option[ResolverState] = diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImpl.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImpl.scala index 61bd0e64ca..2c2f041418 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImpl.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImpl.scala @@ -2,7 +2,6 @@ package ch.epfl.bluebrain.nexus.delta.sdk.resolvers import cats.effect.{Clock, IO} import ch.epfl.bluebrain.nexus.delta.kernel.kamon.KamonMetricComponent -import ch.epfl.bluebrain.nexus.delta.kernel.search.Pagination.FromPagination import ch.epfl.bluebrain.nexus.delta.kernel.utils.UUIDF import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.Iri import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.contexts @@ -11,7 +10,6 @@ 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.jsonld.JsonLdSourceProcessor.JsonLdSourceResolvingDecoder import ch.epfl.bluebrain.nexus.delta.sdk.model.IdSegmentRef.{Latest, Revision, Tag} -import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchParams.ResolverSearchParams import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchResults import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchResults.UnscoredSearchResults import ch.epfl.bluebrain.nexus.delta.sdk.model.{IdSegment, IdSegmentRef} @@ -128,18 +126,15 @@ final class ResolversImpl private ( } yield state.toResource }.span("fetchResolver") - def list( - pagination: FromPagination, - params: ResolverSearchParams, - ordering: Ordering[ResolverResource] - ): IO[UnscoredSearchResults[ResolverResource]] = { - val scope = params.project.fold[Scope](Scope.Root)(ref => Scope.Project(ref)) - SearchResults( - log.currentStates(scope, _.toResource).evalFilter(params.matches), - pagination, - ordering - ).span("listResolvers") - } + def list(project: ProjectRef): IO[UnscoredSearchResults[ResolverResource]] = + log + .currentStates(Scope.Project(project), _.toResource) + .compile + .toList + .map { results => + SearchResults(results.size.toLong, results) + } + .span("listResolvers") private def eval(cmd: ResolverCommand): IO[ResolverResource] = log.evaluate(cmd.project, cmd.id, cmd).map(_._2.toResource) diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/Resolver.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/Resolver.scala index 4b6eab10c0..62c700c4df 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/Resolver.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/Resolver.scala @@ -4,13 +4,11 @@ import ch.epfl.bluebrain.nexus.delta.rdf.IriOrBNode.Iri import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.contexts import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.ContextValue import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.encoder.JsonLdEncoder +import ch.epfl.bluebrain.nexus.delta.sdk.OrderingFields import ch.epfl.bluebrain.nexus.delta.sdk.instances.IdentityInstances -import ch.epfl.bluebrain.nexus.delta.sdk.jsonld.JsonLdContent -import ch.epfl.bluebrain.nexus.delta.sdk.model.{BaseUri, IdSegmentRef} -import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.Resolvers +import ch.epfl.bluebrain.nexus.delta.sdk.model.BaseUri import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResolverValue.{CrossProjectValue, InProjectValue} import ch.epfl.bluebrain.nexus.delta.sdk.syntax._ -import ch.epfl.bluebrain.nexus.delta.sdk.{OrderingFields, ResourceShift} import ch.epfl.bluebrain.nexus.delta.sourcing.model.{Identity, ProjectRef} import io.circe.syntax._ import io.circe.{Encoder, Json} @@ -91,14 +89,4 @@ object Resolver { implicit val resolverOrderingFields: OrderingFields[Resolver] = OrderingFields.empty - type Shift = ResourceShift[ResolverState, Resolver, Nothing] - - def shift(resolvers: Resolvers)(implicit baseUri: BaseUri): Shift = - ResourceShift.apply[ResolverState, Resolver]( - Resolvers.entityType, - (ref, project) => resolvers.fetch(IdSegmentRef(ref), project), - state => state.toResource, - value => JsonLdContent(value, value.value.source, None) - ) - } diff --git a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverEvent.scala b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverEvent.scala index e6fba92600..178ff8cb02 100644 --- a/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverEvent.scala +++ b/delta/sdk/src/main/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverEvent.scala @@ -7,10 +7,8 @@ import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.JsonLdContext.keywords import ch.epfl.bluebrain.nexus.delta.sdk.instances._ import ch.epfl.bluebrain.nexus.delta.sdk.jsonld.IriEncoder import ch.epfl.bluebrain.nexus.delta.sdk.model.BaseUri -import ch.epfl.bluebrain.nexus.delta.sdk.model.metrics.EventMetric._ -import ch.epfl.bluebrain.nexus.delta.sdk.model.metrics.ScopedEventMetricEncoder import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.Resolvers -import ch.epfl.bluebrain.nexus.delta.sdk.sse.{resourcesSelector, SseEncoder} +import ch.epfl.bluebrain.nexus.delta.sdk.sse.SseEncoder import ch.epfl.bluebrain.nexus.delta.sourcing.Serializer import ch.epfl.bluebrain.nexus.delta.sourcing.event.Event.ScopedEvent import ch.epfl.bluebrain.nexus.delta.sourcing.model.Identity.Subject @@ -19,7 +17,7 @@ import ch.epfl.bluebrain.nexus.delta.sourcing.model.{EntityType, Label, ProjectR import io.circe.generic.extras.Configuration import io.circe.generic.extras.semiauto.{deriveConfiguredCodec, deriveConfiguredEncoder} import io.circe.syntax._ -import io.circe.{Codec, Decoder, Encoder, Json, JsonObject} +import io.circe.{Codec, Decoder, Encoder, Json} import java.time.Instant @@ -169,34 +167,13 @@ object ResolverEvent { Serializer.dropNulls() } - val resolverEventMetricEncoder: ScopedEventMetricEncoder[ResolverEvent] = - new ScopedEventMetricEncoder[ResolverEvent] { - override def databaseDecoder: Decoder[ResolverEvent] = serializer.codec - - override def entityType: EntityType = Resolvers.entityType - - override def eventToMetric: ResolverEvent => ProjectScopedMetric = event => - ProjectScopedMetric.from( - event, - event match { - case _: ResolverCreated => Created - case _: ResolverUpdated => Updated - case _: ResolverTagAdded => Tagged - case _: ResolverDeprecated => Deprecated - }, - event.id, - event.tpe.types, - JsonObject.empty - ) - } - def sseEncoder(implicit base: BaseUri): SseEncoder[ResolverEvent] = new SseEncoder[ResolverEvent] { override val databaseDecoder: Decoder[ResolverEvent] = serializer.codec override def entityType: EntityType = Resolvers.entityType - override val selectors: Set[Label] = Set(Label.unsafe("resolvers"), resourcesSelector) + override val selectors: Set[Label] = Set(Label.unsafe("resolvers")) override val sseEncoder: Encoder.AsObject[ResolverEvent] = { val context = ContextValue(contexts.metadata, contexts.resolvers) diff --git a/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImplSpec.scala b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImplSpec.scala index ca7b035fa4..0a1aa95c04 100644 --- a/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImplSpec.scala +++ b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/ResolversImplSpec.scala @@ -3,7 +3,6 @@ package ch.epfl.bluebrain.nexus.delta.sdk.resolvers import cats.data.NonEmptyList import cats.effect.IO import cats.syntax.all._ -import ch.epfl.bluebrain.nexus.delta.kernel.search.Pagination.FromPagination import ch.epfl.bluebrain.nexus.delta.kernel.utils.UUIDF import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.{contexts, nxv, schema} import ch.epfl.bluebrain.nexus.delta.rdf.jsonld.context.RemoteContextResolution @@ -13,7 +12,6 @@ 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.jsonld.JsonLdRejection.{DecodingFailed, UnexpectedId} import ch.epfl.bluebrain.nexus.delta.sdk.model._ -import ch.epfl.bluebrain.nexus.delta.sdk.model.search.SearchParams.ResolverSearchParams import ch.epfl.bluebrain.nexus.delta.sdk.projects.model.ApiMappings import ch.epfl.bluebrain.nexus.delta.sdk.projects.model.ProjectRejection.{ProjectIsDeprecated, ProjectNotFound} import ch.epfl.bluebrain.nexus.delta.sdk.projects.{FetchContextDummy, Projects} @@ -573,52 +571,9 @@ class ResolversImplSpec extends CatsEffectSpec with DoobieScalaTestFixture with } } - "list resolvers" should { - val order = ResourceF.defaultSort[Resolver] - - "return deprecated resolvers" in { - val results = resolvers - .list( - FromPagination(0, 10), - ResolverSearchParams(deprecated = Some(true), filter = _ => IO.pure(true)), - order - ) - .accepted - - results.total shouldEqual 2 - results.results.map(_.source) should contain theSameElementsAs Vector(inProjectExpected, crossProjectExpected) - } - - "return resolvers created by alice" in { - val results = resolvers - .list( - FromPagination(0, 10), - ResolverSearchParams(createdBy = Some(alice.subject), filter = _ => IO.pure(true)), - order - ) - .accepted - - results.total shouldEqual 2 - val inProj = inProjectValue.copy(priority = Priority.unsafe(46)) - val crossProj = crossProjectValue.copy(identityResolution = UseCurrentCaller, priority = Priority.unsafe(47)) - results.results.map(_.source) should contain theSameElementsAs Vector( - resolverResourceFor( - nxv + "in-project-both", - projectRef, - inProj, - sourceFrom(nxv + "in-project-both", inProj), - subject = alice.subject - ), - resolverResourceFor( - nxv + "cross-project-both", - projectRef, - crossProj, - sourceFrom(nxv + "cross-project-both", crossProj), - subject = alice.subject - ) - ) - } - + "list resolvers" in { + val result = resolvers.list(projectRef).accepted + result.total shouldEqual 9L } "validating priority" should { diff --git a/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverSerializationSuite.scala b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverSerializationSuite.scala index 248b7ee346..9ba345864a 100644 --- a/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverSerializationSuite.scala +++ b/delta/sdk/src/test/scala/ch/epfl/bluebrain/nexus/delta/sdk/resolvers/model/ResolverSerializationSuite.scala @@ -4,7 +4,6 @@ import cats.data.NonEmptyList import ch.epfl.bluebrain.nexus.delta.kernel.utils.ClassUtils import ch.epfl.bluebrain.nexus.delta.rdf.Vocabulary.{nxv, schemas} import ch.epfl.bluebrain.nexus.delta.sdk.SerializationSuite -import ch.epfl.bluebrain.nexus.delta.sdk.model.metrics.EventMetric._ import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.IdentityResolution.{ProvidedIdentities, UseCurrentCaller} import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResolverEvent.{ResolverCreated, ResolverDeprecated, ResolverTagAdded, ResolverUpdated} import ch.epfl.bluebrain.nexus.delta.sdk.resolvers.model.ResolverValue.{CrossProjectValue, InProjectValue} @@ -12,7 +11,7 @@ import ch.epfl.bluebrain.nexus.delta.sdk.sse.SseEncoder.SseData import ch.epfl.bluebrain.nexus.delta.sourcing.model.Identity.{Anonymous, Authenticated, Group, Subject, User} import ch.epfl.bluebrain.nexus.delta.sourcing.model.Tag.UserTag import ch.epfl.bluebrain.nexus.delta.sourcing.model.{Identity, Label, ProjectRef} -import io.circe.{Json, JsonObject} +import io.circe.Json import java.time.Instant @@ -163,19 +162,19 @@ class ResolverSerializationSuite extends SerializationSuite { ) private val resolversMapping = List( - (created, loadEvents("resolvers", "resolver-in-project-created.json"), Created), - (created1, loadEvents("resolvers", "resolver-cross-project-created-1.json"), Created), - (created2, loadEvents("resolvers", "resolver-cross-project-created-2.json"), Created), - (updated, loadEvents("resolvers", "resolver-in-project-updated.json"), Updated), - (updated1, loadEvents("resolvers", "resolver-cross-project-updated-1.json"), Updated), - (updated2, loadEvents("resolvers", "resolver-cross-project-updated-2.json"), Updated), - (tagged, loadEvents("resolvers", "resolver-tagged.json"), Tagged), - (deprecated, loadEvents("resolvers", "resolver-deprecated.json"), Deprecated), - (createdNamedInProject, loadEvents("resolvers", "resolver-in-project-created-named.json"), Created), - (createdNamedCrossProject, loadEvents("resolvers", "resolver-cross-project-created-named.json"), Created) + (created, loadEvents("resolvers", "resolver-in-project-created.json")), + (created1, loadEvents("resolvers", "resolver-cross-project-created-1.json")), + (created2, loadEvents("resolvers", "resolver-cross-project-created-2.json")), + (updated, loadEvents("resolvers", "resolver-in-project-updated.json")), + (updated1, loadEvents("resolvers", "resolver-cross-project-updated-1.json")), + (updated2, loadEvents("resolvers", "resolver-cross-project-updated-2.json")), + (tagged, loadEvents("resolvers", "resolver-tagged.json")), + (deprecated, loadEvents("resolvers", "resolver-deprecated.json")), + (createdNamedInProject, loadEvents("resolvers", "resolver-in-project-created-named.json")), + (createdNamedCrossProject, loadEvents("resolvers", "resolver-cross-project-created-named.json")) ) - resolversMapping.foreach { case (event, (database, sse), action) => + resolversMapping.foreach { case (event, (database, sse)) => test(s"Correctly serialize ${event.getClass.getName}") { assertOutputIgnoreOrder(ResolverEvent.serializer, event, database) } @@ -189,22 +188,6 @@ class ResolverSerializationSuite extends SerializationSuite { .decodeJson(database) .assertRight(SseData(ClassUtils.simpleName(event), Some(ProjectRef(org, proj)), sse)) } - - test(s"Correctly encode ${event.getClass.getName} to metric") { - ResolverEvent.resolverEventMetricEncoder.toMetric.decodeJson(database).assertRight { - ProjectScopedMetric( - instant, - subject, - event.rev, - Set(action), - ProjectRef(org, proj), - org, - event.id, - event.tpe.types, - JsonObject.empty - ) - } - } } private val statesMapping = Map( diff --git a/docs/src/main/paradox/docs/delta/api/resolvers-api.md b/docs/src/main/paradox/docs/delta/api/resolvers-api.md index 8cb8204032..67fc0f5592 100644 --- a/docs/src/main/paradox/docs/delta/api/resolvers-api.md +++ b/docs/src/main/paradox/docs/delta/api/resolvers-api.md @@ -89,15 +89,6 @@ where... - `{identity}`: Json object - the identity against which to enforce ACLs during resolution process. Can't be defined if `useCurrentCaller` is set to `true` - `{useCurrentCaller}`: Boolean - the resolution process will use the caller and its identitites to enforce acls. Can't be `true` when `_identity_` is defined. -## Indexing - -All the API calls modifying a resolver (creation, update, deprecation) can specify whether the resolver should be indexed -synchronously or in the background. This behaviour is controlled using `indexing` query param, which can be one of two values: - -- `async` - (default value) the resolver will be indexed asynchronously -- `sync` - the resolver will be indexed synchronously and the API call won't return until the indexing is finished - - ## Create using POST ``` @@ -232,72 +223,12 @@ Response ## List -There are three available endpoints to list resolvers in different scopes. - -### Within a project -``` -GET /v1/resolvers/{org_label}/{project_label}?from={from} - &size={size} - &deprecated={deprecated} - &rev={rev} - &type={type} - &createdBy={createdBy} - &updatedBy={updatedBy} - &q={search} - &sort={sort} - &aggregations={aggregations} -``` - -### Within an organization - This operation returns only resolvers from projects defined in the organisation `{org_label}` and where the caller has the `resources/read` permission. ``` -GET /v1/resolvers/{org_label}?from={from} - &size={size} - &deprecated={deprecated} - &rev={rev} - &type={type} - &createdBy={createdBy} - &updatedBy={updatedBy} - &q={search} - &sort={sort} - &aggregations={aggregations} +GET /v1/resolvers/{org_label}/{project_label} ``` -### Within all projects - -This operation returns only resolvers from projects where the caller has the `resources/read` permission. - -``` -GET /v1/resolvers?from={from} - &size={size} - &deprecated={deprecated} - &rev={rev} - &type={type} - &createdBy={createdBy} - &updatedBy={updatedBy} - &q={search} - &sort={sort} - &aggregations={aggregations} -``` - -### Parameter description - -- `{from}`: Number - is the parameter that describes the offset for the current query; defaults to `0` -- `{size}`: Number - is the parameter that limits the number of results; defaults to `20` -- `{deprecated}`: Boolean - can be used to filter the resulting resolvers based on their deprecation status -- `{rev}`: Number - can be used to filter the resulting resolvers based on their revision value -- `{type}`: Iri - can be used to filter the resulting resolvers based on their `@type` value. This parameter can appear - multiple times, filtering further the `@type` value. -- `{createdBy}`: Iri - can be used to filter the resulting resolvers based on their creator -- `{updatedBy}`: Iri - can be used to filter the resulting resolvers based on the person which performed the last update -- `{search}`: String - can be provided to select only the resolvers in the collection that have attribute values - matching (containing) the provided string -- `{sort}`: String - can be used to sort resolvers based on a payloads' field. This parameter can appear multiple times - to enable sorting by multiple fields. The default is done by `_createdBy` and `@id`. -- `{aggregations}`: Boolean - if `true` then the response will only contain aggregations of the `@type` and `_project` fields; defaults to `false`. See @ref:[Aggregations](resources-api.md#aggregations). - **Example** Request diff --git a/tests/src/test/resources/kg/aggregations/org-aggregation.json b/tests/src/test/resources/kg/aggregations/org-aggregation.json index 0ec33562a1..f3b6484556 100644 --- a/tests/src/test/resources/kg/aggregations/org-aggregation.json +++ b/tests/src/test/resources/kg/aggregations/org-aggregation.json @@ -4,11 +4,11 @@ "projects" : { "buckets" : [ { - "doc_count" : 7, + "doc_count" : 6, "key" : "{{org1}}/{{proj11}}" }, { - "doc_count" : 5, + "doc_count" : 4, "key" : "{{org1}}/{{proj12}}" } ], @@ -33,14 +33,6 @@ "doc_count" : 2, "key" : "https://bluebrain.github.io/nexus/vocabulary/DiskStorage" }, - { - "doc_count" : 2, - "key" : "https://bluebrain.github.io/nexus/vocabulary/InProject" - }, - { - "doc_count" : 2, - "key" : "https://bluebrain.github.io/nexus/vocabulary/Resolver" - }, { "doc_count" : 2, "key" : "https://bluebrain.github.io/nexus/vocabulary/SparqlView" @@ -58,5 +50,5 @@ "sum_other_doc_count" : 0 } }, - "total" : 12 + "total" : 10 } \ No newline at end of file diff --git a/tests/src/test/resources/kg/aggregations/project-aggregation.json b/tests/src/test/resources/kg/aggregations/project-aggregation.json index b5be3a40a4..0c829118af 100644 --- a/tests/src/test/resources/kg/aggregations/project-aggregation.json +++ b/tests/src/test/resources/kg/aggregations/project-aggregation.json @@ -3,7 +3,7 @@ "aggregations" : { "projects" : { "buckets" : { - "doc_count" : 7, + "doc_count" : 6, "key" : "{{org}}/{{project}}" }, "doc_count_error_upper_bound" : 0, @@ -27,14 +27,6 @@ "doc_count" : 1, "key" : "https://bluebrain.github.io/nexus/vocabulary/DiskStorage" }, - { - "doc_count" : 1, - "key" : "https://bluebrain.github.io/nexus/vocabulary/InProject" - }, - { - "doc_count" : 1, - "key" : "https://bluebrain.github.io/nexus/vocabulary/Resolver" - }, { "doc_count" : 1, "key" : "https://bluebrain.github.io/nexus/vocabulary/Schema" @@ -52,5 +44,5 @@ "sum_other_doc_count" : 0 } }, - "total" : 7 + "total" : 6 } \ No newline at end of file diff --git a/tests/src/test/resources/kg/aggregations/resolvers-aggregation.json b/tests/src/test/resources/kg/aggregations/resolvers-aggregation.json deleted file mode 100644 index b189c7fd29..0000000000 --- a/tests/src/test/resources/kg/aggregations/resolvers-aggregation.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "@context": "https://bluebrain.github.io/nexus/contexts/aggregations.json", - "aggregations": { - "projects": { - "buckets": { - "doc_count": 1, - "key": "{{org}}/{{project}}" - }, - "doc_count_error_upper_bound": 0, - "sum_other_doc_count": 0 - }, - "types": { - "buckets": [ - { - "doc_count": 1, - "key": "https://bluebrain.github.io/nexus/vocabulary/Resolver" - }, - { - "doc_count": 1, - "key": "https://bluebrain.github.io/nexus/vocabulary/InProject" - } - ], - "doc_count_error_upper_bound": 0, - "sum_other_doc_count": 0 - } - }, - "total": 1 -} \ No newline at end of file diff --git a/tests/src/test/resources/kg/aggregations/root-aggregation.json b/tests/src/test/resources/kg/aggregations/root-aggregation.json index b5a91819b0..8d735fae72 100644 --- a/tests/src/test/resources/kg/aggregations/root-aggregation.json +++ b/tests/src/test/resources/kg/aggregations/root-aggregation.json @@ -4,15 +4,15 @@ "projects" : { "buckets" : [ { - "doc_count" : 7, + "doc_count" : 6, "key" : "{{org1}}/{{proj11}}" }, { - "doc_count" : 5, + "doc_count" : 4, "key" : "{{org1}}/{{proj12}}" }, { - "doc_count" : 5, + "doc_count" : 4, "key" : "{{org2}}/{{proj21}}" } ], @@ -37,14 +37,6 @@ "doc_count" : 3, "key" : "https://bluebrain.github.io/nexus/vocabulary/DiskStorage" }, - { - "doc_count" : 3, - "key" : "https://bluebrain.github.io/nexus/vocabulary/InProject" - }, - { - "doc_count" : 3, - "key" : "https://bluebrain.github.io/nexus/vocabulary/Resolver" - }, { "doc_count" : 3, "key" : "https://bluebrain.github.io/nexus/vocabulary/SparqlView" @@ -62,5 +54,5 @@ "sum_other_doc_count" : 0 } }, - "total" : 17 + "total" : 14 } \ No newline at end of file diff --git a/tests/src/test/resources/kg/listings/default-resolver.json b/tests/src/test/resources/kg/listings/default-resolver.json index f4a14e7d0d..63ed935364 100644 --- a/tests/src/test/resources/kg/listings/default-resolver.json +++ b/tests/src/test/resources/kg/listings/default-resolver.json @@ -2,7 +2,7 @@ "@context": [ "https://bluebrain.github.io/nexus/contexts/metadata.json", "https://bluebrain.github.io/nexus/contexts/search.json", - "https://bluebrain.github.io/nexus/contexts/search-metadata.json" + "https://bluebrain.github.io/nexus/contexts/resolvers.json" ], "_total": 1, "_results": [ @@ -19,6 +19,7 @@ "_project": "{{project}}", "name": "Default resolver", "description": "Resolver created with the project", + "priority" : 1, "_rev": 1, "_deprecated": false, "_createdBy": "{{deltaUri}}/realms/internal/users/service-account-delta", diff --git a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/AggregationsSpec.scala b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/AggregationsSpec.scala index 83b38fe201..0ecd341203 100644 --- a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/AggregationsSpec.scala +++ b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/AggregationsSpec.scala @@ -74,18 +74,6 @@ final class AggregationsSpec extends BaseIntegrationSpec { } } - "aggregate resolvers" in { - val expected = jsonContentOf( - "kg/aggregations/resolvers-aggregation.json", - "org" -> org1, - "project" -> proj11 - ) - deltaClient.get[Json](s"/resolvers/$ref11?aggregations=true", Charlie) { (json, response) => - response.status shouldEqual StatusCodes.OK - json should equalIgnoreArrayOrder(expected) - } - } - "aggregate views" in { val expected = jsonContentOf( "kg/aggregations/views-aggregation.json", diff --git a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/DefaultIndexSpec.scala b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/DefaultIndexSpec.scala index 2b2b315655..177750f73d 100644 --- a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/DefaultIndexSpec.scala +++ b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/DefaultIndexSpec.scala @@ -44,9 +44,9 @@ class DefaultIndexSpec extends BaseIntegrationSpec { response.status shouldEqual StatusCodes.OK val expected = jsonContentOf( "kg/views/statistics.json", - "total" -> "4", - "processed" -> "4", - "evaluated" -> "4", + "total" -> "3", + "processed" -> "3", + "evaluated" -> "3", "discarded" -> "0", "remaining" -> "0" ) diff --git a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/EventsSpec.scala b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/EventsSpec.scala index b924085bb4..2fae14c985 100644 --- a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/EventsSpec.scala +++ b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/EventsSpec.scala @@ -70,7 +70,7 @@ class EventsSpec extends BaseIntegrationSpec { "fetch resource events filtered by project" in eventually { deltaClient.sseEvents(s"/resources/$id/events", BugsBunny, initialEventId, take = 12L) { seq => - val projectEvents = seq.drop(4) + val projectEvents = seq.drop(3) projectEvents.size shouldEqual 6 projectEvents.flatMap(_._1) should contain theSameElementsInOrderAs List( "ResourceCreated", @@ -87,7 +87,7 @@ class EventsSpec extends BaseIntegrationSpec { "fetch resource events filtered by organization 1" in { deltaClient.sseEvents(s"/resources/$orgId/events", BugsBunny, initialEventId, take = 12L) { seq => - val projectEvents = seq.drop(4) + val projectEvents = seq.drop(3) projectEvents.size shouldEqual 6 projectEvents.flatMap(_._1) should contain theSameElementsInOrderAs List( "ResourceCreated", @@ -104,7 +104,7 @@ class EventsSpec extends BaseIntegrationSpec { "fetch resource events filtered by organization 2" in { deltaClient.sseEvents(s"/resources/$orgId2/events", BugsBunny, initialEventId, take = 7L) { seq => - val projectEvents = seq.drop(4) + val projectEvents = seq.drop(3) projectEvents.size shouldEqual 1 projectEvents.flatMap(_._1) should contain theSameElementsInOrderAs List("ResourceCreated") val json = Json.arr(projectEvents.flatMap(_._2.map(events.filterFields)): _*) diff --git a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/SparqlViewsSpec.scala b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/SparqlViewsSpec.scala index bd00120411..c1de220904 100644 --- a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/SparqlViewsSpec.scala +++ b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/kg/SparqlViewsSpec.scala @@ -213,9 +213,9 @@ class SparqlViewsSpec extends BaseIntegrationSpec { response.status shouldEqual StatusCodes.OK val expected = jsonContentOf( "kg/views/statistics.json", - "total" -> "11", - "processed" -> "11", - "evaluated" -> "11", + "total" -> "10", + "processed" -> "10", + "evaluated" -> "10", "discarded" -> "0", "remaining" -> "0" ) diff --git a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/plugins/blazegraph/IncomingOutgoingBlazegraphSpec.scala b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/plugins/blazegraph/IncomingOutgoingBlazegraphSpec.scala index eb2e73817b..0593b9bf87 100644 --- a/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/plugins/blazegraph/IncomingOutgoingBlazegraphSpec.scala +++ b/tests/src/test/scala/ch/epfl/bluebrain/nexus/tests/plugins/blazegraph/IncomingOutgoingBlazegraphSpec.scala @@ -81,7 +81,7 @@ class IncomingOutgoingBlazegraphSpec extends BaseIntegrationSpec { eventually { deltaClient.get[Json](s"/views/$orgLabel/$projLabel/graph/statistics", Radar) { (json, response) => response.status shouldEqual StatusCodes.OK - root.processedEvents.long.getOption(json).value shouldEqual 6L + root.processedEvents.long.getOption(json).value shouldEqual 5L } } }