diff --git a/.changeset/rude-pumas-draw.md b/.changeset/rude-pumas-draw.md new file mode 100644 index 0000000000..e36d1dd997 --- /dev/null +++ b/.changeset/rude-pumas-draw.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +Expose optional `persistenceContext` on `TechInsights` construction to enable integrators to provide their own database implementations for fact handling. diff --git a/plugins/tech-insights-backend/api-report.md b/plugins/tech-insights-backend/api-report.md index 8dc8efbb24..a757f0d67c 100644 --- a/plugins/tech-insights-backend/api-report.md +++ b/plugins/tech-insights-backend/api-report.md @@ -77,11 +77,22 @@ export interface FactRetrieverRegistry { register(registration: FactRetrieverRegistration): Promise; } +// @public +export const initializePersistenceContext: ( + database: PluginDatabaseManager, + options?: PersistenceContextOptions, +) => Promise; + // @public export type PersistenceContext = { techInsightsStore: TechInsightsStore; }; +// @public +export type PersistenceContextOptions = { + logger: Logger; +}; + // @public export interface RouterOptions< CheckType extends TechInsightCheck, @@ -122,6 +133,7 @@ export interface TechInsightsOptions< factRetrievers?: FactRetrieverRegistration[]; // (undocumented) logger: Logger; + persistenceContext?: PersistenceContext; // (undocumented) scheduler: PluginTaskScheduler; // (undocumented) diff --git a/plugins/tech-insights-backend/src/index.ts b/plugins/tech-insights-backend/src/index.ts index 28a922cd67..e9e037cce1 100644 --- a/plugins/tech-insights-backend/src/index.ts +++ b/plugins/tech-insights-backend/src/index.ts @@ -18,12 +18,16 @@ export * from './service/router'; export type { RouterOptions } from './service/router'; export { buildTechInsightsContext } from './service/techInsightsContextBuilder'; +export { initializePersistenceContext } from './service/persistence/persistenceContext'; export type { TechInsightsOptions, TechInsightsContext, } from './service/techInsightsContextBuilder'; export type { FactRetrieverEngine } from './service/fact/FactRetrieverEngine'; -export type { PersistenceContext } from './service/persistence/persistenceContext'; +export type { + PersistenceContext, + PersistenceContextOptions, +} from './service/persistence/persistenceContext'; export { createFactRetrieverRegistration } from './service/fact/createFactRetriever'; export type { FactRetrieverRegistry } from './service/fact/FactRetrieverRegistry'; export type { FactRetrieverRegistrationOptions } from './service/fact/createFactRetriever'; diff --git a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts index c6751e864a..0b14f80843 100644 --- a/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts +++ b/plugins/tech-insights-backend/src/service/persistence/TechInsightsDatabase.ts @@ -46,6 +46,11 @@ type RawDbFactSchemaRow = { entityFilter?: string; }; +/** + * Default TechInsightsDatabase implementation. + * + * @internal + */ export class TechInsightsDatabase implements TechInsightsStore { private readonly CHUNK_SIZE = 50; diff --git a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts index 575ee67bdf..07badb038c 100644 --- a/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts +++ b/plugins/tech-insights-backend/src/service/persistence/persistenceContext.ts @@ -36,22 +36,27 @@ export type PersistenceContext = { techInsightsStore: TechInsightsStore; }; -export type CreateDatabaseOptions = { +/** + * A Container for persistence context initialization options + * + * @public + */ +export type PersistenceContextOptions = { logger: Logger; }; -const defaultOptions: CreateDatabaseOptions = { +const defaultOptions: PersistenceContextOptions = { logger: getVoidLogger(), }; /** - * A factory method to construct persistence context for running implementation. + * A factory function to construct persistence context for running implementation. * * @public */ export const initializePersistenceContext = async ( database: PluginDatabaseManager, - options: CreateDatabaseOptions = defaultOptions, + options: PersistenceContextOptions = defaultOptions, ): Promise => { const client = await database.getClient(); diff --git a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts index f85d99b2a8..20693d0a7d 100644 --- a/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts +++ b/plugins/tech-insights-backend/src/service/techInsightsContextBuilder.ts @@ -74,6 +74,12 @@ export interface TechInsightsOptions< */ factRetrieverRegistry?: FactRetrieverRegistry; + /** + * Optional persistenceContext implementation that replaces the default one. + * This can be used to replace underlying database with a more suitable implementation if needed + */ + persistenceContext?: PersistenceContext; + logger: Logger; config: Config; discovery: PluginEndpointDiscovery; @@ -139,9 +145,11 @@ export const buildTechInsightsContext = async < const factRetrieverRegistry = buildFactRetrieverRegistry(); - const persistenceContext = await initializePersistenceContext(database, { - logger, - }); + const persistenceContext = + options.persistenceContext ?? + (await initializePersistenceContext(database, { + logger, + })); const factRetrieverEngine = await DefaultFactRetrieverEngine.create({ scheduler,