diff --git a/.changeset/fluffy-peas-care.md b/.changeset/fluffy-peas-care.md index 6873551eb6..15c0b44ca5 100644 --- a/.changeset/fluffy-peas-care.md +++ b/.changeset/fluffy-peas-care.md @@ -1,5 +1,6 @@ --- '@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-techdocs': patch --- -Modify TechDocsCollator to be aware of new TechDocs URL pattern +Modify TechDocsCollator to be aware of new TechDocs URL pattern. Modify tech docs in context search to use correct casing when creating initial filter. diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 219bb7e0c9..68380935d9 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -73,7 +73,7 @@ export default async function createPlugin({ indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultTechDocsCollator({ + collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, legacyPathCasing: diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index e83491448a..283fdb0e1b 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -21,6 +21,7 @@ import fetch from 'cross-fetch'; import unescape from 'lodash/unescape'; import { Logger } from 'winston'; import pLimit from 'p-limit'; +import { Config } from '@backstage/config'; import { CatalogApi, CatalogClient } from '@backstage/catalog-client'; import { TechDocsDocument } from '@backstage/techdocs-common'; @@ -30,6 +31,21 @@ interface MkSearchIndexDoc { location: string; } +type TechDocsCollatorOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; + locationTemplate?: string; + catalogClient?: CatalogApi; + parallelismLimit?: number; + legacyPathCasing?: boolean; +}; + +type EntityInfo = { + name: string; + namespace: string; + kind: string; +}; + export class DefaultTechDocsCollator implements DocumentCollator { protected discovery: PluginEndpointDiscovery; protected locationTemplate: string; @@ -39,6 +55,9 @@ export class DefaultTechDocsCollator implements DocumentCollator { private readonly legacyPathCasing: boolean; public readonly type: string = 'techdocs'; + /** + * @deprecated use static fromConfig method instead. + */ constructor({ discovery, locationTemplate, @@ -46,14 +65,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { catalogClient, parallelismLimit = 10, legacyPathCasing = false, - }: { - discovery: PluginEndpointDiscovery; - logger: Logger; - locationTemplate?: string; - catalogClient?: CatalogApi; - parallelismLimit?: number; - legacyPathCasing?: boolean; - }) { + }: TechDocsCollatorOptions) { this.discovery = discovery; this.locationTemplate = locationTemplate || '/docs/:namespace/:kind/:name/:path'; @@ -64,6 +76,10 @@ export class DefaultTechDocsCollator implements DocumentCollator { this.legacyPathCasing = legacyPathCasing; } + static fromConfig(_config: Config, options: TechDocsCollatorOptions) { + return new DefaultTechDocsCollator(options); + } + async execute() { const limit = pLimit(this.parallelismLimit); const techDocsBaseUrl = await this.discovery.getBaseUrl('techdocs'); @@ -83,13 +99,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { .filter(it => it.metadata?.annotations?.['backstage.io/techdocs-ref']) .map((entity: Entity) => limit(async (): Promise => { - const entityInfo = { - kind: this.legacyPathCasing - ? entity.kind - : entity.kind.toLowerCase(), - namespace: entity.metadata.namespace || 'default', - name: entity.metadata.name, - }; + const entityInfo = DefaultTechDocsCollator.handleEntityInfoCasing( + this.legacyPathCasing, + { + kind: entity.kind, + namespace: entity.metadata.namespace || 'default', + name: entity.metadata.name, + }, + ); try { const searchIndexResponse = await fetch( @@ -144,4 +161,15 @@ export class DefaultTechDocsCollator implements DocumentCollator { ) { return `${techDocsBaseUrl}/static/docs/${entityInfo.namespace}/${entityInfo.kind}/${entityInfo.name}/search/search_index.json`; } + + private static handleEntityInfoCasing( + legacyPaths: boolean, + entityInfo: EntityInfo, + ): EntityInfo { + return legacyPaths + ? entityInfo + : Object.entries(entityInfo).reduce((acc, [key, value]) => { + return { ...acc, [key]: value.toLowerCase() }; + }, {} as EntityInfo); + } }