@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 +17 -21
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/package.json +13 -11
package/dist/index.cjs.js
CHANGED
|
@@ -29,24 +29,18 @@ function readScheduleConfigOptions(configRoot) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
return 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.
|
|
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.
|
|
66
|
-
const { token } = await this.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
168
|
+
auth,
|
|
173
169
|
logger
|
|
174
170
|
})
|
|
175
171
|
});
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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:
|
|
9
|
+
declare const searchModuleQetaCollator: _backstage_backend_plugin_api.BackendFeatureCompat;
|
|
11
10
|
|
|
12
11
|
type QetaCollatorFactoryOptions = {
|
|
13
12
|
logger: LoggerService;
|
|
14
|
-
discovery:
|
|
15
|
-
|
|
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
|
|
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.
|
|
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.
|
|
43
|
-
"@backstage/backend-plugin-api": "^0.6.
|
|
44
|
-
"@backstage/backend-tasks": "^0.5.
|
|
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.
|
|
48
|
+
"@backstage/core-plugin-api": "^1.9.3",
|
|
47
49
|
"@backstage/errors": "^1.2.4",
|
|
48
|
-
"@backstage/plugin-search-backend-node": "^1.2.
|
|
49
|
-
"@backstage/plugin-search-common": "^1.2.
|
|
50
|
-
"@drodil/backstage-plugin-qeta-common": "^2.4.
|
|
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.
|
|
54
|
-
"@backstage/cli": "^0.26.
|
|
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": [
|