more filter options

Signed-off-by: Bond Yan <bondy@spotify.com>
This commit is contained in:
Bond Yan
2025-02-10 17:12:20 -05:00
parent d32bdc47fa
commit e8df7baa63
3 changed files with 34 additions and 13 deletions
@@ -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();
@@ -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) =>
@@ -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,
}),
});
},