From e139961b4871c3706b665d4f245506b1029851ad Mon Sep 17 00:00:00 2001 From: Rbillon59 Date: Wed, 3 May 2023 17:44:10 +0200 Subject: [PATCH] refactor: factorise addBadge and getUuidFromBadgeMetadata to one endpoint handling both cases Signed-off-by: Rbillon59 --- plugins/badges-backend/api-report.md | 19 ++------ .../src/database/badgeStore.test.ts | 18 ++++---- .../src/database/badgesStore.ts | 43 ++++++++----------- .../src/service/router-obfuscated.test.ts | 5 +-- .../badges-backend/src/service/router.test.ts | 3 +- plugins/badges-backend/src/service/router.ts | 14 +++--- 6 files changed, 38 insertions(+), 64 deletions(-) diff --git a/plugins/badges-backend/api-report.md b/plugins/badges-backend/api-report.md index 013c2c5ac7..09a02ba44d 100644 --- a/plugins/badges-backend/api-report.md +++ b/plugins/badges-backend/api-report.md @@ -83,14 +83,6 @@ export type BadgeSpec = { // @public export interface BadgesStore { - // (undocumented) - addBadge( - name: string, - namespace: string, - kind: string, - ): Promise<{ - uuid: string; - }>; // (undocumented) getBadgeFromUuid(uuid: string): Promise< | { @@ -101,16 +93,13 @@ export interface BadgesStore { | undefined >; // (undocumented) - getUuidFromEntityMetadata( + getBadgeUuid( name: string, namespace: string, kind: string, - ): Promise< - | { - uuid: string; - } - | undefined - >; + ): Promise<{ + uuid: string; + }>; } // @public (undocumented) diff --git a/plugins/badges-backend/src/database/badgeStore.test.ts b/plugins/badges-backend/src/database/badgeStore.test.ts index 60a885daa4..5a7a82d4b7 100644 --- a/plugins/badges-backend/src/database/badgeStore.test.ts +++ b/plugins/badges-backend/src/database/badgeStore.test.ts @@ -48,13 +48,17 @@ describe('DatabaseBadgesStore', () => { ({ knex, badgeStore } = await createDatabaseBadgesStore(databaseId)); }); - it('createABadge', async () => { - const uuid = await badgeStore.addBadge( + it('createABadge if not existing in DB', async () => { + const uuid = await badgeStore.getBadgeUuid( entity.metadata.name, entity.metadata.namespace || 'default', entity.kind, ); + expect(uuid.uuid).toMatch( + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/, + ); + const storedBadge = await badgeStore.getBadgeFromUuid(uuid.uuid); expect(storedBadge?.kind).toEqual(entity.kind); expect(storedBadge?.name).toEqual(entity.metadata.name); @@ -63,7 +67,7 @@ describe('DatabaseBadgesStore', () => { ); }); - it('getBadgeFromUuid', async () => { + it('getBadge if badge already exist in DB', async () => { await knex('badges').truncate(); await knex('badges').insert([ { @@ -83,7 +87,7 @@ describe('DatabaseBadgesStore', () => { }); }); - it('getUuidFromEntityMetadata', async () => { + it('getBadgeUuid if badge exist in DB', async () => { await knex('badges').truncate(); await knex('badges').insert([ { @@ -94,15 +98,13 @@ describe('DatabaseBadgesStore', () => { }, ]); - const storedUuid = await badgeStore.getUuidFromEntityMetadata( + const storedUuid = await badgeStore.getBadgeUuid( 'test', 'default', 'component', ); - expect(storedUuid).toEqual({ - uuid: 'uuid1', - }); + expect(storedUuid).toEqual({ uuid: 'uuid1' }); }); }); }); diff --git a/plugins/badges-backend/src/database/badgesStore.ts b/plugins/badges-backend/src/database/badgesStore.ts index 62d546f025..e6c6a9e2ad 100644 --- a/plugins/badges-backend/src/database/badgesStore.ts +++ b/plugins/badges-backend/src/database/badgesStore.ts @@ -19,6 +19,7 @@ import { resolvePackagePath, } from '@backstage/backend-common'; import { Knex } from 'knex'; +import { isNil } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; /** @@ -26,7 +27,7 @@ import { v4 as uuidv4 } from 'uuid'; * @public */ export interface BadgesStore { - addBadge( + getBadgeUuid( name: string, namespace: string, kind: string, @@ -35,12 +36,6 @@ export interface BadgesStore { getBadgeFromUuid( uuid: string, ): Promise<{ name: string; namespace: string; kind: string } | undefined>; - - getUuidFromEntityMetadata( - name: string, - namespace: string, - kind: string, - ): Promise<{ uuid: string } | undefined>; } const migrationsDir = resolvePackagePath( @@ -84,35 +79,31 @@ export class DatabaseBadgesStore implements BadgesStore { return result; } - async getUuidFromEntityMetadata( + async getBadgeUuid( name: string, namespace: string, kind: string, - ): Promise<{ uuid: string } | undefined> { + ): Promise<{ uuid: string }> { const result = await this.db('badges') .select('uuid') .where({ name: name, namespace: namespace, kind: kind }) .first(); - return result; - } + let uuid = result?.uuid; - async addBadge( - name: string, - namespace: string, - kind: string, - ): Promise<{ uuid: string }> { - const uuid = uuidv4(); + if (isNil(uuid)) { + uuid = uuidv4(); - await this.db('badges') - .insert({ - uuid: uuid, - name: name, - namespace: namespace, - kind: kind, - }) - .onConflict(['name', 'namespace', 'kind']) - .ignore(); + await this.db('badges') + .insert({ + uuid: uuid, + name: name, + namespace: namespace, + kind: kind, + }) + .onConflict(['name', 'namespace', 'kind']) + .ignore(); + } return { uuid }; } diff --git a/plugins/badges-backend/src/service/router-obfuscated.test.ts b/plugins/badges-backend/src/service/router-obfuscated.test.ts index d5f18ab470..3c9ec0d2b6 100644 --- a/plugins/badges-backend/src/service/router-obfuscated.test.ts +++ b/plugins/badges-backend/src/service/router-obfuscated.test.ts @@ -129,15 +129,12 @@ describe('createRouter', () => { }; const badgeStore: jest.Mocked = { - addBadge: jest.fn().mockImplementation(async () => { + getBadgeUuid: jest.fn().mockImplementation(async () => { return { uuid: 'uuid1' }; }), getBadgeFromUuid: jest.fn().mockImplementation(async () => { return badgeEntity; }), - getUuidFromEntityMetadata: jest - .fn() - .mockImplementation(async () => 'uuid1'), }; beforeAll(async () => { diff --git a/plugins/badges-backend/src/service/router.test.ts b/plugins/badges-backend/src/service/router.test.ts index 962d01e4d8..2ecae6b452 100644 --- a/plugins/badges-backend/src/service/router.test.ts +++ b/plugins/badges-backend/src/service/router.test.ts @@ -76,8 +76,7 @@ describe('createRouter', () => { const badgeStore: jest.Mocked = { getBadgeFromUuid: jest.fn(), - getUuidFromEntityMetadata: jest.fn(), - addBadge: jest.fn(), + getBadgeUuid: jest.fn(), }; beforeAll(async () => { diff --git a/plugins/badges-backend/src/service/router.ts b/plugins/badges-backend/src/service/router.ts index 92bbb1aeae..308865b73a 100644 --- a/plugins/badges-backend/src/service/router.ts +++ b/plugins/badges-backend/src/service/router.ts @@ -233,17 +233,13 @@ async function obfuscatedRoute( }, async (req, res) => { const { namespace, kind, name } = req.params; - let storedEntityUuid: { uuid: string } | undefined = - await store.getUuidFromEntityMetadata(name, namespace, kind); + const storedEntityUuid: { uuid: string } | undefined = + await store.getBadgeUuid(name, namespace, kind); if (isNil(storedEntityUuid)) { - storedEntityUuid = await store.addBadge(name, namespace, kind); - - if (isNil(storedEntityUuid)) { - throw new NotFoundError( - `No uuid found for entity "${namespace}/${kind}/${name}"`, - ); - } + throw new NotFoundError( + `No uuid found for entity "${namespace}/${kind}/${name}"`, + ); } return res.status(200).json(storedEntityUuid);