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

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
@@ -43,10 +43,10 @@ class DefaultQetaCollatorFactory {
43
43
  __publicField(this, "type", "qeta");
44
44
  __publicField(this, "logger");
45
45
  __publicField(this, "discovery");
46
- __publicField(this, "tokenManager");
46
+ __publicField(this, "auth");
47
47
  this.logger = options.logger;
48
48
  this.discovery = options.discovery;
49
- this.tokenManager = options.tokenManager;
49
+ this.auth = options.auth;
50
50
  }
51
51
  static fromConfig(config, options) {
52
52
  return new DefaultQetaCollatorFactory(config, options);
@@ -62,8 +62,11 @@ class DefaultQetaCollatorFactory {
62
62
  const baseUrl = await this.discovery.getBaseUrl("qeta");
63
63
  while (totalQuestions > indexedQuestions) {
64
64
  let headers = {};
65
- if (this.tokenManager) {
66
- const { token } = await this.tokenManager.getToken();
65
+ if (this.auth) {
66
+ const { token } = await this.auth.getPluginRequestToken({
67
+ onBehalfOf: await this.auth.getOwnServiceCredentials(),
68
+ targetPluginId: "qeta"
69
+ });
67
70
  headers = {
68
71
  Authorization: `Bearer ${token}`
69
72
  };
@@ -151,7 +154,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
151
154
  config: backendPluginApi.coreServices.rootConfig,
152
155
  logger: backendPluginApi.coreServices.logger,
153
156
  discovery: backendPluginApi.coreServices.discovery,
154
- tokenManager: backendPluginApi.coreServices.tokenManager,
157
+ auth: backendPluginApi.coreServices.auth,
155
158
  scheduler: backendPluginApi.coreServices.scheduler,
156
159
  indexRegistry: alpha.searchIndexRegistryExtensionPoint
157
160
  },
@@ -159,7 +162,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
159
162
  config,
160
163
  logger,
161
164
  discovery,
162
- tokenManager,
165
+ auth,
163
166
  scheduler,
164
167
  indexRegistry
165
168
  }) {
@@ -169,7 +172,7 @@ const searchModuleQetaCollator = backendPluginApi.createBackendModule({
169
172
  ),
170
173
  factory: DefaultQetaCollatorFactory.fromConfig(config, {
171
174
  discovery,
172
- tokenManager,
175
+ auth,
173
176
  logger
174
177
  })
175
178
  });
@@ -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,8 +1,7 @@
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';
@@ -11,14 +10,14 @@ declare const searchModuleQetaCollator: () => _backstage_backend_plugin_api.Back
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.1",
11
11
  "main": "dist/index.cjs.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "prepublishOnly": "yarn tsc && yarn build",
@@ -45,13 +45,13 @@
45
45
  "@backstage/config": "^1.2.0",
46
46
  "@backstage/core-plugin-api": "^1.9.2",
47
47
  "@backstage/errors": "^1.2.4",
48
- "@backstage/plugin-search-backend-node": "^1.2.22",
48
+ "@backstage/plugin-search-backend-node": "^1.2.23",
49
49
  "@backstage/plugin-search-common": "^1.2.11",
50
- "@drodil/backstage-plugin-qeta-common": "^2.4.0"
50
+ "@drodil/backstage-plugin-qeta-common": "^2.4.1"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@backstage/backend-test-utils": "^0.3.8",
54
- "@backstage/cli": "^0.26.5",
54
+ "@backstage/cli": "^0.26.6",
55
55
  "msw": "^1.2.1"
56
56
  },
57
57
  "files": [