From 97e5d514d17350eb31f5cc9c7e282766da4a01e0 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Wed, 1 Mar 2023 21:47:19 +0100 Subject: [PATCH] create backend modules for search engines Signed-off-by: Emma Indal --- packages/backend-next/src/index.ts | 10 ++++++ .../src/engines/ElasticSearchSearchEngine.ts | 32 ++++++++++++++++++- .../src/engines/index.ts | 1 + .../src/index.ts | 1 + .../src/PgSearchEngine/PgSearchEngine.ts | 26 +++++++++++++++ .../src/PgSearchEngine/index.ts | 2 +- .../src/engines/LunrSearchEngine.ts | 24 ++++++++++++++ .../search-backend-node/src/engines/index.ts | 2 +- plugins/search-backend-node/src/index.ts | 2 +- plugins/search-backend/src/index.ts | 4 +-- 10 files changed, 97 insertions(+), 7 deletions(-) diff --git a/packages/backend-next/src/index.ts b/packages/backend-next/src/index.ts index 8f8984b192..ff7e5aa3db 100644 --- a/packages/backend-next/src/index.ts +++ b/packages/backend-next/src/index.ts @@ -20,6 +20,10 @@ import { createBackend } from '@backstage/backend-defaults'; import { appPlugin } from '@backstage/plugin-app-backend/alpha'; import { todoPlugin } from '@backstage/plugin-todo-backend'; import { techdocsPlugin } from '@backstage/plugin-techdocs-backend/alpha'; +import { searchPlugin } from '@backstage/plugin-search-backend'; +import { elasticSearchEngineModule } from '@backstage/plugin-search-backend-module-elasticsearch'; +import { pgSearchEngineModule } from '@backstage/plugin-search-backend-module-pg'; +import { lunrSearchEngineModule } from '@backstage/plugin-search-backend-node/'; const backend = createBackend(); @@ -28,4 +32,10 @@ backend.add(catalogModuleTemplateKind()); backend.add(appPlugin({ appPackageName: 'example-app' })); backend.add(todoPlugin()); backend.add(techdocsPlugin()); + +backend.add(searchPlugin()); +backend.add(elasticSearchEngineModule()); +backend.add(pgSearchEngineModule()); +backend.add(lunrSearchEngineModule()); + backend.start(); diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index 25df3101de..bbeceabaa6 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -30,9 +30,17 @@ import { ElasticSearchClientWrapper } from './ElasticSearchClientWrapper'; import { ElasticSearchCustomIndexTemplate } from './types'; import { ElasticSearchSearchEngineIndexer } from './ElasticSearchSearchEngineIndexer'; import { Logger } from 'winston'; -import { MissingIndexError } from '@backstage/plugin-search-backend-node'; +import { + MissingIndexError, + searchEngineRegistryExtensionPoint, +} from '@backstage/plugin-search-backend-node'; import esb from 'elastic-builder'; import { v4 as uuid } from 'uuid'; +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; export type { ElasticSearchClientOptions }; @@ -521,3 +529,25 @@ export async function createElasticSearchClientOptions( : {}), }; } + +export const elasticSearchEngineModule = createBackendModule({ + moduleId: 'elasticSearchEngineModule', + pluginId: 'search-backend', + register(env) { + env.registerInit({ + deps: { + searchEngineRegistry: searchEngineRegistryExtensionPoint, + logger: coreServices.logger, + config: coreServices.config, + }, + async init({ searchEngineRegistry, logger, config }) { + searchEngineRegistry.setSearchEngine( + await ElasticSearchSearchEngine.fromConfig({ + logger: loggerToWinstonLogger(logger), + config: config, + }), + ); + }, + }); + }, +}); diff --git a/plugins/search-backend-module-elasticsearch/src/engines/index.ts b/plugins/search-backend-module-elasticsearch/src/engines/index.ts index cb24bdc56a..01f77034a0 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/index.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/index.ts @@ -17,6 +17,7 @@ export { decodePageCursor as decodeElasticSearchPageCursor, ElasticSearchSearchEngine, + elasticSearchEngineModule, } from './ElasticSearchSearchEngine'; export { isOpenSearchCompatible } from './ElasticSearchClientOptions'; export type { diff --git a/plugins/search-backend-module-elasticsearch/src/index.ts b/plugins/search-backend-module-elasticsearch/src/index.ts index e0b05014cc..acff595246 100644 --- a/plugins/search-backend-module-elasticsearch/src/index.ts +++ b/plugins/search-backend-module-elasticsearch/src/index.ts @@ -23,6 +23,7 @@ export { decodeElasticSearchPageCursor, ElasticSearchSearchEngine, + elasticSearchEngineModule, isOpenSearchCompatible, } from './engines'; export type { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index d2cf80e0ca..7f1bb89754 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -30,6 +30,11 @@ import { import { v4 as uuid } from 'uuid'; import { Logger } from 'winston'; import { Config } from '@backstage/config'; +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { searchEngineRegistryExtensionPoint } from '@backstage/plugin-search-backend-node'; /** * Search query that the Postgres search engine understands. @@ -244,3 +249,24 @@ export function decodePageCursor(pageCursor?: string): { page: number } { export function encodePageCursor({ page }: { page: number }): string { return Buffer.from(`${page}`, 'utf-8').toString('base64'); } + +export const pgSearchEngineModule = createBackendModule({ + moduleId: 'pgSearchEngineModule', + pluginId: 'search-backend', + register(env) { + env.registerInit({ + deps: { + searchEngineRegistry: searchEngineRegistryExtensionPoint, + database: coreServices.database, + config: coreServices.config, + }, + async init({ searchEngineRegistry, database, config }) { + searchEngineRegistry.setSearchEngine( + await PgSearchEngine.fromConfig(config, { + database: database, + }), + ); + }, + }); + }, +}); diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/index.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/index.ts index e62e709f26..7a90d9e3f7 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/index.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -export { PgSearchEngine } from './PgSearchEngine'; +export { PgSearchEngine, pgSearchEngineModule } from './PgSearchEngine'; export type { ConcretePgSearchQuery, PgSearchQueryTranslatorOptions, diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index b69b5ea863..0db9051e84 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -26,6 +26,12 @@ import lunr from 'lunr'; import { v4 as uuid } from 'uuid'; import { Logger } from 'winston'; import { LunrSearchEngineIndexer } from './LunrSearchEngineIndexer'; +import { + coreServices, + createBackendModule, +} from '@backstage/backend-plugin-api'; +import { searchEngineRegistryExtensionPoint } from '../extensions'; +import { loggerToWinstonLogger } from '@backstage/backend-common'; /** * Type of translated query for the Lunr Search Engine. @@ -334,3 +340,21 @@ export function parseHighlightFields({ }), ); } + +export const lunrSearchEngineModule = createBackendModule({ + moduleId: 'lunrSearchEngineModule', + pluginId: 'search-backend', + register(env) { + env.registerInit({ + deps: { + searchEngineRegistry: searchEngineRegistryExtensionPoint, + logger: coreServices.logger, + }, + async init({ searchEngineRegistry, logger }) { + searchEngineRegistry.setSearchEngine( + new LunrSearchEngine({ logger: loggerToWinstonLogger(logger) }), + ); + }, + }); + }, +}); diff --git a/plugins/search-backend-node/src/engines/index.ts b/plugins/search-backend-node/src/engines/index.ts index 0d710eadc2..59aa4a24b0 100644 --- a/plugins/search-backend-node/src/engines/index.ts +++ b/plugins/search-backend-node/src/engines/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -export { LunrSearchEngine } from './LunrSearchEngine'; +export { LunrSearchEngine, lunrSearchEngineModule } from './LunrSearchEngine'; export type { ConcreteLunrQuery, LunrQueryTranslator, diff --git a/plugins/search-backend-node/src/index.ts b/plugins/search-backend-node/src/index.ts index 741410f7f8..7395036672 100644 --- a/plugins/search-backend-node/src/index.ts +++ b/plugins/search-backend-node/src/index.ts @@ -23,7 +23,7 @@ export { IndexBuilder } from './IndexBuilder'; export { Scheduler } from './Scheduler'; export * from './collators'; -export { LunrSearchEngine } from './engines'; +export { LunrSearchEngine, lunrSearchEngineModule } from './engines'; export type { ConcreteLunrQuery, LunrQueryTranslator, diff --git a/plugins/search-backend/src/index.ts b/plugins/search-backend/src/index.ts index 0775a64378..335841d383 100644 --- a/plugins/search-backend/src/index.ts +++ b/plugins/search-backend/src/index.ts @@ -21,6 +21,4 @@ */ export * from './service/router'; - -// TODO: export as alfa subpath -export { searchPlugin } from './plugin'; +export * from './plugin';