implement single-item fetches to go by refs instead of filters

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2024-12-07 11:22:57 +01:00
parent 890e983440
commit 0c33465470
3 changed files with 19 additions and 28 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-backend': patch
---
Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs`
@@ -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);
@@ -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',