@drodil/backstage-plugin-search-backend-module-qeta 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # backstage-plugin-search-backend-module-qeta
2
+
3
+ This package exports a module that extends the search backend to also indexing the tools exposed
4
+ by the [`qeta` service](https://github.com/drodil/backstage-plugin-qeta/tree/main/plugins/qeta-backend).
5
+
6
+ ## Installation
7
+
8
+ Add the module package as a dependency:
9
+
10
+ ```bash
11
+ # From your Backstage root directory
12
+ yarn add --cwd packages/backend @drodil/backstage-plugin-search-backend-module-qeta
13
+ ```
14
+
15
+ Add the collator to your backend instance, along with the search plugin itself:
16
+
17
+ ```tsx
18
+ // packages/backend/src/index.ts
19
+ import { createBackend } from '@backstage/backend-defaults';
20
+ import { searchPlugin } from '@backstage/plugin-search-backend/alpha';
21
+ import { searchModuleExploreCollator } from '@backstage/plugin-search-backend-module-explore/alpha';
22
+
23
+ const backend = createBackend();
24
+ backend.add(searchPlugin());
25
+ backend.add(searchModuleQetaCollator());
26
+ backend.start();
27
+ ```
28
+
29
+ You may also want to add configuration parameters to your app-config, for example for controlling the scheduled
30
+ indexing interval. These parameters should be placed under the `search.collators.qeta` key.
31
+ See [the config definition file](https://github.com/drodil/backstage-plugin-qeta/blob/master/plugins/search-backend-module-qeta/config.d.ts)
32
+ for more details.
33
+
34
+ ## Using Auth Middleware
35
+
36
+ If your Backstage instance uses service-to-service authentication, the collator will need to have access to a `tokenManager`.
37
+ This is automatically injected by the collator module when using the new backend system.
38
+ But if you are using the old backend system, you will want to add it manually to ensure that the collator makes
39
+ authenticated requests to the explore backend.
40
+
41
+ ```tsx
42
+ indexBuilder.addCollator({
43
+ schedule: every10MinutesSchedule,
44
+ factory: DefaultQetaCollatorFactory.fromConfig(env.config, {
45
+ discovery: env.discovery,
46
+ logger: env.logger,
47
+ tokenManager: env.tokenManager,
48
+ }),
49
+ });
50
+ ```
package/config.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { TaskScheduleDefinitionConfig } from '@backstage/backend-tasks';
2
+
3
+ export interface Config {
4
+ search?: {
5
+ collators?: {
6
+ /**
7
+ * Configuration options for `@backstage/plugin-search-backend-module-explore`
8
+ */
9
+ qeta?: {
10
+ /**
11
+ * The schedule for how often to run the collation job.
12
+ */
13
+ schedule?: TaskScheduleDefinitionConfig;
14
+ };
15
+ };
16
+ };
17
+ }
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var backendPluginApi = require('@backstage/backend-plugin-api');
6
+ var alpha = require('@backstage/plugin-search-backend-node/alpha');
7
+ var backendTasks = require('@backstage/backend-tasks');
8
+ var errors = require('@backstage/errors');
9
+ var stream = require('stream');
10
+
11
+ const configKey = "search.collators.qeta";
12
+ const defaults = {
13
+ schedule: {
14
+ frequency: { minutes: 10 },
15
+ timeout: { minutes: 15 },
16
+ initialDelay: { seconds: 3 }
17
+ }
18
+ };
19
+ function readScheduleConfigOptions(configRoot) {
20
+ let schedule = void 0;
21
+ const config = configRoot.getOptionalConfig(configKey);
22
+ if (config) {
23
+ const scheduleConfig = config.getOptionalConfig("schedule");
24
+ if (scheduleConfig) {
25
+ try {
26
+ schedule = backendTasks.readTaskScheduleDefinitionFromConfig(scheduleConfig);
27
+ } catch (error) {
28
+ throw new errors.InputError(`Invalid schedule at ${configKey}, ${error}`);
29
+ }
30
+ }
31
+ }
32
+ return schedule != null ? schedule : defaults.schedule;
33
+ }
34
+
35
+ var __defProp = Object.defineProperty;
36
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
37
+ var __publicField = (obj, key, value) => {
38
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
39
+ return value;
40
+ };
41
+ class DefaultQetaCollatorFactory {
42
+ constructor(_config, options) {
43
+ __publicField(this, "type", "qeta");
44
+ __publicField(this, "logger");
45
+ __publicField(this, "discovery");
46
+ __publicField(this, "tokenManager");
47
+ this.logger = options.logger;
48
+ this.discovery = options.discovery;
49
+ this.tokenManager = options.tokenManager;
50
+ }
51
+ static fromConfig(config, options) {
52
+ return new DefaultQetaCollatorFactory(config, options);
53
+ }
54
+ async getCollator() {
55
+ return stream.Readable.from(this.execute());
56
+ }
57
+ async *execute() {
58
+ var _a, _b, _c;
59
+ this.logger.info("Executing QetaCollator");
60
+ let headers = {};
61
+ if (this.tokenManager) {
62
+ const { token } = await this.tokenManager.getToken();
63
+ headers = {
64
+ Authorization: `Bearer ${token}`
65
+ };
66
+ }
67
+ const baseUrl = await this.discovery.getBaseUrl("qeta");
68
+ const params = new URLSearchParams();
69
+ params.append("includeAnswers", "true");
70
+ params.append("includeComments", "true");
71
+ const response = await fetch(
72
+ `${baseUrl}/questions?${params.toString()}`,
73
+ headers
74
+ );
75
+ const data = await response.json();
76
+ if ("errors" in data) {
77
+ this.logger.error(
78
+ `Error while fetching questions from qeta: ${JSON.stringify(
79
+ data.errors
80
+ )}`
81
+ );
82
+ return;
83
+ }
84
+ const questions = data.questions;
85
+ this.logger.info(`Indexing ${questions.length} questions`);
86
+ for (const question of questions) {
87
+ yield {
88
+ title: question.title,
89
+ text: question.content,
90
+ location: `/qeta/questions/${question.id}`,
91
+ docType: "qeta",
92
+ author: question.author,
93
+ score: question.score,
94
+ answerCount: question.answersCount,
95
+ views: question.views,
96
+ tags: question.tags
97
+ };
98
+ for (const answer of (_a = question.answers) != null ? _a : []) {
99
+ yield {
100
+ title: `Answer for ${question.title}`,
101
+ text: answer.content,
102
+ location: `/qeta/questions/${question.id}#answer_${answer.id}`,
103
+ docType: "qeta",
104
+ author: answer.author,
105
+ score: answer.score,
106
+ tags: question.tags
107
+ };
108
+ for (const comment of (_b = answer.comments) != null ? _b : []) {
109
+ yield {
110
+ title: `Comment for ${question.title}`,
111
+ text: comment.content,
112
+ location: `/qeta/questions/${question.id}#answer_${answer.id}`,
113
+ docType: "qeta",
114
+ author: comment.author,
115
+ score: answer.score,
116
+ tags: question.tags
117
+ };
118
+ }
119
+ }
120
+ for (const comment of (_c = question.comments) != null ? _c : []) {
121
+ yield {
122
+ title: `Comment for ${question.title}`,
123
+ text: comment.content,
124
+ location: `/qeta/questions/${question.id}`,
125
+ docType: "qeta",
126
+ author: comment.author,
127
+ score: question.score,
128
+ tags: question.tags
129
+ };
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
136
+ pluginId: "search",
137
+ moduleId: "qeta-collator",
138
+ register(reg) {
139
+ reg.registerInit({
140
+ deps: {
141
+ config: backendPluginApi.coreServices.rootConfig,
142
+ logger: backendPluginApi.coreServices.logger,
143
+ discovery: backendPluginApi.coreServices.discovery,
144
+ tokenManager: backendPluginApi.coreServices.tokenManager,
145
+ scheduler: backendPluginApi.coreServices.scheduler,
146
+ indexRegistry: alpha.searchIndexRegistryExtensionPoint
147
+ },
148
+ async init({
149
+ config,
150
+ logger,
151
+ discovery,
152
+ tokenManager,
153
+ scheduler,
154
+ indexRegistry
155
+ }) {
156
+ indexRegistry.addCollator({
157
+ schedule: scheduler.createScheduledTaskRunner(
158
+ readScheduleConfigOptions(config)
159
+ ),
160
+ factory: DefaultQetaCollatorFactory.fromConfig(config, {
161
+ discovery,
162
+ tokenManager,
163
+ logger
164
+ })
165
+ });
166
+ }
167
+ });
168
+ }
169
+ });
170
+
171
+ exports.DefaultQetaCollatorFactory = DefaultQetaCollatorFactory;
172
+ exports.searchModuleQetaCollator = searchModuleQetaCollator;
173
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/collators/config.ts","../src/collators/DefaultQetaCollatorFactory.ts","../src/module.ts"],"sourcesContent":["import { Config } from '@backstage/config';\nimport {\n readTaskScheduleDefinitionFromConfig,\n TaskScheduleDefinition,\n} from '@backstage/backend-tasks';\nimport { InputError } from '@backstage/errors';\n\nconst configKey = 'search.collators.qeta';\n\nexport const defaults = {\n schedule: {\n frequency: { minutes: 10 },\n timeout: { minutes: 15 },\n initialDelay: { seconds: 3 },\n },\n};\n\nexport function readScheduleConfigOptions(\n configRoot: Config,\n): TaskScheduleDefinition {\n let schedule: TaskScheduleDefinition | undefined = undefined;\n\n const config = configRoot.getOptionalConfig(configKey);\n if (config) {\n const scheduleConfig = config.getOptionalConfig('schedule');\n if (scheduleConfig) {\n try {\n schedule = readTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (error) {\n throw new InputError(`Invalid schedule at ${configKey}, ${error}`);\n }\n }\n }\n\n return schedule ?? defaults.schedule;\n}\n","import { Config } from '@backstage/config';\nimport {\n PluginEndpointDiscovery,\n TokenManager,\n} from '@backstage/backend-common';\nimport { Readable } from 'stream';\nimport { DocumentCollatorFactory } from '@backstage/plugin-search-common';\nimport {\n QetaDocument,\n QuestionsResponseBody,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport type QetaCollatorFactoryOptions = {\n logger: LoggerService;\n discovery: PluginEndpointDiscovery;\n tokenManager?: TokenManager;\n};\n\nexport class DefaultQetaCollatorFactory implements DocumentCollatorFactory {\n public readonly type: string = 'qeta';\n private readonly logger: LoggerService;\n private readonly discovery: PluginEndpointDiscovery;\n private readonly tokenManager?: TokenManager;\n\n private constructor(_config: Config, options: QetaCollatorFactoryOptions) {\n this.logger = options.logger;\n this.discovery = options.discovery;\n this.tokenManager = options.tokenManager;\n }\n\n static fromConfig(config: Config, options: QetaCollatorFactoryOptions) {\n return new DefaultQetaCollatorFactory(config, options);\n }\n\n async getCollator() {\n return Readable.from(this.execute());\n }\n\n async *execute(): AsyncGenerator<QetaDocument> {\n this.logger.info('Executing QetaCollator');\n let headers = {};\n\n if (this.tokenManager) {\n const { token } = await this.tokenManager.getToken();\n headers = {\n Authorization: `Bearer ${token}`,\n };\n }\n const baseUrl = await this.discovery.getBaseUrl('qeta');\n\n const params = new URLSearchParams();\n params.append('includeAnswers', 'true');\n params.append('includeComments', 'true');\n const response = await fetch(\n `${baseUrl}/questions?${params.toString()}`,\n headers,\n );\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n this.logger.error(\n `Error while fetching questions from qeta: ${JSON.stringify(\n data.errors,\n )}`,\n );\n return;\n }\n\n const questions = data.questions;\n\n this.logger.info(`Indexing ${questions.length} questions`);\n\n for (const question of questions) {\n yield {\n title: question.title,\n text: question.content,\n location: `/qeta/questions/${question.id}`,\n docType: 'qeta',\n author: question.author,\n score: question.score,\n answerCount: question.answersCount,\n views: question.views,\n tags: question.tags,\n };\n\n for (const answer of question.answers ?? []) {\n yield {\n title: `Answer for ${question.title}`,\n text: answer.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n author: answer.author,\n score: answer.score,\n tags: question.tags,\n };\n\n for (const comment of answer.comments ?? []) {\n yield {\n title: `Comment for ${question.title}`,\n text: comment.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n author: comment.author,\n score: answer.score,\n tags: question.tags,\n };\n }\n }\n\n for (const comment of question.comments ?? []) {\n yield {\n title: `Comment for ${question.title}`,\n text: comment.content,\n location: `/qeta/questions/${question.id}`,\n docType: 'qeta',\n author: comment.author,\n score: question.score,\n tags: question.tags,\n };\n }\n }\n }\n}\n","import {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { searchIndexRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha';\nimport { readScheduleConfigOptions } from './collators/config';\nimport { DefaultQetaCollatorFactory } from './collators/DefaultQetaCollatorFactory';\n\nexport const searchModuleQetaCollator = createBackendModule({\n pluginId: 'search',\n moduleId: 'qeta-collator',\n register(reg) {\n reg.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n scheduler: coreServices.scheduler,\n indexRegistry: searchIndexRegistryExtensionPoint,\n },\n async init({\n config,\n logger,\n discovery,\n tokenManager,\n scheduler,\n indexRegistry,\n }) {\n indexRegistry.addCollator({\n schedule: scheduler.createScheduledTaskRunner(\n readScheduleConfigOptions(config),\n ),\n factory: DefaultQetaCollatorFactory.fromConfig(config, {\n discovery,\n tokenManager,\n logger,\n }),\n });\n },\n });\n },\n});\n"],"names":["readTaskScheduleDefinitionFromConfig","InputError","Readable","createBackendModule","coreServices","searchIndexRegistryExtensionPoint"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" />
2
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
3
+ import { LoggerService } from '@backstage/backend-plugin-api';
4
+ import { Config } from '@backstage/config';
5
+ import { PluginEndpointDiscovery, TokenManager } from '@backstage/backend-common';
6
+ import { Readable } from 'stream';
7
+ import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
8
+ import { QetaDocument } from '@drodil/backstage-plugin-qeta-common';
9
+
10
+ declare const searchModuleQetaCollator: () => _backstage_backend_plugin_api.BackendFeature;
11
+
12
+ type QetaCollatorFactoryOptions = {
13
+ logger: LoggerService;
14
+ discovery: PluginEndpointDiscovery;
15
+ tokenManager?: TokenManager;
16
+ };
17
+ declare class DefaultQetaCollatorFactory implements DocumentCollatorFactory {
18
+ readonly type: string;
19
+ private readonly logger;
20
+ private readonly discovery;
21
+ private readonly tokenManager?;
22
+ private constructor();
23
+ static fromConfig(config: Config, options: QetaCollatorFactoryOptions): DefaultQetaCollatorFactory;
24
+ getCollator(): Promise<Readable>;
25
+ execute(): AsyncGenerator<QetaDocument>;
26
+ }
27
+
28
+ export { DefaultQetaCollatorFactory, searchModuleQetaCollator };
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@drodil/backstage-plugin-search-backend-module-qeta",
3
+ "description": "The qeta backend module for the search plugin.",
4
+ "keywords": [
5
+ "backstage",
6
+ "plugin",
7
+ "search",
8
+ "backstage.io"
9
+ ],
10
+ "version": "1.17.0",
11
+ "main": "dist/index.cjs.js",
12
+ "types": "dist/index.d.ts",
13
+ "prepublishOnly": "yarn tsc && yarn build",
14
+ "license": "MIT",
15
+ "homepage": "https://github.com/drodil/backstage-plugin-qeta",
16
+ "bugs": {
17
+ "url": "https://github.com/drodil/backstage-plugin-qeta/issues"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/drodil/backstage-plugin-qeta.git"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "main": "dist/index.cjs.js",
26
+ "types": "dist/index.d.ts"
27
+ },
28
+ "backstage": {
29
+ "role": "backend-plugin-module"
30
+ },
31
+ "scripts": {
32
+ "start": "backstage-cli package start",
33
+ "build": "backstage-cli package build",
34
+ "lint": "backstage-cli package lint",
35
+ "test": "backstage-cli package test",
36
+ "clean": "backstage-cli package clean",
37
+ "prepack": "backstage-cli package prepack",
38
+ "postpack": "backstage-cli package postpack",
39
+ "tsc": "tsc"
40
+ },
41
+ "dependencies": {
42
+ "@backstage/backend-common": "^0.20.0",
43
+ "@backstage/backend-plugin-api": "^0.6.8",
44
+ "@backstage/backend-tasks": "^0.5.13",
45
+ "@backstage/config": "^1.1.1",
46
+ "@backstage/core-plugin-api": "^1.8.1",
47
+ "@backstage/errors": "^1.2.3",
48
+ "@backstage/plugin-search-backend-node": "^1.2.12",
49
+ "@backstage/plugin-search-common": "^1.2.9",
50
+ "@drodil/backstage-plugin-qeta-common": "^1.18.1"
51
+ },
52
+ "devDependencies": {
53
+ "@backstage/backend-test-utils": "^0.2.9",
54
+ "@backstage/cli": "^0.25.0",
55
+ "msw": "^1.2.1"
56
+ },
57
+ "files": [
58
+ "dist",
59
+ "config.d.ts"
60
+ ],
61
+ "configSchema": "config.d.ts",
62
+ "peerDependencies": {
63
+ "react-router-dom": "^6.3.0"
64
+ }
65
+ }