@drodil/backstage-plugin-search-backend-module-qeta 2.4.0 → 2.4.2

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/dist/index.cjs.js CHANGED
@@ -29,24 +29,18 @@ function readScheduleConfigOptions(configRoot) {
29
29
  }
30
30
  }
31
31
  }
32
- return schedule != null ? schedule : defaults.schedule;
32
+ return schedule ?? defaults.schedule;
33
33
  }
34
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
35
  class DefaultQetaCollatorFactory {
36
+ type = "qeta";
37
+ logger;
38
+ discovery;
39
+ auth;
42
40
  constructor(_config, options) {
43
- __publicField(this, "type", "qeta");
44
- __publicField(this, "logger");
45
- __publicField(this, "discovery");
46
- __publicField(this, "tokenManager");
47
41
  this.logger = options.logger;
48
42
  this.discovery = options.discovery;
49
- this.tokenManager = options.tokenManager;
43
+ this.auth = options.auth;
50
44
  }
51
45
  static fromConfig(config, options) {
52
46
  return new DefaultQetaCollatorFactory(config, options);
@@ -55,15 +49,17 @@ class DefaultQetaCollatorFactory {
55
49
  return stream.Readable.from(this.execute());
56
50
  }
57
51
  async *execute() {
58
- var _a, _b, _c;
59
52
  this.logger.info("Executing QetaCollator");
60
53
  let totalQuestions = Number.MAX_VALUE;
61
54
  let indexedQuestions = 0;
62
55
  const baseUrl = await this.discovery.getBaseUrl("qeta");
63
56
  while (totalQuestions > indexedQuestions) {
64
57
  let headers = {};
65
- if (this.tokenManager) {
66
- const { token } = await this.tokenManager.getToken();
58
+ if (this.auth) {
59
+ const { token } = await this.auth.getPluginRequestToken({
60
+ onBehalfOf: await this.auth.getOwnServiceCredentials(),
61
+ targetPluginId: "qeta"
62
+ });
67
63
  headers = {
68
64
  Authorization: `Bearer ${token}`
69
65
  };
@@ -104,7 +100,7 @@ class DefaultQetaCollatorFactory {
104
100
  views: question.views,
105
101
  tags: question.tags
106
102
  };
107
- for (const answer of (_a = question.answers) != null ? _a : []) {
103
+ for (const answer of question.answers ?? []) {
108
104
  yield {
109
105
  title: `Answer for ${question.title}`,
110
106
  text: answer.content,
@@ -114,7 +110,7 @@ class DefaultQetaCollatorFactory {
114
110
  score: answer.score,
115
111
  tags: question.tags
116
112
  };
117
- for (const comment of (_b = answer.comments) != null ? _b : []) {
113
+ for (const comment of answer.comments ?? []) {
118
114
  yield {
119
115
  title: `Comment for ${question.title}`,
120
116
  text: comment.content,
@@ -126,7 +122,7 @@ class DefaultQetaCollatorFactory {
126
122
  };
127
123
  }
128
124
  }
129
- for (const comment of (_c = question.comments) != null ? _c : []) {
125
+ for (const comment of question.comments ?? []) {
130
126
  yield {
131
127
  title: `Comment for ${question.title}`,
132
128
  text: comment.content,
@@ -151,7 +147,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
151
147
  config: backendPluginApi.coreServices.rootConfig,
152
148
  logger: backendPluginApi.coreServices.logger,
153
149
  discovery: backendPluginApi.coreServices.discovery,
154
- tokenManager: backendPluginApi.coreServices.tokenManager,
150
+ auth: backendPluginApi.coreServices.auth,
155
151
  scheduler: backendPluginApi.coreServices.scheduler,
156
152
  indexRegistry: alpha.searchIndexRegistryExtensionPoint
157
153
  },
@@ -159,7 +155,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
159
155
  config,
160
156
  logger,
161
157
  discovery,
162
- tokenManager,
158
+ auth,
163
159
  scheduler,
164
160
  indexRegistry
165
161
  }) {
@@ -169,7 +165,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
169
165
  ),
170
166
  factory: DefaultQetaCollatorFactory.fromConfig(config, {
171
167
  discovery,
172
- tokenManager,
168
+ auth,
173
169
  logger
174
170
  })
175
171
  });
@@ -1 +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 totalQuestions = Number.MAX_VALUE;\n let indexedQuestions = 0;\n const baseUrl = await this.discovery.getBaseUrl('qeta');\n\n while (totalQuestions > indexedQuestions) {\n let headers = {};\n\n if (this.tokenManager) {\n const { token } = await this.tokenManager.getToken();\n headers = {\n Authorization: `Bearer ${token}`,\n };\n }\n\n const params = new URLSearchParams();\n params.append('includeAnswers', 'true');\n params.append('includeComments', 'true');\n params.append('orderBy', 'created');\n params.append('order', 'asc');\n params.append('limit', '50');\n params.append('offset', indexedQuestions.toString(10));\n const response = await fetch(\n `${baseUrl}/questions?${params.toString()}`,\n {\n headers,\n },\n );\n const data = (await response.json()) as QuestionsResponseBody;\n\n if (!data || 'errors' in data || !('questions' in data)) {\n this.logger.error(\n `Error while fetching questions from qeta: ${JSON.stringify(data)}`,\n );\n return;\n }\n\n const questions = data.questions;\n this.logger.info(`Indexing ${questions.length} questions`);\n totalQuestions = data.total;\n indexedQuestions += questions.length;\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}\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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"}
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 { Readable } from 'stream';\nimport { DocumentCollatorFactory } from '@backstage/plugin-search-common';\nimport {\n QetaDocument,\n QuestionsResponseBody,\n} from '@drodil/backstage-plugin-qeta-common';\nimport {\n AuthService,\n DiscoveryService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\nexport type QetaCollatorFactoryOptions = {\n logger: LoggerService;\n discovery: DiscoveryService;\n auth?: AuthService;\n};\n\nexport class DefaultQetaCollatorFactory implements DocumentCollatorFactory {\n public readonly type: string = 'qeta';\n private readonly logger: LoggerService;\n private readonly discovery: DiscoveryService;\n private readonly auth?: AuthService;\n\n private constructor(_config: Config, options: QetaCollatorFactoryOptions) {\n this.logger = options.logger;\n this.discovery = options.discovery;\n this.auth = options.auth;\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 totalQuestions = Number.MAX_VALUE;\n let indexedQuestions = 0;\n const baseUrl = await this.discovery.getBaseUrl('qeta');\n\n while (totalQuestions > indexedQuestions) {\n let headers = {};\n\n if (this.auth) {\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'qeta',\n });\n headers = {\n Authorization: `Bearer ${token}`,\n };\n }\n\n const params = new URLSearchParams();\n params.append('includeAnswers', 'true');\n params.append('includeComments', 'true');\n params.append('orderBy', 'created');\n params.append('order', 'asc');\n params.append('limit', '50');\n params.append('offset', indexedQuestions.toString(10));\n const response = await fetch(\n `${baseUrl}/questions?${params.toString()}`,\n {\n headers,\n },\n );\n const data = (await response.json()) as QuestionsResponseBody;\n\n if (!data || 'errors' in data || !('questions' in data)) {\n this.logger.error(\n `Error while fetching questions from qeta: ${JSON.stringify(data)}`,\n );\n return;\n }\n\n const questions = data.questions;\n this.logger.info(`Indexing ${questions.length} questions`);\n totalQuestions = data.total;\n indexedQuestions += questions.length;\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}\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 auth: coreServices.auth,\n scheduler: coreServices.scheduler,\n indexRegistry: searchIndexRegistryExtensionPoint,\n },\n async init({\n config,\n logger,\n discovery,\n auth,\n scheduler,\n indexRegistry,\n }) {\n indexRegistry.addCollator({\n schedule: scheduler.createScheduledTaskRunner(\n readScheduleConfigOptions(config),\n ),\n factory: DefaultQetaCollatorFactory.fromConfig(config, {\n discovery,\n auth,\n logger,\n }),\n });\n },\n });\n },\n});\n"],"names":["readTaskScheduleDefinitionFromConfig","InputError","Readable","createBackendModule","coreServices","searchIndexRegistryExtensionPoint"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,24 +1,23 @@
1
1
  /// <reference types="node" />
2
2
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
3
- import { LoggerService } from '@backstage/backend-plugin-api';
3
+ import { LoggerService, DiscoveryService, AuthService } from '@backstage/backend-plugin-api';
4
4
  import { Config } from '@backstage/config';
5
- import { PluginEndpointDiscovery, TokenManager } from '@backstage/backend-common';
6
5
  import { Readable } from 'stream';
7
6
  import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
8
7
  import { QetaDocument } from '@drodil/backstage-plugin-qeta-common';
9
8
 
10
- declare const searchModuleQetaCollator: () => _backstage_backend_plugin_api.BackendFeature;
9
+ declare const searchModuleQetaCollator: _backstage_backend_plugin_api.BackendFeatureCompat;
11
10
 
12
11
  type QetaCollatorFactoryOptions = {
13
12
  logger: LoggerService;
14
- discovery: PluginEndpointDiscovery;
15
- tokenManager?: TokenManager;
13
+ discovery: DiscoveryService;
14
+ auth?: AuthService;
16
15
  };
17
16
  declare class DefaultQetaCollatorFactory implements DocumentCollatorFactory {
18
17
  readonly type: string;
19
18
  private readonly logger;
20
19
  private readonly discovery;
21
- private readonly tokenManager?;
20
+ private readonly auth?;
22
21
  private constructor();
23
22
  static fromConfig(config: Config, options: QetaCollatorFactoryOptions): DefaultQetaCollatorFactory;
24
23
  getCollator(): Promise<Readable>;
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "search",
8
8
  "backstage.io"
9
9
  ],
10
- "version": "2.4.0",
10
+ "version": "2.4.2",
11
11
  "main": "dist/index.cjs.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -26,7 +26,9 @@
26
26
  "types": "dist/index.d.ts"
27
27
  },
28
28
  "backstage": {
29
- "role": "backend-plugin-module"
29
+ "role": "backend-plugin-module",
30
+ "pluginId": "search",
31
+ "pluginPackage": "@backstage/plugin-search-backend"
30
32
  },
31
33
  "scripts": {
32
34
  "start": "backstage-cli package start",
@@ -39,19 +41,19 @@
39
41
  "tsc": "tsc"
40
42
  },
41
43
  "dependencies": {
42
- "@backstage/backend-common": "^0.22.0",
43
- "@backstage/backend-plugin-api": "^0.6.18",
44
- "@backstage/backend-tasks": "^0.5.23",
44
+ "@backstage/backend-common": "^0.23.0",
45
+ "@backstage/backend-plugin-api": "^0.6.19",
46
+ "@backstage/backend-tasks": "^0.5.24",
45
47
  "@backstage/config": "^1.2.0",
46
- "@backstage/core-plugin-api": "^1.9.2",
48
+ "@backstage/core-plugin-api": "^1.9.3",
47
49
  "@backstage/errors": "^1.2.4",
48
- "@backstage/plugin-search-backend-node": "^1.2.22",
49
- "@backstage/plugin-search-common": "^1.2.11",
50
- "@drodil/backstage-plugin-qeta-common": "^2.4.0"
50
+ "@backstage/plugin-search-backend-node": "^1.2.24",
51
+ "@backstage/plugin-search-common": "^1.2.12",
52
+ "@drodil/backstage-plugin-qeta-common": "^2.4.2"
51
53
  },
52
54
  "devDependencies": {
53
- "@backstage/backend-test-utils": "^0.3.8",
54
- "@backstage/cli": "^0.26.5",
55
+ "@backstage/backend-test-utils": "^0.4.0",
56
+ "@backstage/cli": "^0.26.7",
55
57
  "msw": "^1.2.1"
56
58
  },
57
59
  "files": [