From b17bc0191385f235b927fb88afdcc62186301ce0 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Thu, 2 Feb 2023 11:10:44 +0100 Subject: [PATCH] catalog-backend: move endpoint to /entities/by-query Signed-off-by: Vincenzo Scamporlino --- .changeset/silly-suits-run.md | 2 +- packages/catalog-client/src/CatalogClient.test.ts | 10 +++++----- packages/catalog-client/src/CatalogClient.ts | 2 +- .../catalog-backend/src/service/createRouter.test.ts | 10 ++++++---- plugins/catalog-backend/src/service/createRouter.ts | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.changeset/silly-suits-run.md b/.changeset/silly-suits-run.md index 812e6ee933..2fc731f2a4 100644 --- a/.changeset/silly-suits-run.md +++ b/.changeset/silly-suits-run.md @@ -3,6 +3,6 @@ '@backstage/plugin-catalog-backend': minor --- -Add /v2/entities endpoint returning paginated entities. +Add /entities/by-query endpoint returning paginated entities. The endpoint supports cursor base pagination and server side sorting of the entities by name or uid. diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts index fde54adeb6..cd8a0c48da 100644 --- a/packages/catalog-client/src/CatalogClient.test.ts +++ b/packages/catalog-client/src/CatalogClient.test.ts @@ -300,7 +300,7 @@ describe('CatalogClient', () => { beforeEach(() => { server.use( - rest.get(`${mockBaseUrl}/v2/entities`, (_, res, ctx) => { + rest.get(`${mockBaseUrl}/entities/by-query`, (_, res, ctx) => { return res(ctx.json(defaultServiceResponse)); }), ); @@ -321,7 +321,7 @@ describe('CatalogClient', () => { res(ctx.json({ entities: [], totalItems: 0 })), ); - server.use(rest.get(`${mockBaseUrl}/v2/entities`, mockedEndpoint)); + server.use(rest.get(`${mockBaseUrl}/entities/by-query`, mockedEndpoint)); const response = await client.getPaginatedEntities( { @@ -356,7 +356,7 @@ describe('CatalogClient', () => { res(ctx.json({ entities: [], totalItems: 0 })), ); - server.use(rest.get(`${mockBaseUrl}/v2/entities`, mockedEndpoint)); + server.use(rest.get(`${mockBaseUrl}/entities/by-query`, mockedEndpoint)); await client.getPaginatedEntities({ fields: ['a', 'b'], @@ -379,7 +379,7 @@ describe('CatalogClient', () => { res(ctx.json({ entities: [], totalItems: 0 })), ); - server.use(rest.get(`${mockBaseUrl}/v2/entities`, mockedEndpoint)); + server.use(rest.get(`${mockBaseUrl}/entities/by-query`, mockedEndpoint)); await client.getPaginatedEntities({ fields: ['a', 'b'], @@ -422,7 +422,7 @@ describe('CatalogClient', () => { ), ); - server.use(rest.get(`${mockBaseUrl}/v2/entities`, mockedEndpoint)); + server.use(rest.get(`${mockBaseUrl}/entities/by-query`, mockedEndpoint)); const response = await client.getPaginatedEntities({ limit: 2, diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts index 6d7188edbb..757d6eaa15 100644 --- a/packages/catalog-client/src/CatalogClient.ts +++ b/packages/catalog-client/src/CatalogClient.ts @@ -251,7 +251,7 @@ export class CatalogClient implements CatalogApi { totalItems: number; nextCursor?: string; prevCursor?: string; - }>('GET', `/v2/entities${query}`, options); + }>('GET', `/entities/by-query${query}`, options); } /** diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 0fe32c02b1..8f5aeab2a0 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -136,7 +136,7 @@ describe('createRouter readonly disabled', () => { }); }); - describe('GET /v2/entities', () => { + describe('GET /entities/by-query', () => { it('happy path: lists entities', async () => { const entities: Entity[] = [ { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, @@ -148,7 +148,7 @@ describe('createRouter readonly disabled', () => { nextCursor: 'something', }); - const response = await request(app).get('/v2/entities'); + const response = await request(app).get('/entities/by-query'); expect(response.status).toEqual(200); expect(response.body).toEqual({ entities, @@ -163,7 +163,7 @@ describe('createRouter readonly disabled', () => { totalItems: 0, }); const response = await request(app).get( - '/v2/entities?filter=a=1,a=2,b=3&filter=c=4&sortField=metadata.name,asc&sortField=metadata.uid,desc', + '/entities/by-query?filter=a=1,a=2,b=3&filter=c=4&sortField=metadata.name,asc&sortField=metadata.uid,desc', ); expect(response.status).toEqual(200); @@ -198,7 +198,9 @@ describe('createRouter readonly disabled', () => { nextCursor: 'next', }); - const response = await request(app).get('/v2/entities?cursor=something'); + const response = await request(app).get( + '/entities/by-query?cursor=something', + ); expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledTimes(1); expect(entitiesCatalog.paginatedEntities).toHaveBeenCalledWith({ cursor: 'something', diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index c4c2c87bad..994b676345 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -131,7 +131,7 @@ export async function createRouter( // TODO(freben): encode the pageInfo in the response res.json(entities); }) - .get('/v2/entities', async (req, res) => { + .get('/entities/by-query', async (req, res) => { const response = await entitiesCatalog.paginatedEntities({ ...parsePaginatedEntitiesParams(req.query), authorizationToken: getBearerToken(req.header('authorization')),