diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts index b32cf7bd7a..3aff8cbbb7 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.test.ts @@ -196,7 +196,7 @@ describe('DefaultTechDocsCollatorFactory', () => { it('should filter catalog entities when a custom filter is set', async () => { factory = DefaultTechDocsCollatorFactory.fromConfig(config, { ...options, - entityFilter: entities => + entityFilterFunction: entities => entities.filter(entity => entity.kind !== 'Component'), }); collator = await factory.getCollator(); diff --git a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts index fb8393898a..2890610c03 100644 --- a/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts +++ b/plugins/search-backend-module-techdocs/src/collators/DefaultTechDocsCollatorFactory.ts @@ -22,6 +22,7 @@ import { CATALOG_FILTER_EXISTS, CatalogApi, CatalogClient, + EntityFilterQuery, } from '@backstage/catalog-client'; import { Entity, @@ -68,7 +69,8 @@ export type TechDocsCollatorFactoryOptions = { legacyPathCasing?: boolean; entityTransformer?: TechDocsCollatorEntityTransformer; documentTransformer?: TechDocsCollatorDocumentTransformer; - entityFilter?: (entity: Entity[]) => Entity[]; + entityFilterFunction?: (entity: Entity[]) => Entity[]; + customCatalogApiFilters?: EntityFilterQuery; }; type EntityInfo = { @@ -98,7 +100,8 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { private readonly legacyPathCasing: boolean; private entityTransformer: TechDocsCollatorEntityTransformer; private documentTransformer: TechDocsCollatorDocumentTransformer; - private entityFilter: Function | undefined; + private entityFilterFunction: Function | undefined; + private customCatalogApiFilters: EntityFilterQuery | undefined; private constructor(options: TechDocsCollatorFactoryOptions) { this.discovery = options.discovery; @@ -112,7 +115,8 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { this.legacyPathCasing = options.legacyPathCasing ?? false; this.entityTransformer = options.entityTransformer ?? (() => ({})); this.documentTransformer = options.documentTransformer ?? (() => ({})); - this.entityFilter = options.entityFilter; + this.entityFilterFunction = options.entityFilterFunction; + this.customCatalogApiFilters = options.customCatalogApiFilters; this.auth = createLegacyAuthAdapters({ auth: options.auth, @@ -168,6 +172,7 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { filter: { 'metadata.annotations.backstage.io/techdocs-ref': CATALOG_FILTER_EXISTS, + ...this.customCatalogApiFilters, }, limit: batchSize, offset: entitiesRetrieved, @@ -180,8 +185,8 @@ export class DefaultTechDocsCollatorFactory implements DocumentCollatorFactory { moreEntitiesToGet = entities.length === batchSize; entitiesRetrieved += entities.length; - const filteredEntities = this.entityFilter - ? this.entityFilter(entities) + const filteredEntities = this.entityFilterFunction + ? this.entityFilterFunction(entities) : this.defaultFilteringFunction(entities); const docPromises = filteredEntities.map((entity: Entity) => diff --git a/plugins/search-backend-module-techdocs/src/module.ts b/plugins/search-backend-module-techdocs/src/module.ts index 68749a21ab..2888b9527b 100644 --- a/plugins/search-backend-module-techdocs/src/module.ts +++ b/plugins/search-backend-module-techdocs/src/module.ts @@ -25,6 +25,7 @@ import { createExtensionPoint, readSchedulerServiceTaskScheduleDefinitionFromConfig, } from '@backstage/backend-plugin-api'; +import { EntityFilterQuery } from '@backstage/catalog-client'; import { Entity } from '@backstage/catalog-model'; import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; import { @@ -54,7 +55,10 @@ export const techdocsCollatorEntityTransformerExtensionPoint = /** @public */ export interface TechDocsCollatorEntityFilterExtensionPoint { - setEntityFilter(filterFunction: (entities: Entity[]) => Entity[]): void; + setEntityFilterFunction( + filterFunction: (entities: Entity[]) => Entity[], + ): void; + setCustomCatalogApiFilters(apiFilters: EntityFilterQuery): void; } /** @@ -77,7 +81,8 @@ export default createBackendModule({ register(env) { let entityTransformer: TechDocsCollatorEntityTransformer | undefined; let documentTransformer: TechDocsCollatorDocumentTransformer | undefined; - let entityFilter: ((e: Entity[]) => Entity[]) | undefined; + let entityFilterFunction: ((e: Entity[]) => Entity[]) | undefined; + let customCatalogApiFilters: EntityFilterQuery | undefined; env.registerExtensionPoint( techdocsCollatorEntityTransformerExtensionPoint, @@ -102,11 +107,21 @@ export default createBackendModule({ ); env.registerExtensionPoint(techDocsCollatorEntityFilterExtensionPoint, { - setEntityFilter(newEntityFilter) { - if (entityFilter) { - throw new Error('TechDocs entity filters may only be set once'); + setEntityFilterFunction(newEntityFilterFunction) { + if (entityFilterFunction) { + throw new Error( + 'TechDocs entity filter functions may only be set once', + ); } - entityFilter = newEntityFilter; + entityFilterFunction = newEntityFilterFunction; + }, + setCustomCatalogApiFilters(newCatalogApiFilters) { + if (customCatalogApiFilters) { + throw new Error( + 'TechDocs catalog entity filters may only be set once', + ); + } + customCatalogApiFilters = newCatalogApiFilters; }, }); @@ -153,7 +168,8 @@ export default createBackendModule({ catalogClient: catalog, entityTransformer, documentTransformer, - entityFilter, + customCatalogApiFilters, + entityFilterFunction, }), }); },