catalog-backend: rename paginatedEntities to queryEntities

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
This commit is contained in:
Vincenzo Scamporlino
2023-02-03 00:39:03 +01:00
parent 5044821cb1
commit 9ccbf8a08d
11 changed files with 154 additions and 158 deletions
+11 -13
View File
@@ -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';
@@ -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();
});
});
});
@@ -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;
}
+11 -11
View File
@@ -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;
}