From 0c33465470fdbd61810439940c0a15ca15077399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Sat, 7 Dec 2024 11:22:57 +0100 Subject: [PATCH] implement single-item fetches to go by refs instead of filters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/itchy-ravens-punch.md | 5 ++++ .../src/service/createRouter.test.ts | 30 +++++++------------ .../src/service/createRouter.ts | 12 +++----- 3 files changed, 19 insertions(+), 28 deletions(-) create mode 100644 .changeset/itchy-ravens-punch.md diff --git a/.changeset/itchy-ravens-punch.md b/.changeset/itchy-ravens-punch.md new file mode 100644 index 0000000000..7d4cb9cd92 --- /dev/null +++ b/.changeset/itchy-ravens-punch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs` diff --git a/plugins/catalog-backend/src/service/createRouter.test.ts b/plugins/catalog-backend/src/service/createRouter.test.ts index 0c1d16b525..e728017f0b 100644 --- a/plugins/catalog-backend/src/service/createRouter.test.ts +++ b/plugins/catalog-backend/src/service/createRouter.test.ts @@ -445,20 +445,15 @@ describe('createRouter readonly disabled', () => { namespace: 'ns', }, }; - entitiesCatalog.entities.mockResolvedValue({ - entities: [entity], - pageInfo: { hasNextPage: false }, + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: [entity], }); const response = await request(app).get('/entities/by-name/k/ns/n'); - expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entities).toHaveBeenCalledWith({ - filter: basicEntityFilter({ - kind: 'k', - 'metadata.namespace': 'ns', - 'metadata.name': 'n', - }), + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: ['k:ns/n'], credentials: mockCredentials.user(), }); expect(response.status).toEqual(200); @@ -466,20 +461,15 @@ describe('createRouter readonly disabled', () => { }); it('responds with a 404 for missing entities', async () => { - entitiesCatalog.entities.mockResolvedValue({ - entities: [], - pageInfo: { hasNextPage: false }, + entitiesCatalog.entitiesBatch.mockResolvedValue({ + items: [null], }); const response = await request(app).get('/entities/by-name/b/d/c'); - expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entities).toHaveBeenCalledWith({ - filter: basicEntityFilter({ - kind: 'b', - 'metadata.namespace': 'd', - 'metadata.name': 'c', - }), + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entitiesBatch).toHaveBeenCalledWith({ + entityRefs: ['b:d/c'], credentials: mockCredentials.user(), }); expect(response.status).toEqual(404); diff --git a/plugins/catalog-backend/src/service/createRouter.ts b/plugins/catalog-backend/src/service/createRouter.ts index 3a6dc82586..d70419c565 100644 --- a/plugins/catalog-backend/src/service/createRouter.ts +++ b/plugins/catalog-backend/src/service/createRouter.ts @@ -274,20 +274,16 @@ export async function createRouter( }) .get('/entities/by-name/:kind/:namespace/:name', async (req, res) => { const { kind, namespace, name } = req.params; - const { entities } = await entitiesCatalog.entities({ - filter: basicEntityFilter({ - kind: kind, - 'metadata.namespace': namespace, - 'metadata.name': name, - }), + const { items } = await entitiesCatalog.entitiesBatch({ + entityRefs: [stringifyEntityRef({ kind, namespace, name })], credentials: await httpAuth.credentials(req), }); - if (!entities.length) { + if (!items[0]) { throw new NotFoundError( `No entity named '${name}' found, with kind '${kind}' in namespace '${namespace}'`, ); } - res.status(200).json(entities[0]); + res.status(200).json(items[0]); }) .get( '/entities/by-name/:kind/:namespace/:name/ancestry',