Make FactRetrieverRegistry async so that a db backed implementation can be used

Signed-off-by: sblausten <sam@roadie.io>
This commit is contained in:
sblausten
2022-07-05 17:39:26 +02:00
parent b7ef3ec2f6
commit 6c194b58eb
3 changed files with 29 additions and 25 deletions
@@ -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);
@@ -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<FactRetrieverRegistration> {
return this.factRetrieverRegistry.get(ref);
}
@@ -26,16 +26,21 @@ import { ConflictError, NotFoundError } from '@backstage/errors';
*
*/
export interface FactRetrieverRegistry {
readonly retrievers: Map<string, FactRetrieverRegistration>;
register(registration: FactRetrieverRegistration): void;
get(retrieverReference: string): FactRetrieverRegistration;
listRetrievers(): FactRetriever[];
listRegistrations(): FactRetrieverRegistration[];
getSchemas(): FactSchema[];
register(registration: FactRetrieverRegistration): Promise<void>;
get(retrieverReference: string): Promise<FactRetrieverRegistration>;
listRetrievers(): Promise<FactRetriever[]>;
listRegistrations(): Promise<FactRetrieverRegistration[]>;
getSchemas(): Promise<FactSchema[]>;
}
/**
* 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<string, FactRetrieverRegistration>();
private readonly retrievers = new Map<string, FactRetrieverRegistration>();
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<FactRetrieverRegistration> {
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<FactRetriever[]> {
return Promise.resolve(
[...this.retrievers.values()].map(it => it.factRetriever),
);
}
listRegistrations(): FactRetrieverRegistration[] {
return [...this.retrievers.values()];
listRegistrations(): Promise<FactRetrieverRegistration[]> {
return Promise.resolve([...this.retrievers.values()]);
}
getSchemas(): FactSchema[] {
return this.listRetrievers().map(it => it.schema);
async getSchemas(): Promise<FactSchema[]> {
const retrievers = await this.listRetrievers();
return Promise.resolve(retrievers.map(it => it.schema));
}
}