feat(catalog-backend): remove byUid and byName as special cases

This commit is contained in:
Fredrik Adelöw
2020-10-09 13:33:20 +02:00
parent 26afad294f
commit 6109e35495
5 changed files with 38 additions and 53 deletions
@@ -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<Entity | undefined> {
const response = await this.database.transaction(tx =>
this.database.entityByUid(tx, uid),
);
return response?.entity;
}
async entityByName(name: EntityName): Promise<Entity | undefined> {
const response = await this.database.transaction(tx =>
this.database.entityByName(tx, name),
);
return response?.entity;
}
async addOrUpdateEntity(
entity: Entity,
locationId?: string,
+1 -3
View File
@@ -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<Entity[]>;
entityByUid(uid: string): Promise<Entity | undefined>;
entityByName(name: EntityName): Promise<Entity | undefined>;
addOrUpdateEntity(entity: Entity, locationId?: string): Promise<Entity>;
addEntities(entities: Entity[], locationId?: string): Promise<void>;
removeEntityByUid(uid: string): Promise<void>;
@@ -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(),
@@ -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/);
});
+12 -10
View File
@@ -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]);
});
}