diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts index 2575411e7c..c43e1b2f05 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts @@ -15,13 +15,12 @@ */ import { NotFoundError } from '@backstage/backend-common'; +import type { Entity } from '@backstage/catalog-model'; import { - EntityName, generateUpdatedEntity, getEntityName, LOCATION_ANNOTATION, } from '@backstage/catalog-model'; -import type { Entity } from '@backstage/catalog-model'; import type { Database, DbEntityResponse, EntityFilters } from '../database'; import type { EntitiesCatalog } from './types'; @@ -35,20 +34,6 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { return items.map(i => i.entity); } - async entityByUid(uid: string): Promise { - const response = await this.database.transaction(tx => - this.database.entityByUid(tx, uid), - ); - return response?.entity; - } - - async entityByName(name: EntityName): Promise { - const response = await this.database.transaction(tx => - this.database.entityByName(tx, name), - ); - return response?.entity; - } - async addOrUpdateEntity( entity: Entity, locationId?: string, diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 5d84cbcebc..810d51a6c1 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Entity, EntityName, Location } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; import type { EntityFilters } from '../database'; // @@ -23,8 +23,6 @@ import type { EntityFilters } from '../database'; export type EntitiesCatalog = { entities(filters?: EntityFilters): Promise; - entityByUid(uid: string): Promise; - entityByName(name: EntityName): Promise; addOrUpdateEntity(entity: Entity, locationId?: string): Promise; addEntities(entities: Entity[], locationId?: string): Promise; removeEntityByUid(uid: string): Promise; diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts index 15d9168732..81753fe6d1 100644 --- a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts @@ -36,8 +36,6 @@ describe('HigherOrderOperations', () => { beforeAll(() => { entitiesCatalog = { entities: jest.fn(), - entityByUid: jest.fn(), - entityByName: jest.fn(), addOrUpdateEntity: jest.fn(), addEntities: jest.fn(), removeEntityByUid: jest.fn(), diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index ecf4b0e614..ec5c11be33 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -32,8 +32,6 @@ describe('createRouter', () => { beforeAll(async () => { entitiesCatalog = { entities: jest.fn(), - entityByUid: jest.fn(), - entityByName: jest.fn(), addOrUpdateEntity: jest.fn(), addEntities: jest.fn(), removeEntityByUid: jest.fn(), @@ -100,23 +98,27 @@ describe('createRouter', () => { name: 'c', }, }; - entitiesCatalog.entityByUid.mockResolvedValue(entity); + entitiesCatalog.entities.mockResolvedValue([entity]); const response = await request(app).get('/entities/by-uid/zzz'); - expect(entitiesCatalog.entityByUid).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entityByUid).toHaveBeenCalledWith('zzz'); + expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entities).toHaveBeenCalledWith([ + { key: 'metadata.uid', values: ['zzz'] }, + ]); expect(response.status).toEqual(200); expect(response.body).toEqual(expect.objectContaining(entity)); }); it('responds with a 404 for missing entities', async () => { - entitiesCatalog.entityByUid.mockResolvedValue(undefined); + entitiesCatalog.entities.mockResolvedValue([]); const response = await request(app).get('/entities/by-uid/zzz'); - expect(entitiesCatalog.entityByUid).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entityByUid).toHaveBeenCalledWith('zzz'); + expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entities).toHaveBeenCalledWith([ + { key: 'metadata.uid', values: ['zzz'] }, + ]); expect(response.status).toEqual(404); expect(response.text).toMatch(/uid/); }); @@ -132,31 +134,31 @@ describe('createRouter', () => { namespace: 'ns', }, }; - entitiesCatalog.entityByName.mockResolvedValue(entity); + entitiesCatalog.entities.mockResolvedValue([entity]); const response = await request(app).get('/entities/by-name/k/ns/n'); - expect(entitiesCatalog.entityByName).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entityByName).toHaveBeenCalledWith({ - kind: 'k', - namespace: 'ns', - name: 'n', - }); + expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entities).toHaveBeenCalledWith([ + { key: 'kind', values: ['k'] }, + { key: 'metadata.namespace', values: ['ns'] }, + { key: 'metadata.name', values: ['n'] }, + ]); expect(response.status).toEqual(200); expect(response.body).toEqual(expect.objectContaining(entity)); }); it('responds with a 404 for missing entities', async () => { - entitiesCatalog.entityByName.mockResolvedValue(undefined); + entitiesCatalog.entities.mockResolvedValue([]); const response = await request(app).get('/entities/by-name/b/d/c'); - expect(entitiesCatalog.entityByName).toHaveBeenCalledTimes(1); - expect(entitiesCatalog.entityByName).toHaveBeenCalledWith({ - kind: 'b', - namespace: 'd', - name: 'c', - }); + expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entities).toHaveBeenCalledWith([ + { key: 'kind', values: ['b'] }, + { key: 'metadata.namespace', values: ['d'] }, + { key: 'metadata.name', values: ['c'] }, + ]); expect(response.status).toEqual(404); expect(response.text).toMatch(/name/); }); diff --git a/plugins/catalog-backend/src/service/router.ts b/plugins/catalog-backend/src/service/router.ts index 8da589c721..06a7ea43d3 100644 --- a/plugins/catalog-backend/src/service/router.ts +++ b/plugins/catalog-backend/src/service/router.ts @@ -54,11 +54,13 @@ export async function createRouter( }) .get('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; - const entity = await entitiesCatalog.entityByUid(uid); - if (!entity) { + const entities = await entitiesCatalog.entities([ + { key: 'metadata.uid', values: [uid] }, + ]); + if (!entities.length) { res.status(404).send(`No entity with uid ${uid}`); } - res.status(200).send(entity); + res.status(200).send(entities[0]); }) .delete('/entities/by-uid/:uid', async (req, res) => { const { uid } = req.params; @@ -67,19 +69,19 @@ export async function createRouter( }) .get('/entities/by-name/:kind/:namespace/:name', async (req, res) => { const { kind, namespace, name } = req.params; - const entity = await entitiesCatalog.entityByName({ - kind, - namespace, - name, - }); - if (!entity) { + const entities = await entitiesCatalog.entities([ + { key: 'kind', values: [kind] }, + { key: 'metadata.namespace', values: [namespace] }, + { key: 'metadata.name', values: [name] }, + ]); + if (!entities.length) { res .status(404) .send( `No entity with kind ${kind} namespace ${namespace} name ${name}`, ); } - res.status(200).send(entity); + res.status(200).send(entities[0]); }); }