diff --git a/.changeset/twelve-shirts-buy.md b/.changeset/twelve-shirts-buy.md new file mode 100644 index 0000000000..6183c7dabd --- /dev/null +++ b/.changeset/twelve-shirts-buy.md @@ -0,0 +1,15 @@ +--- +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-catalog-node': patch +--- + +Add support for `onProcessingError` handler at the catalog plugin (new backend system). + +You can use `setOnProcessingErrorHandler` at the `catalogProcessingExtensionPoint` +as replacement for + +```ts +catalogBuilder.subscribe({ + onProcessingError: hander, +}); +``` diff --git a/plugins/catalog-backend/src/service/CatalogPlugin.ts b/plugins/catalog-backend/src/service/CatalogPlugin.ts index 0800d41340..538fe4a69e 100644 --- a/plugins/catalog-backend/src/service/CatalogPlugin.ts +++ b/plugins/catalog-backend/src/service/CatalogPlugin.ts @@ -17,6 +17,7 @@ import { createBackendPlugin, coreServices, } from '@backstage/backend-plugin-api'; +import { Entity } from '@backstage/catalog-model'; import { CatalogBuilder, CatalogPermissionRuleInput } from './CatalogBuilder'; import { CatalogAnalysisExtensionPoint, @@ -40,6 +41,10 @@ class CatalogProcessingExtensionPointImpl #processors = new Array(); #entityProviders = new Array(); #placeholderResolvers: Record = {}; + #onProcessingErrorHandler?: (event: { + unprocessedEntity: Entity; + errors: Error[]; + }) => Promise | void; addProcessor( ...processors: Array> @@ -61,6 +66,15 @@ class CatalogProcessingExtensionPointImpl this.#placeholderResolvers[key] = resolver; } + setOnProcessingErrorHandler( + handler: (event: { + unprocessedEntity: Entity; + errors: Error[]; + }) => Promise | void, + ) { + this.#onProcessingErrorHandler = handler; + } + get processors() { return this.#processors; } @@ -72,6 +86,10 @@ class CatalogProcessingExtensionPointImpl get placeholderResolvers() { return this.#placeholderResolvers; } + + get onProcessingErrorHandler() { + return this.#onProcessingErrorHandler; + } } class CatalogAnalysisExtensionPointImpl @@ -162,6 +180,11 @@ export const catalogPlugin = createBackendPlugin({ scheduler, logger: winstonLogger, }); + if (processingExtensions.onProcessingErrorHandler) { + builder.subscribe({ + onProcessingError: processingExtensions.onProcessingErrorHandler, + }); + } builder.addProcessor(...processingExtensions.processors); builder.addEntityProvider(...processingExtensions.entityProviders); Object.entries(processingExtensions.placeholderResolvers).forEach( diff --git a/plugins/catalog-node/api-report-alpha.md b/plugins/catalog-node/api-report-alpha.md index 74339b1bc9..5be4b114c0 100644 --- a/plugins/catalog-node/api-report-alpha.md +++ b/plugins/catalog-node/api-report-alpha.md @@ -54,6 +54,13 @@ export interface CatalogProcessingExtensionPoint { addProcessor( ...processors: Array> ): void; + // (undocumented) + setOnProcessingErrorHandler( + handler: (event: { + unprocessedEntity: Entity; + errors: Error[]; + }) => Promise | void, + ): void; } // @alpha (undocumented) diff --git a/plugins/catalog-node/src/extensions.ts b/plugins/catalog-node/src/extensions.ts index 7aa9264030..e2ee1b4f4b 100644 --- a/plugins/catalog-node/src/extensions.ts +++ b/plugins/catalog-node/src/extensions.ts @@ -37,6 +37,12 @@ export interface CatalogProcessingExtensionPoint { ...providers: Array> ): void; addPlaceholderResolver(key: string, resolver: PlaceholderResolver): void; + setOnProcessingErrorHandler( + handler: (event: { + unprocessedEntity: Entity; + errors: Error[]; + }) => Promise | void, + ): void; } /**