From 6c194b58eb2987a5196ecfd36d4425f4b613683d Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 5 Jul 2022 17:39:26 +0200 Subject: [PATCH] Make FactRetrieverRegistry async so that a db backed implementation can be used Signed-off-by: sblausten --- .../service/fact/FactRetrieverEngine.test.ts | 4 +- .../src/service/fact/FactRetrieverEngine.ts | 11 ++---- .../src/service/fact/FactRetrieverRegistry.ts | 39 ++++++++++++------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts index 454711171f..44ffa6587f 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.test.ts @@ -206,9 +206,7 @@ describe('FactRetrieverEngine', () => { { ...testFactRetriever, handler }, ); await engine.schedule(); - const job: FactRetrieverRegistration = engine.getJobRegistration( - testFactRetriever.id, - ); + const job = await engine.getJobRegistration(testFactRetriever.id); expect(job.cadence!!).toEqual(defaultCadence); await engine.triggerJob(job.factRetriever.id); diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts index 25e7610809..f8ff3762dd 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverEngine.ts @@ -66,11 +66,8 @@ export class FactRetrieverEngine { defaultTimeout, } = options; - await Promise.all( - factRetrieverRegistry - .listRetrievers() - .map(it => repository.insertFactSchema(it)), - ); + const retrievers = await factRetrieverRegistry.listRetrievers(); + await Promise.all(retrievers.map(it => repository.insertFactSchema(it))); return new FactRetrieverEngine( repository, @@ -84,7 +81,7 @@ export class FactRetrieverEngine { } async schedule() { - const registrations = this.factRetrieverRegistry.listRegistrations(); + const registrations = await this.factRetrieverRegistry.listRegistrations(); const newRegs: string[] = []; await Promise.all( @@ -115,7 +112,7 @@ export class FactRetrieverEngine { ); } - getJobRegistration(ref: string): FactRetrieverRegistration { + getJobRegistration(ref: string): Promise { return this.factRetrieverRegistry.get(ref); } diff --git a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts index 504d561f17..1ad7626e8e 100644 --- a/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts +++ b/plugins/tech-insights-backend/src/service/fact/FactRetrieverRegistry.ts @@ -26,16 +26,21 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; * */ export interface FactRetrieverRegistry { - readonly retrievers: Map; - register(registration: FactRetrieverRegistration): void; - get(retrieverReference: string): FactRetrieverRegistration; - listRetrievers(): FactRetriever[]; - listRegistrations(): FactRetrieverRegistration[]; - getSchemas(): FactSchema[]; + register(registration: FactRetrieverRegistration): Promise; + get(retrieverReference: string): Promise; + listRetrievers(): Promise; + listRegistrations(): Promise; + getSchemas(): Promise; } +/** + * A basic in memory fact retriever registry. + * + * You can replace this with a persistance based version using the FactRetrieverRegistry interface. + * + */ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { - readonly retrievers = new Map(); + private readonly retrievers = new Map(); constructor(retrievers: FactRetrieverRegistration[]) { retrievers.forEach(it => { @@ -50,27 +55,31 @@ export class DefaultFactRetrieverRegistry implements FactRetrieverRegistry { ); } this.retrievers.set(registration.factRetriever.id, registration); + return Promise.resolve(); } - get(retrieverReference: string): FactRetrieverRegistration { + get(retrieverReference: string): Promise { const registration = this.retrievers.get(retrieverReference); if (!registration) { throw new NotFoundError( `Tech insight fact retriever with identifier '${retrieverReference}' is not registered.`, ); } - return registration; + return Promise.resolve(registration); } - listRetrievers(): FactRetriever[] { - return [...this.retrievers.values()].map(it => it.factRetriever); + listRetrievers(): Promise { + return Promise.resolve( + [...this.retrievers.values()].map(it => it.factRetriever), + ); } - listRegistrations(): FactRetrieverRegistration[] { - return [...this.retrievers.values()]; + listRegistrations(): Promise { + return Promise.resolve([...this.retrievers.values()]); } - getSchemas(): FactSchema[] { - return this.listRetrievers().map(it => it.schema); + async getSchemas(): Promise { + const retrievers = await this.listRetrievers(); + return Promise.resolve(retrievers.map(it => it.schema)); } }