catalog-backend: rename paginatedEntities to queryEntities
Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
This commit is contained in:
@@ -179,9 +179,7 @@ export interface EntitiesCatalog {
|
||||
*
|
||||
* @param request
|
||||
*/
|
||||
paginatedEntities(
|
||||
request?: PaginatedEntitiesRequest,
|
||||
): Promise<PaginatedEntitiesResponse>;
|
||||
queryEntities(request?: QueryEntitiesRequest): Promise<QueryEntitiesResponse>;
|
||||
|
||||
/**
|
||||
* Removes a single entity.
|
||||
@@ -213,18 +211,18 @@ export interface EntitiesCatalog {
|
||||
}
|
||||
|
||||
/**
|
||||
* The request shape for {@link EntitiesCatalog.paginatedEntities}.
|
||||
* The request shape for {@link EntitiesCatalog.queryEntities}.
|
||||
*/
|
||||
export type PaginatedEntitiesRequest =
|
||||
| PaginatedEntitiesInitialRequest
|
||||
| PaginatedEntitiesCursorRequest;
|
||||
export type QueryEntitiesRequest =
|
||||
| QueryEntitiesInitialRequest
|
||||
| QueryEntitiesCursorRequest;
|
||||
|
||||
/**
|
||||
* The initial request for {@link EntitiesCatalog.paginatedEntities}.
|
||||
* The initial request for {@link EntitiesCatalog.queryEntities}.
|
||||
* The request take immutable properties that are going to be bound
|
||||
* for the current and the next pagination requests.
|
||||
*/
|
||||
export interface PaginatedEntitiesInitialRequest {
|
||||
export interface QueryEntitiesInitialRequest {
|
||||
authorizationToken?: string;
|
||||
fields?: (entity: Entity) => Entity;
|
||||
limit?: number;
|
||||
@@ -234,10 +232,10 @@ export interface PaginatedEntitiesInitialRequest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Request for {@link EntitiesCatalog.paginatedEntities} used to
|
||||
* Request for {@link EntitiesCatalog.queryEntities} used to
|
||||
* move forward or backward on the data.
|
||||
*/
|
||||
export interface PaginatedEntitiesCursorRequest {
|
||||
export interface QueryEntitiesCursorRequest {
|
||||
authorizationToken?: string;
|
||||
fields?: (entity: Entity) => Entity;
|
||||
limit?: number;
|
||||
@@ -245,9 +243,9 @@ export interface PaginatedEntitiesCursorRequest {
|
||||
}
|
||||
|
||||
/**
|
||||
* The response shape for {@link EntitiesCatalog.paginatedEntities}.
|
||||
* The response shape for {@link EntitiesCatalog.queryEntities}.
|
||||
*/
|
||||
export interface PaginatedEntitiesResponse {
|
||||
export interface QueryEntitiesResponse {
|
||||
/**
|
||||
* The entities for the current pagination request
|
||||
*/
|
||||
|
||||
@@ -30,7 +30,7 @@ describe('AuthorizedEntitiesCatalog', () => {
|
||||
facets: jest.fn(),
|
||||
refresh: jest.fn(),
|
||||
listAncestors: jest.fn(),
|
||||
paginatedEntities: jest.fn(),
|
||||
queryEntities: jest.fn(),
|
||||
};
|
||||
const fakePermissionApi = {
|
||||
authorize: jest.fn(),
|
||||
|
||||
@@ -35,11 +35,11 @@ import {
|
||||
EntityFacetsRequest,
|
||||
EntityFacetsResponse,
|
||||
EntityFilter,
|
||||
PaginatedEntitiesRequest,
|
||||
PaginatedEntitiesResponse,
|
||||
QueryEntitiesRequest,
|
||||
QueryEntitiesResponse,
|
||||
} from '../catalog/types';
|
||||
import { basicEntityFilter } from './request/basicEntityFilter';
|
||||
import { isPaginatedEntitiesInitialRequest } from './util';
|
||||
import { isQueryEntitiesInitialRequest } from './util';
|
||||
|
||||
export class AuthorizedEntitiesCatalog implements EntitiesCatalog {
|
||||
constructor(
|
||||
@@ -109,9 +109,9 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog {
|
||||
return this.entitiesCatalog.entitiesBatch(request);
|
||||
}
|
||||
|
||||
async paginatedEntities(
|
||||
request?: PaginatedEntitiesRequest,
|
||||
): Promise<PaginatedEntitiesResponse> {
|
||||
async queryEntities(
|
||||
request?: QueryEntitiesRequest,
|
||||
): Promise<QueryEntitiesResponse> {
|
||||
const authorizeDecision = (
|
||||
await this.permissionApi.authorizeConditional(
|
||||
[{ permission: catalogEntityReadPermission }],
|
||||
@@ -131,9 +131,9 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog {
|
||||
authorizeDecision.conditions,
|
||||
);
|
||||
|
||||
return this.entitiesCatalog.paginatedEntities({
|
||||
return this.entitiesCatalog.queryEntities({
|
||||
...request,
|
||||
...(isPaginatedEntitiesInitialRequest(request) && {
|
||||
...(isQueryEntitiesInitialRequest(request) && {
|
||||
filter: request?.filter
|
||||
? { allOf: [permissionFilter, request.filter] }
|
||||
: permissionFilter,
|
||||
@@ -141,7 +141,7 @@ export class AuthorizedEntitiesCatalog implements EntitiesCatalog {
|
||||
});
|
||||
}
|
||||
|
||||
return this.entitiesCatalog.paginatedEntities(request);
|
||||
return this.entitiesCatalog.queryEntities(request);
|
||||
}
|
||||
|
||||
async removeEntityByUid(
|
||||
|
||||
@@ -20,8 +20,8 @@ import { Entity, stringifyEntityRef } from '@backstage/catalog-model';
|
||||
import { Knex } from 'knex';
|
||||
import { v4 as uuid, v4 } from 'uuid';
|
||||
import {
|
||||
PaginatedEntitiesCursorRequest,
|
||||
PaginatedEntitiesInitialRequest,
|
||||
QueryEntitiesCursorRequest,
|
||||
QueryEntitiesInitialRequest,
|
||||
} from '../catalog/types';
|
||||
import { applyDatabaseMigrations } from '../database/migrations';
|
||||
import {
|
||||
@@ -723,7 +723,7 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
);
|
||||
});
|
||||
|
||||
describe('paginatedEntities', () => {
|
||||
describe('queryEntities', () => {
|
||||
it.each(databases.eachSupportedId())(
|
||||
'should return paginated entities and scroll the items accordingly, %p',
|
||||
async databaseId => {
|
||||
@@ -764,89 +764,89 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
const limit = 2;
|
||||
|
||||
// initial request
|
||||
const request1: PaginatedEntitiesInitialRequest = {
|
||||
const request1: QueryEntitiesInitialRequest = {
|
||||
filter,
|
||||
limit,
|
||||
sortFields: [{ field: 'metadata.name', order: 'asc' }],
|
||||
};
|
||||
const response1 = await catalog.paginatedEntities(request1);
|
||||
const response1 = await catalog.queryEntities(request1);
|
||||
expect(response1.entities).toEqual([entityFrom('A'), entityFrom('B')]);
|
||||
expect(response1.nextCursor).toBeDefined();
|
||||
expect(response1.prevCursor).toBeUndefined();
|
||||
expect(response1.totalItems).toBe(names.length);
|
||||
|
||||
// second request (forward)
|
||||
const request2: PaginatedEntitiesCursorRequest = {
|
||||
const request2: QueryEntitiesCursorRequest = {
|
||||
cursor: response1.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response2 = await catalog.paginatedEntities(request2);
|
||||
const response2 = await catalog.queryEntities(request2);
|
||||
expect(response2.entities).toEqual([entityFrom('C'), entityFrom('D')]);
|
||||
expect(response2.nextCursor).toBeDefined();
|
||||
expect(response2.prevCursor).toBeDefined();
|
||||
expect(response2.totalItems).toBe(names.length);
|
||||
|
||||
// third request (forward)
|
||||
const request3: PaginatedEntitiesCursorRequest = {
|
||||
const request3: QueryEntitiesCursorRequest = {
|
||||
cursor: response2.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response3 = await catalog.paginatedEntities(request3);
|
||||
const response3 = await catalog.queryEntities(request3);
|
||||
expect(response3.entities).toEqual([entityFrom('E'), entityFrom('F')]);
|
||||
expect(response3.nextCursor).toBeDefined();
|
||||
expect(response3.prevCursor).toBeDefined();
|
||||
expect(response3.totalItems).toBe(names.length);
|
||||
|
||||
// fourth request (backwards)
|
||||
const request4: PaginatedEntitiesCursorRequest = {
|
||||
const request4: QueryEntitiesCursorRequest = {
|
||||
cursor: response3.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response4 = await catalog.paginatedEntities(request4);
|
||||
const response4 = await catalog.queryEntities(request4);
|
||||
expect(response4.entities).toEqual([entityFrom('C'), entityFrom('D')]);
|
||||
expect(response4.nextCursor).toBeDefined();
|
||||
expect(response4.prevCursor).toBeDefined();
|
||||
expect(response4.totalItems).toBe(names.length);
|
||||
|
||||
// fifth request (backwards)
|
||||
const request5: PaginatedEntitiesCursorRequest = {
|
||||
const request5: QueryEntitiesCursorRequest = {
|
||||
cursor: response4.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response5 = await catalog.paginatedEntities(request5);
|
||||
const response5 = await catalog.queryEntities(request5);
|
||||
expect(response5.entities).toEqual([entityFrom('A'), entityFrom('B')]);
|
||||
expect(response5.nextCursor).toBeDefined();
|
||||
expect(response5.prevCursor).toBeUndefined();
|
||||
expect(response5.totalItems).toBe(names.length);
|
||||
|
||||
// sixth request (forward)
|
||||
const request6: PaginatedEntitiesCursorRequest = {
|
||||
const request6: QueryEntitiesCursorRequest = {
|
||||
cursor: response5.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response6 = await catalog.paginatedEntities(request6);
|
||||
const response6 = await catalog.queryEntities(request6);
|
||||
expect(response6.entities).toEqual([entityFrom('C'), entityFrom('D')]);
|
||||
expect(response6.nextCursor).toBeDefined();
|
||||
expect(response6.prevCursor).toBeDefined();
|
||||
expect(response6.totalItems).toBe(names.length);
|
||||
|
||||
// seventh request (forward)
|
||||
const request7: PaginatedEntitiesCursorRequest = {
|
||||
const request7: QueryEntitiesCursorRequest = {
|
||||
cursor: response6.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response7 = await catalog.paginatedEntities(request7);
|
||||
const response7 = await catalog.queryEntities(request7);
|
||||
expect(response7.entities).toEqual([entityFrom('E'), entityFrom('F')]);
|
||||
expect(response7.nextCursor).toBeDefined();
|
||||
expect(response7.prevCursor).toBeDefined();
|
||||
expect(response7.totalItems).toBe(names.length);
|
||||
|
||||
// seventh.2 request (forward with a different limit)
|
||||
const request7bis: PaginatedEntitiesCursorRequest = {
|
||||
const request7bis: QueryEntitiesCursorRequest = {
|
||||
cursor: response6.nextCursor!,
|
||||
limit: limit + 1,
|
||||
};
|
||||
const response7bis = await catalog.paginatedEntities(request7bis);
|
||||
const response7bis = await catalog.queryEntities(request7bis);
|
||||
expect(response7bis.entities).toEqual([
|
||||
entityFrom('E'),
|
||||
entityFrom('F'),
|
||||
@@ -857,11 +857,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response7bis.totalItems).toBe(names.length);
|
||||
|
||||
// last request (forward)
|
||||
const request8: PaginatedEntitiesCursorRequest = {
|
||||
const request8: QueryEntitiesCursorRequest = {
|
||||
cursor: response7.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response8 = await catalog.paginatedEntities(request8);
|
||||
const response8 = await catalog.queryEntities(request8);
|
||||
expect(response8.entities).toEqual([entityFrom('G')]);
|
||||
expect(response8.nextCursor).toBeUndefined();
|
||||
expect(response8.prevCursor).toBeDefined();
|
||||
@@ -909,45 +909,45 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
const limit = 2;
|
||||
|
||||
// initial request
|
||||
const request1: PaginatedEntitiesInitialRequest = {
|
||||
const request1: QueryEntitiesInitialRequest = {
|
||||
filter,
|
||||
limit,
|
||||
sortFields: [{ field: 'metadata.name', order: 'desc' }],
|
||||
};
|
||||
const response1 = await catalog.paginatedEntities(request1);
|
||||
const response1 = await catalog.queryEntities(request1);
|
||||
expect(response1.entities).toEqual([entityFrom('G'), entityFrom('F')]);
|
||||
expect(response1.nextCursor).toBeDefined();
|
||||
expect(response1.prevCursor).toBeUndefined();
|
||||
expect(response1.totalItems).toBe(names.length);
|
||||
|
||||
// second request (forward)
|
||||
const request2: PaginatedEntitiesCursorRequest = {
|
||||
const request2: QueryEntitiesCursorRequest = {
|
||||
cursor: response1.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response2 = await catalog.paginatedEntities(request2);
|
||||
const response2 = await catalog.queryEntities(request2);
|
||||
expect(response2.entities).toEqual([entityFrom('E'), entityFrom('D')]);
|
||||
expect(response2.nextCursor).toBeDefined();
|
||||
expect(response2.prevCursor).toBeDefined();
|
||||
expect(response2.totalItems).toBe(names.length);
|
||||
|
||||
// third request (forward)
|
||||
const request3: PaginatedEntitiesCursorRequest = {
|
||||
const request3: QueryEntitiesCursorRequest = {
|
||||
cursor: response2.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response3 = await catalog.paginatedEntities(request3);
|
||||
const response3 = await catalog.queryEntities(request3);
|
||||
expect(response3.entities).toEqual([entityFrom('C'), entityFrom('B')]);
|
||||
expect(response3.nextCursor).toBeDefined();
|
||||
expect(response3.prevCursor).toBeDefined();
|
||||
expect(response3.totalItems).toBe(names.length);
|
||||
|
||||
// fourth request (backwards)
|
||||
const request4: PaginatedEntitiesCursorRequest = {
|
||||
const request4: QueryEntitiesCursorRequest = {
|
||||
cursor: response3.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response4 = await catalog.paginatedEntities(request4);
|
||||
const response4 = await catalog.queryEntities(request4);
|
||||
|
||||
expect(response4.entities).toEqual([entityFrom('E'), entityFrom('D')]);
|
||||
expect(response4.nextCursor).toBeDefined();
|
||||
@@ -955,44 +955,44 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response4.totalItems).toBe(names.length);
|
||||
|
||||
// fifth request (backwards)
|
||||
const request5: PaginatedEntitiesCursorRequest = {
|
||||
const request5: QueryEntitiesCursorRequest = {
|
||||
cursor: response4.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response5 = await catalog.paginatedEntities(request5);
|
||||
const response5 = await catalog.queryEntities(request5);
|
||||
expect(response5.entities).toEqual([entityFrom('G'), entityFrom('F')]);
|
||||
expect(response5.nextCursor).toBeDefined();
|
||||
expect(response5.prevCursor).toBeUndefined();
|
||||
expect(response5.totalItems).toBe(names.length);
|
||||
|
||||
// sixth request (forward)
|
||||
const request6: PaginatedEntitiesCursorRequest = {
|
||||
const request6: QueryEntitiesCursorRequest = {
|
||||
cursor: response5.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response6 = await catalog.paginatedEntities(request6);
|
||||
const response6 = await catalog.queryEntities(request6);
|
||||
expect(response6.entities).toEqual([entityFrom('E'), entityFrom('D')]);
|
||||
expect(response6.nextCursor).toBeDefined();
|
||||
expect(response6.prevCursor).toBeDefined();
|
||||
expect(response6.totalItems).toBe(names.length);
|
||||
|
||||
// seventh request (forward)
|
||||
const request7: PaginatedEntitiesCursorRequest = {
|
||||
const request7: QueryEntitiesCursorRequest = {
|
||||
cursor: response6.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response7 = await catalog.paginatedEntities(request7);
|
||||
const response7 = await catalog.queryEntities(request7);
|
||||
expect(response7.entities).toEqual([entityFrom('C'), entityFrom('B')]);
|
||||
expect(response7.nextCursor).toBeDefined();
|
||||
expect(response7.prevCursor).toBeDefined();
|
||||
expect(response7.totalItems).toBe(names.length);
|
||||
|
||||
// seventh.2 request (forward with a different limit)
|
||||
const request7bis: PaginatedEntitiesCursorRequest = {
|
||||
const request7bis: QueryEntitiesCursorRequest = {
|
||||
cursor: response6.nextCursor!,
|
||||
limit: limit + 1,
|
||||
};
|
||||
const response7bis = await catalog.paginatedEntities(request7bis);
|
||||
const response7bis = await catalog.queryEntities(request7bis);
|
||||
expect(response7bis.entities).toEqual([
|
||||
entityFrom('C'),
|
||||
entityFrom('B'),
|
||||
@@ -1003,11 +1003,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response7bis.totalItems).toBe(names.length);
|
||||
|
||||
// last request (forward)
|
||||
const request8: PaginatedEntitiesCursorRequest = {
|
||||
const request8: QueryEntitiesCursorRequest = {
|
||||
cursor: response7.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response8 = await catalog.paginatedEntities(request8);
|
||||
const response8 = await catalog.queryEntities(request8);
|
||||
expect(response8.entities).toEqual([entityFrom('A')]);
|
||||
expect(response8.nextCursor).toBeUndefined();
|
||||
expect(response8.prevCursor).toBeDefined();
|
||||
@@ -1052,14 +1052,14 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
key: 'spec.should_include_this',
|
||||
};
|
||||
|
||||
const request: PaginatedEntitiesInitialRequest = {
|
||||
const request: QueryEntitiesInitialRequest = {
|
||||
filter,
|
||||
limit: 100,
|
||||
|
||||
sortFields: [{ field: 'metadata.name', order: 'asc' }],
|
||||
query: 'cAt ',
|
||||
};
|
||||
const response = await catalog.paginatedEntities(request);
|
||||
const response = await catalog.queryEntities(request);
|
||||
expect(response.entities).toEqual([
|
||||
entityFrom('atcatss'),
|
||||
entityFrom('cat'),
|
||||
@@ -1094,10 +1094,10 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
stitcher,
|
||||
});
|
||||
|
||||
const request: PaginatedEntitiesInitialRequest = {
|
||||
const request: QueryEntitiesInitialRequest = {
|
||||
limit: 0,
|
||||
};
|
||||
const response = await catalog.paginatedEntities(request);
|
||||
const response = await catalog.queryEntities(request);
|
||||
expect(response).toEqual({ totalItems: 20, entities: [] });
|
||||
},
|
||||
);
|
||||
@@ -1125,11 +1125,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
const limit = 2;
|
||||
|
||||
// initial request
|
||||
const request1: PaginatedEntitiesInitialRequest = {
|
||||
const request1: QueryEntitiesInitialRequest = {
|
||||
limit,
|
||||
sortFields: [{ field: 'metadata.name', order: 'asc' }],
|
||||
};
|
||||
const response1 = await catalog.paginatedEntities(request1);
|
||||
const response1 = await catalog.queryEntities(request1);
|
||||
expect(response1.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('AA'),
|
||||
@@ -1139,11 +1139,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response1.totalItems).toBe(6);
|
||||
|
||||
// second request (forward)
|
||||
const request2: PaginatedEntitiesCursorRequest = {
|
||||
const request2: QueryEntitiesCursorRequest = {
|
||||
cursor: response1.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response2 = await catalog.paginatedEntities(request2);
|
||||
const response2 = await catalog.queryEntities(request2);
|
||||
expect(response2.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('AA'),
|
||||
@@ -1153,11 +1153,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response2.totalItems).toBe(6);
|
||||
|
||||
// third request (forward)
|
||||
const request3: PaginatedEntitiesCursorRequest = {
|
||||
const request3: QueryEntitiesCursorRequest = {
|
||||
cursor: response2.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response3 = await catalog.paginatedEntities(request3);
|
||||
const response3 = await catalog.queryEntities(request3);
|
||||
expect(response3.entities).toEqual([
|
||||
entityFrom('CC'),
|
||||
entityFrom('DD'),
|
||||
@@ -1167,11 +1167,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response3.totalItems).toBe(6);
|
||||
|
||||
// forth request (backward)
|
||||
const request4: PaginatedEntitiesCursorRequest = {
|
||||
const request4: QueryEntitiesCursorRequest = {
|
||||
cursor: response3.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response4 = await catalog.paginatedEntities(request4);
|
||||
const response4 = await catalog.queryEntities(request4);
|
||||
expect(response4.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('AA'),
|
||||
@@ -1181,11 +1181,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response4.totalItems).toBe(6);
|
||||
|
||||
// fifth request (backward)
|
||||
const request5: PaginatedEntitiesCursorRequest = {
|
||||
const request5: QueryEntitiesCursorRequest = {
|
||||
cursor: response4.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response5 = await catalog.paginatedEntities(request5);
|
||||
const response5 = await catalog.queryEntities(request5);
|
||||
expect(response5.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('AA'),
|
||||
@@ -1225,10 +1225,10 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
const limit = 2;
|
||||
|
||||
// initial request
|
||||
const request1: PaginatedEntitiesInitialRequest = {
|
||||
const request1: QueryEntitiesInitialRequest = {
|
||||
limit,
|
||||
};
|
||||
const response1 = await catalog.paginatedEntities(request1);
|
||||
const response1 = await catalog.queryEntities(request1);
|
||||
expect(response1.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('CC'),
|
||||
@@ -1238,11 +1238,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response1.totalItems).toBe(6);
|
||||
|
||||
// second request (forward)
|
||||
const request2: PaginatedEntitiesCursorRequest = {
|
||||
const request2: QueryEntitiesCursorRequest = {
|
||||
cursor: response1.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response2 = await catalog.paginatedEntities(request2);
|
||||
const response2 = await catalog.queryEntities(request2);
|
||||
expect(response2.entities).toMatchObject([
|
||||
entityFrom('DD'),
|
||||
entityFrom('AA', { namespace: 'namespace2' }),
|
||||
@@ -1252,11 +1252,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response2.totalItems).toBe(6);
|
||||
|
||||
// third request (forward)
|
||||
const request3: PaginatedEntitiesCursorRequest = {
|
||||
const request3: QueryEntitiesCursorRequest = {
|
||||
cursor: response2.nextCursor!,
|
||||
limit,
|
||||
};
|
||||
const response3 = await catalog.paginatedEntities(request3);
|
||||
const response3 = await catalog.queryEntities(request3);
|
||||
expect(response3.entities).toMatchObject([
|
||||
entityFrom('AA', { namespace: 'namespace3' }),
|
||||
entityFrom('AA', { namespace: 'namespace4' }),
|
||||
@@ -1266,11 +1266,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response3.totalItems).toBe(6);
|
||||
|
||||
// forth request (backward)
|
||||
const request4: PaginatedEntitiesCursorRequest = {
|
||||
const request4: QueryEntitiesCursorRequest = {
|
||||
cursor: response3.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response4 = await catalog.paginatedEntities(request4);
|
||||
const response4 = await catalog.queryEntities(request4);
|
||||
expect(response4.entities).toMatchObject([
|
||||
entityFrom('DD'),
|
||||
entityFrom('AA', { namespace: 'namespace2' }),
|
||||
@@ -1280,11 +1280,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
expect(response4.totalItems).toBe(6);
|
||||
|
||||
// fifth request (backward)
|
||||
const request5: PaginatedEntitiesCursorRequest = {
|
||||
const request5: QueryEntitiesCursorRequest = {
|
||||
cursor: response4.prevCursor!,
|
||||
limit,
|
||||
};
|
||||
const response5 = await catalog.paginatedEntities(request5);
|
||||
const response5 = await catalog.queryEntities(request5);
|
||||
expect(response5.entities).toMatchObject([
|
||||
entityFrom('AA'),
|
||||
entityFrom('CC'),
|
||||
@@ -1306,11 +1306,11 @@ describe('DefaultEntitiesCatalog', () => {
|
||||
JSON.stringify({ filter: 'notavalidfilter' }),
|
||||
'utf8',
|
||||
).toString('base64');
|
||||
const request: PaginatedEntitiesCursorRequest = {
|
||||
const request: QueryEntitiesCursorRequest = {
|
||||
cursor,
|
||||
};
|
||||
|
||||
await expect(catalog.paginatedEntities(request)).rejects.toThrow(
|
||||
await expect(catalog.queryEntities(request)).rejects.toThrow(
|
||||
Error('Malformed cursor, could not be parsed'),
|
||||
);
|
||||
});
|
||||
|
||||
@@ -37,8 +37,8 @@ import {
|
||||
EntityFacetsResponse,
|
||||
EntityFilter,
|
||||
EntityPagination,
|
||||
PaginatedEntitiesRequest,
|
||||
PaginatedEntitiesResponse,
|
||||
QueryEntitiesRequest,
|
||||
QueryEntitiesResponse,
|
||||
EntityOrder,
|
||||
} from '../catalog/types';
|
||||
import {
|
||||
@@ -53,8 +53,8 @@ import {
|
||||
import { Stitcher } from '../stitching/Stitcher';
|
||||
|
||||
import {
|
||||
isPaginatedEntitiesCursorRequest,
|
||||
isPaginatedEntitiesInitialRequest,
|
||||
isQueryEntitiesCursorRequest,
|
||||
isQueryEntitiesInitialRequest,
|
||||
} from './util';
|
||||
|
||||
const defaultSortField: EntityOrder = {
|
||||
@@ -332,9 +332,9 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog {
|
||||
return { items };
|
||||
}
|
||||
|
||||
async paginatedEntities(
|
||||
request?: PaginatedEntitiesRequest,
|
||||
): Promise<PaginatedEntitiesResponse> {
|
||||
async queryEntities(
|
||||
request?: QueryEntitiesRequest,
|
||||
): Promise<QueryEntitiesResponse> {
|
||||
const db = this.database;
|
||||
const limit = request?.limit ?? 20;
|
||||
|
||||
@@ -693,13 +693,13 @@ function decodeCursor(encodedCursor: string) {
|
||||
}
|
||||
|
||||
function parseCursorFromRequest(
|
||||
request?: PaginatedEntitiesRequest,
|
||||
request?: QueryEntitiesRequest,
|
||||
): Partial<Cursor> {
|
||||
if (isPaginatedEntitiesInitialRequest(request)) {
|
||||
if (isQueryEntitiesInitialRequest(request)) {
|
||||
const { filter, sortFields = [defaultSortField], query } = request;
|
||||
return { filter, sortFields, query };
|
||||
}
|
||||
if (isPaginatedEntitiesCursorRequest(request)) {
|
||||
if (isQueryEntitiesCursorRequest(request)) {
|
||||
try {
|
||||
return decodeCursor(request.cursor);
|
||||
} catch {
|
||||
|
||||
@@ -52,7 +52,7 @@ describe('createRouter readonly disabled', () => {
|
||||
removeEntityByUid: jest.fn(),
|
||||
entityAncestry: jest.fn(),
|
||||
facets: jest.fn(),
|
||||
paginatedEntities: jest.fn(),
|
||||
queryEntities: jest.fn(),
|
||||
};
|
||||
locationService = {
|
||||
getLocation: jest.fn(),
|
||||
@@ -142,7 +142,7 @@ describe('createRouter readonly disabled', () => {
|
||||
{ apiVersion: 'a', kind: 'b', metadata: { name: 'n' } },
|
||||
];
|
||||
|
||||
entitiesCatalog.paginatedEntities.mockResolvedValueOnce({
|
||||
entitiesCatalog.queryEntities.mockResolvedValueOnce({
|
||||
entities,
|
||||
totalItems: 100,
|
||||
nextCursor: 'something',
|
||||
@@ -158,7 +158,7 @@ describe('createRouter readonly disabled', () => {
|
||||
});
|
||||
|
||||
it('parses initial request', async () => {
|
||||
entitiesCatalog.paginatedEntities.mockResolvedValueOnce({
|
||||
entitiesCatalog.queryEntities.mockResolvedValueOnce({
|
||||
entities: [],
|
||||
totalItems: 0,
|
||||
});
|
||||
@@ -167,8 +167,8 @@ describe('createRouter readonly disabled', () => {
|
||||
);
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledTimes(1);
|
||||
expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledWith({
|
||||
expect(entitiesCatalog.queryEntities).toHaveBeenCalledTimes(1);
|
||||
expect(entitiesCatalog.queryEntities).toHaveBeenCalledWith({
|
||||
filter: {
|
||||
anyOf: [
|
||||
{
|
||||
@@ -192,7 +192,7 @@ describe('createRouter readonly disabled', () => {
|
||||
{ apiVersion: 'a', kind: 'b', metadata: { name: 'n' } },
|
||||
];
|
||||
|
||||
entitiesCatalog.paginatedEntities.mockResolvedValueOnce({
|
||||
entitiesCatalog.queryEntities.mockResolvedValueOnce({
|
||||
entities,
|
||||
totalItems: 100,
|
||||
nextCursor: 'next',
|
||||
@@ -201,8 +201,8 @@ describe('createRouter readonly disabled', () => {
|
||||
const response = await request(app).get(
|
||||
'/entities/by-query?cursor=something',
|
||||
);
|
||||
expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledTimes(1);
|
||||
expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledWith({
|
||||
expect(entitiesCatalog.queryEntities).toHaveBeenCalledTimes(1);
|
||||
expect(entitiesCatalog.queryEntities).toHaveBeenCalledWith({
|
||||
cursor: 'something',
|
||||
});
|
||||
expect(response.status).toEqual(200);
|
||||
@@ -639,7 +639,7 @@ describe('createRouter readonly enabled', () => {
|
||||
removeEntityByUid: jest.fn(),
|
||||
entityAncestry: jest.fn(),
|
||||
facets: jest.fn(),
|
||||
paginatedEntities: jest.fn(),
|
||||
queryEntities: jest.fn(),
|
||||
};
|
||||
locationService = {
|
||||
getLocation: jest.fn(),
|
||||
@@ -830,7 +830,7 @@ describe('NextRouter permissioning', () => {
|
||||
removeEntityByUid: jest.fn(),
|
||||
entityAncestry: jest.fn(),
|
||||
facets: jest.fn(),
|
||||
paginatedEntities: jest.fn(),
|
||||
queryEntities: jest.fn(),
|
||||
};
|
||||
locationService = {
|
||||
getLocation: jest.fn(),
|
||||
|
||||
@@ -39,7 +39,7 @@ import {
|
||||
parseEntityFilterParams,
|
||||
parseEntityPaginationParams,
|
||||
parseEntityTransformParams,
|
||||
parsePaginatedEntitiesParams,
|
||||
parseQueryEntitiesParams,
|
||||
} from './request';
|
||||
import { parseEntityFacetParams } from './request/parseEntityFacetParams';
|
||||
import { parseEntityOrderParams } from './request/parseEntityOrderParams';
|
||||
@@ -132,8 +132,8 @@ export async function createRouter(
|
||||
res.json(entities);
|
||||
})
|
||||
.get('/entities/by-query', async (req, res) => {
|
||||
const response = await entitiesCatalog.paginatedEntities({
|
||||
...parsePaginatedEntitiesParams(req.query),
|
||||
const response = await entitiesCatalog.queryEntities({
|
||||
...parseQueryEntitiesParams(req.query),
|
||||
authorizationToken: getBearerToken(req.header('authorization')),
|
||||
});
|
||||
|
||||
|
||||
@@ -19,4 +19,4 @@ export { basicEntityFilter } from './basicEntityFilter';
|
||||
export { parseEntityFilterParams } from './parseEntityFilterParams';
|
||||
export { parseEntityPaginationParams } from './parseEntityPaginationParams';
|
||||
export { parseEntityTransformParams } from './parseEntityTransformParams';
|
||||
export { parsePaginatedEntitiesParams } from './parsePaginatedEntitiesParams';
|
||||
export { parseQueryEntitiesParams } from './parseQueryEntitiesParams';
|
||||
|
||||
+16
-16
@@ -15,12 +15,12 @@
|
||||
*/
|
||||
|
||||
import {
|
||||
PaginatedEntitiesCursorRequest,
|
||||
PaginatedEntitiesInitialRequest,
|
||||
QueryEntitiesCursorRequest,
|
||||
QueryEntitiesInitialRequest,
|
||||
} from '../../catalog/types';
|
||||
import { parsePaginatedEntitiesParams } from './parsePaginatedEntitiesParams';
|
||||
import { parseQueryEntitiesParams } from './parseQueryEntitiesParams';
|
||||
|
||||
describe('parsePaginatedEntitiesParams', () => {
|
||||
describe('parseQueryEntitiesParams', () => {
|
||||
describe('initial request', () => {
|
||||
it('should parse all the defined params', () => {
|
||||
const validRequest = {
|
||||
@@ -31,9 +31,9 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
sortField: ['metadata.name,desc'],
|
||||
query: 'query',
|
||||
};
|
||||
const parsedObj = parsePaginatedEntitiesParams(
|
||||
const parsedObj = parseQueryEntitiesParams(
|
||||
validRequest,
|
||||
) as PaginatedEntitiesInitialRequest;
|
||||
) as QueryEntitiesInitialRequest;
|
||||
expect(parsedObj.limit).toBe(3);
|
||||
expect(parsedObj.fields).toBeDefined();
|
||||
expect(parsedObj.sortFields).toEqual([
|
||||
@@ -45,9 +45,9 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
expect(parsedObj).not.toHaveProperty('cursor');
|
||||
});
|
||||
it('should ignore optional params', () => {
|
||||
const parsedObj = parsePaginatedEntitiesParams(
|
||||
const parsedObj = parseQueryEntitiesParams(
|
||||
{},
|
||||
) as PaginatedEntitiesInitialRequest;
|
||||
) as QueryEntitiesInitialRequest;
|
||||
expect(parsedObj.limit).toBeUndefined();
|
||||
expect(parsedObj.fields).toBeUndefined();
|
||||
expect(parsedObj.sortFields).toBeUndefined();
|
||||
@@ -66,7 +66,7 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
{ fields: [4] },
|
||||
{ query: [] },
|
||||
])('should throw if some parameter is not valid %p', params => {
|
||||
expect(() => parsePaginatedEntitiesParams(params)).toThrow();
|
||||
expect(() => parseQueryEntitiesParams(params)).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -78,9 +78,9 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
limit: '3',
|
||||
cursor: 'cursor',
|
||||
};
|
||||
const parsedObj = parsePaginatedEntitiesParams(
|
||||
const parsedObj = parseQueryEntitiesParams(
|
||||
validRequest,
|
||||
) as PaginatedEntitiesCursorRequest;
|
||||
) as QueryEntitiesCursorRequest;
|
||||
expect(parsedObj.limit).toBe(3);
|
||||
expect(parsedObj.fields).toBeDefined();
|
||||
expect(parsedObj.cursor).toBe('cursor');
|
||||
@@ -97,9 +97,9 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
sortFieldOrder: 'desc',
|
||||
query: 'query',
|
||||
};
|
||||
const parsedObj = parsePaginatedEntitiesParams(
|
||||
const parsedObj = parseQueryEntitiesParams(
|
||||
validRequest,
|
||||
) as PaginatedEntitiesCursorRequest;
|
||||
) as QueryEntitiesCursorRequest;
|
||||
expect(parsedObj.limit).toBe(3);
|
||||
expect(parsedObj.fields).toBeDefined();
|
||||
expect(parsedObj.cursor).toBe('cursor');
|
||||
@@ -110,9 +110,9 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
});
|
||||
|
||||
it('should ignore optional params', () => {
|
||||
const parsedObj = parsePaginatedEntitiesParams(
|
||||
const parsedObj = parseQueryEntitiesParams(
|
||||
{},
|
||||
) as PaginatedEntitiesCursorRequest;
|
||||
) as QueryEntitiesCursorRequest;
|
||||
expect(parsedObj.limit).toBeUndefined();
|
||||
expect(parsedObj.fields).toBeUndefined();
|
||||
});
|
||||
@@ -124,7 +124,7 @@ describe('parsePaginatedEntitiesParams', () => {
|
||||
{ cursor: [] },
|
||||
{ fields: [4] },
|
||||
])('should throw if some parameter is not valid %p', params => {
|
||||
expect(() => parsePaginatedEntitiesParams(params)).toThrow();
|
||||
expect(() => parseQueryEntitiesParams(params)).toThrow();
|
||||
});
|
||||
});
|
||||
});
|
||||
+17
-19
@@ -15,28 +15,27 @@
|
||||
*/
|
||||
|
||||
import {
|
||||
PaginatedEntitiesCursorRequest,
|
||||
PaginatedEntitiesInitialRequest,
|
||||
PaginatedEntitiesRequest,
|
||||
QueryEntitiesCursorRequest,
|
||||
QueryEntitiesInitialRequest,
|
||||
QueryEntitiesRequest,
|
||||
} from '../../catalog/types';
|
||||
import { parseIntegerParam, parseStringParam } from './common';
|
||||
import { parseEntityFilterParams } from './parseEntityFilterParams';
|
||||
import { parseEntitySortFieldParams } from './parseEntitySortFieldParams';
|
||||
import { parseEntityTransformParams } from './parseEntityTransformParams';
|
||||
|
||||
export function parsePaginatedEntitiesParams(
|
||||
export function parseQueryEntitiesParams(
|
||||
params: Record<string, unknown>,
|
||||
): Omit<PaginatedEntitiesRequest, 'authorizationToken'> {
|
||||
): Omit<QueryEntitiesRequest, 'authorizationToken'> {
|
||||
const fields = parseEntityTransformParams(params);
|
||||
const limit = parseIntegerParam(params.limit, 'limit');
|
||||
const cursor = parseStringParam(params.cursor, 'cursor');
|
||||
if (cursor) {
|
||||
const response: Omit<PaginatedEntitiesCursorRequest, 'authorizationToken'> =
|
||||
{
|
||||
cursor,
|
||||
fields,
|
||||
limit,
|
||||
};
|
||||
const response: Omit<QueryEntitiesCursorRequest, 'authorizationToken'> = {
|
||||
cursor,
|
||||
fields,
|
||||
limit,
|
||||
};
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -44,14 +43,13 @@ export function parsePaginatedEntitiesParams(
|
||||
const query = parseStringParam(params.query, 'query');
|
||||
const sortFields = parseEntitySortFieldParams(params);
|
||||
|
||||
const response: Omit<PaginatedEntitiesInitialRequest, 'authorizationToken'> =
|
||||
{
|
||||
fields,
|
||||
filter,
|
||||
limit,
|
||||
sortFields,
|
||||
query,
|
||||
};
|
||||
const response: Omit<QueryEntitiesInitialRequest, 'authorizationToken'> = {
|
||||
fields,
|
||||
filter,
|
||||
limit,
|
||||
sortFields,
|
||||
query,
|
||||
};
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -19,9 +19,9 @@ import { Request } from 'express';
|
||||
import lodash from 'lodash';
|
||||
import { z } from 'zod';
|
||||
import {
|
||||
PaginatedEntitiesCursorRequest,
|
||||
PaginatedEntitiesInitialRequest,
|
||||
PaginatedEntitiesRequest,
|
||||
QueryEntitiesCursorRequest,
|
||||
QueryEntitiesInitialRequest,
|
||||
QueryEntitiesRequest,
|
||||
} from '../catalog/types';
|
||||
|
||||
export async function requireRequestBody(req: Request): Promise<unknown> {
|
||||
@@ -71,20 +71,20 @@ export function disallowReadonlyMode(readonly: boolean) {
|
||||
}
|
||||
}
|
||||
|
||||
export function isPaginatedEntitiesInitialRequest(
|
||||
input: PaginatedEntitiesRequest | undefined,
|
||||
): input is PaginatedEntitiesInitialRequest {
|
||||
export function isQueryEntitiesInitialRequest(
|
||||
input: QueryEntitiesRequest | undefined,
|
||||
): input is QueryEntitiesInitialRequest {
|
||||
if (!input) {
|
||||
return false;
|
||||
}
|
||||
return !isPaginatedEntitiesCursorRequest(input);
|
||||
return !isQueryEntitiesCursorRequest(input);
|
||||
}
|
||||
|
||||
export function isPaginatedEntitiesCursorRequest(
|
||||
input: PaginatedEntitiesRequest | undefined,
|
||||
): input is PaginatedEntitiesCursorRequest {
|
||||
export function isQueryEntitiesCursorRequest(
|
||||
input: QueryEntitiesRequest | undefined,
|
||||
): input is QueryEntitiesCursorRequest {
|
||||
if (!input) {
|
||||
return false;
|
||||
}
|
||||
return !!(input as PaginatedEntitiesCursorRequest).cursor;
|
||||
return !!(input as QueryEntitiesCursorRequest).cursor;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user