Make FactRetrieverRegistry async so that a db backed implementation can be used
Signed-off-by: sblausten <sam@roadie.io>
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user