@drodil/backstage-plugin-search-backend-module-qeta 2.10.2 → 2.11.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/dist/collators/DefaultQetaCollatorFactory.cjs.js +117 -0
- package/dist/collators/DefaultQetaCollatorFactory.cjs.js.map +1 -0
- package/dist/collators/config.cjs.js +32 -0
- package/dist/collators/config.cjs.js.map +1 -0
- package/dist/index.cjs.js +5 -176
- package/dist/index.cjs.js.map +1 -1
- package/dist/module.cjs.js +45 -0
- package/dist/module.cjs.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var stream = require('stream');
|
|
4
|
+
|
|
5
|
+
class DefaultQetaCollatorFactory {
|
|
6
|
+
type = "qeta";
|
|
7
|
+
logger;
|
|
8
|
+
discovery;
|
|
9
|
+
auth;
|
|
10
|
+
constructor(_config, options) {
|
|
11
|
+
this.logger = options.logger;
|
|
12
|
+
this.discovery = options.discovery;
|
|
13
|
+
this.auth = options.auth;
|
|
14
|
+
}
|
|
15
|
+
static fromConfig(config, options) {
|
|
16
|
+
return new DefaultQetaCollatorFactory(config, options);
|
|
17
|
+
}
|
|
18
|
+
async getCollator() {
|
|
19
|
+
return stream.Readable.from(this.execute());
|
|
20
|
+
}
|
|
21
|
+
async *execute() {
|
|
22
|
+
this.logger.info("Executing QetaCollator");
|
|
23
|
+
let totalQuestions = Number.MAX_VALUE;
|
|
24
|
+
let indexedQuestions = 0;
|
|
25
|
+
const baseUrl = await this.discovery.getBaseUrl("qeta");
|
|
26
|
+
while (totalQuestions > indexedQuestions) {
|
|
27
|
+
let headers = {};
|
|
28
|
+
if (this.auth) {
|
|
29
|
+
const { token } = await this.auth.getPluginRequestToken({
|
|
30
|
+
onBehalfOf: await this.auth.getOwnServiceCredentials(),
|
|
31
|
+
targetPluginId: "qeta"
|
|
32
|
+
});
|
|
33
|
+
headers = {
|
|
34
|
+
Authorization: `Bearer ${token}`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const params = new URLSearchParams();
|
|
38
|
+
params.append("includeAnswers", "true");
|
|
39
|
+
params.append("includeComments", "true");
|
|
40
|
+
params.append("orderBy", "created");
|
|
41
|
+
params.append("order", "asc");
|
|
42
|
+
params.append("limit", "50");
|
|
43
|
+
params.append("offset", indexedQuestions.toString(10));
|
|
44
|
+
const response = await fetch(
|
|
45
|
+
`${baseUrl}/questions?${params.toString()}`,
|
|
46
|
+
{
|
|
47
|
+
headers
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
const data = await response.json();
|
|
51
|
+
if (!data || "errors" in data || !("questions" in data)) {
|
|
52
|
+
this.logger.error(
|
|
53
|
+
`Error while fetching questions from qeta: ${JSON.stringify(data)}`
|
|
54
|
+
);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const questions = data.questions;
|
|
58
|
+
this.logger.info(`Indexing ${questions.length} questions`);
|
|
59
|
+
totalQuestions = data.total;
|
|
60
|
+
indexedQuestions += questions.length;
|
|
61
|
+
for (const question of questions) {
|
|
62
|
+
yield {
|
|
63
|
+
title: question.title,
|
|
64
|
+
text: question.content,
|
|
65
|
+
location: `/qeta/questions/${question.id}`,
|
|
66
|
+
docType: "qeta",
|
|
67
|
+
author: question.author,
|
|
68
|
+
score: question.score,
|
|
69
|
+
entityRefs: question.entities,
|
|
70
|
+
answerCount: question.answersCount,
|
|
71
|
+
views: question.views,
|
|
72
|
+
tags: question.tags
|
|
73
|
+
};
|
|
74
|
+
for (const answer of question.answers ?? []) {
|
|
75
|
+
yield {
|
|
76
|
+
title: `${answer.correct ? "Correct answer" : "Answer"} for question ${question.title}`,
|
|
77
|
+
text: answer.content,
|
|
78
|
+
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
79
|
+
docType: "qeta",
|
|
80
|
+
entityRefs: question.entities,
|
|
81
|
+
author: answer.author,
|
|
82
|
+
score: answer.score,
|
|
83
|
+
tags: question.tags,
|
|
84
|
+
correctAnswer: answer.correct
|
|
85
|
+
};
|
|
86
|
+
for (const comment of answer.comments ?? []) {
|
|
87
|
+
yield {
|
|
88
|
+
title: `Comment for ${question.title}`,
|
|
89
|
+
text: comment.content,
|
|
90
|
+
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
91
|
+
docType: "qeta",
|
|
92
|
+
author: comment.author,
|
|
93
|
+
score: answer.score,
|
|
94
|
+
tags: question.tags,
|
|
95
|
+
entityRefs: question.entities
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
for (const comment of question.comments ?? []) {
|
|
100
|
+
yield {
|
|
101
|
+
title: `Comment for ${question.title}`,
|
|
102
|
+
text: comment.content,
|
|
103
|
+
location: `/qeta/questions/${question.id}`,
|
|
104
|
+
docType: "qeta",
|
|
105
|
+
author: comment.author,
|
|
106
|
+
score: question.score,
|
|
107
|
+
tags: question.tags,
|
|
108
|
+
entityRefs: question.entities
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
exports.DefaultQetaCollatorFactory = DefaultQetaCollatorFactory;
|
|
117
|
+
//# sourceMappingURL=DefaultQetaCollatorFactory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultQetaCollatorFactory.cjs.js","sources":["../../src/collators/DefaultQetaCollatorFactory.ts"],"sourcesContent":["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 entityRefs: question.entities,\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: `${\n answer.correct ? 'Correct answer' : 'Answer'\n } for question ${question.title}`,\n text: answer.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n entityRefs: question.entities,\n author: answer.author,\n score: answer.score,\n tags: question.tags,\n correctAnswer: answer.correct,\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 entityRefs: question.entities,\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 entityRefs: question.entities,\n };\n }\n }\n }\n }\n}\n"],"names":["Readable"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var errors = require('@backstage/errors');
|
|
5
|
+
|
|
6
|
+
const configKey = "search.collators.qeta";
|
|
7
|
+
const defaults = {
|
|
8
|
+
schedule: {
|
|
9
|
+
frequency: { minutes: 10 },
|
|
10
|
+
timeout: { minutes: 15 },
|
|
11
|
+
initialDelay: { seconds: 3 }
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
function readScheduleConfigOptions(configRoot) {
|
|
15
|
+
let schedule = void 0;
|
|
16
|
+
const config = configRoot.getOptionalConfig(configKey);
|
|
17
|
+
if (config) {
|
|
18
|
+
const scheduleConfig = config.getOptionalConfig("schedule");
|
|
19
|
+
if (scheduleConfig) {
|
|
20
|
+
try {
|
|
21
|
+
schedule = backendPluginApi.readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
throw new errors.InputError(`Invalid schedule at ${configKey}, ${error}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return schedule ?? defaults.schedule;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
exports.defaults = defaults;
|
|
31
|
+
exports.readScheduleConfigOptions = readScheduleConfigOptions;
|
|
32
|
+
//# sourceMappingURL=config.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.cjs.js","sources":["../../src/collators/config.ts"],"sourcesContent":["import { Config } from '@backstage/config';\nimport {\n readSchedulerServiceTaskScheduleDefinitionFromConfig,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\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): SchedulerServiceTaskScheduleDefinition {\n let schedule: SchedulerServiceTaskScheduleDefinition | 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 =\n readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);\n } catch (error) {\n throw new InputError(`Invalid schedule at ${configKey}, ${error}`);\n }\n }\n }\n\n return schedule ?? defaults.schedule;\n}\n"],"names":["readSchedulerServiceTaskScheduleDefinitionFromConfig","InputError"],"mappings":";;;;;AAOA,MAAM,SAAY,GAAA,uBAAA,CAAA;AAEX,MAAM,QAAW,GAAA;AAAA,EACtB,QAAU,EAAA;AAAA,IACR,SAAA,EAAW,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,IACzB,OAAA,EAAS,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,IACvB,YAAA,EAAc,EAAE,OAAA,EAAS,CAAE,EAAA;AAAA,GAC7B;AACF,EAAA;AAEO,SAAS,0BACd,UACwC,EAAA;AACxC,EAAA,IAAI,QAA+D,GAAA,KAAA,CAAA,CAAA;AAEnE,EAAM,MAAA,MAAA,GAAS,UAAW,CAAA,iBAAA,CAAkB,SAAS,CAAA,CAAA;AACrD,EAAA,IAAI,MAAQ,EAAA;AACV,IAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,iBAAA,CAAkB,UAAU,CAAA,CAAA;AAC1D,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAI,IAAA;AACF,QAAA,QAAA,GACEA,sEAAqD,cAAc,CAAA,CAAA;AAAA,eAC9D,KAAO,EAAA;AACd,QAAA,MAAM,IAAIC,iBAAW,CAAA,CAAA,oBAAA,EAAuB,SAAS,CAAA,EAAA,EAAK,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,OACnE;AAAA,KACF;AAAA,GACF;AAEA,EAAA,OAAO,YAAY,QAAS,CAAA,QAAA,CAAA;AAC9B;;;;;"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -2,183 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var errors = require('@backstage/errors');
|
|
8
|
-
var stream = require('stream');
|
|
5
|
+
var module$1 = require('./module.cjs.js');
|
|
6
|
+
var DefaultQetaCollatorFactory = require('./collators/DefaultQetaCollatorFactory.cjs.js');
|
|
9
7
|
|
|
10
|
-
const configKey = "search.collators.qeta";
|
|
11
|
-
const defaults = {
|
|
12
|
-
schedule: {
|
|
13
|
-
frequency: { minutes: 10 },
|
|
14
|
-
timeout: { minutes: 15 },
|
|
15
|
-
initialDelay: { seconds: 3 }
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
function readScheduleConfigOptions(configRoot) {
|
|
19
|
-
let schedule = void 0;
|
|
20
|
-
const config = configRoot.getOptionalConfig(configKey);
|
|
21
|
-
if (config) {
|
|
22
|
-
const scheduleConfig = config.getOptionalConfig("schedule");
|
|
23
|
-
if (scheduleConfig) {
|
|
24
|
-
try {
|
|
25
|
-
schedule = backendPluginApi.readSchedulerServiceTaskScheduleDefinitionFromConfig(scheduleConfig);
|
|
26
|
-
} catch (error) {
|
|
27
|
-
throw new errors.InputError(`Invalid schedule at ${configKey}, ${error}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return schedule ?? defaults.schedule;
|
|
32
|
-
}
|
|
33
8
|
|
|
34
|
-
class DefaultQetaCollatorFactory {
|
|
35
|
-
type = "qeta";
|
|
36
|
-
logger;
|
|
37
|
-
discovery;
|
|
38
|
-
auth;
|
|
39
|
-
constructor(_config, options) {
|
|
40
|
-
this.logger = options.logger;
|
|
41
|
-
this.discovery = options.discovery;
|
|
42
|
-
this.auth = options.auth;
|
|
43
|
-
}
|
|
44
|
-
static fromConfig(config, options) {
|
|
45
|
-
return new DefaultQetaCollatorFactory(config, options);
|
|
46
|
-
}
|
|
47
|
-
async getCollator() {
|
|
48
|
-
return stream.Readable.from(this.execute());
|
|
49
|
-
}
|
|
50
|
-
async *execute() {
|
|
51
|
-
this.logger.info("Executing QetaCollator");
|
|
52
|
-
let totalQuestions = Number.MAX_VALUE;
|
|
53
|
-
let indexedQuestions = 0;
|
|
54
|
-
const baseUrl = await this.discovery.getBaseUrl("qeta");
|
|
55
|
-
while (totalQuestions > indexedQuestions) {
|
|
56
|
-
let headers = {};
|
|
57
|
-
if (this.auth) {
|
|
58
|
-
const { token } = await this.auth.getPluginRequestToken({
|
|
59
|
-
onBehalfOf: await this.auth.getOwnServiceCredentials(),
|
|
60
|
-
targetPluginId: "qeta"
|
|
61
|
-
});
|
|
62
|
-
headers = {
|
|
63
|
-
Authorization: `Bearer ${token}`
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
const params = new URLSearchParams();
|
|
67
|
-
params.append("includeAnswers", "true");
|
|
68
|
-
params.append("includeComments", "true");
|
|
69
|
-
params.append("orderBy", "created");
|
|
70
|
-
params.append("order", "asc");
|
|
71
|
-
params.append("limit", "50");
|
|
72
|
-
params.append("offset", indexedQuestions.toString(10));
|
|
73
|
-
const response = await fetch(
|
|
74
|
-
`${baseUrl}/questions?${params.toString()}`,
|
|
75
|
-
{
|
|
76
|
-
headers
|
|
77
|
-
}
|
|
78
|
-
);
|
|
79
|
-
const data = await response.json();
|
|
80
|
-
if (!data || "errors" in data || !("questions" in data)) {
|
|
81
|
-
this.logger.error(
|
|
82
|
-
`Error while fetching questions from qeta: ${JSON.stringify(data)}`
|
|
83
|
-
);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const questions = data.questions;
|
|
87
|
-
this.logger.info(`Indexing ${questions.length} questions`);
|
|
88
|
-
totalQuestions = data.total;
|
|
89
|
-
indexedQuestions += questions.length;
|
|
90
|
-
for (const question of questions) {
|
|
91
|
-
yield {
|
|
92
|
-
title: question.title,
|
|
93
|
-
text: question.content,
|
|
94
|
-
location: `/qeta/questions/${question.id}`,
|
|
95
|
-
docType: "qeta",
|
|
96
|
-
author: question.author,
|
|
97
|
-
score: question.score,
|
|
98
|
-
entityRefs: question.entities,
|
|
99
|
-
answerCount: question.answersCount,
|
|
100
|
-
views: question.views,
|
|
101
|
-
tags: question.tags
|
|
102
|
-
};
|
|
103
|
-
for (const answer of question.answers ?? []) {
|
|
104
|
-
yield {
|
|
105
|
-
title: `${answer.correct ? "Correct answer" : "Answer"} for question ${question.title}`,
|
|
106
|
-
text: answer.content,
|
|
107
|
-
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
108
|
-
docType: "qeta",
|
|
109
|
-
entityRefs: question.entities,
|
|
110
|
-
author: answer.author,
|
|
111
|
-
score: answer.score,
|
|
112
|
-
tags: question.tags,
|
|
113
|
-
correctAnswer: answer.correct
|
|
114
|
-
};
|
|
115
|
-
for (const comment of answer.comments ?? []) {
|
|
116
|
-
yield {
|
|
117
|
-
title: `Comment for ${question.title}`,
|
|
118
|
-
text: comment.content,
|
|
119
|
-
location: `/qeta/questions/${question.id}#answer_${answer.id}`,
|
|
120
|
-
docType: "qeta",
|
|
121
|
-
author: comment.author,
|
|
122
|
-
score: answer.score,
|
|
123
|
-
tags: question.tags,
|
|
124
|
-
entityRefs: question.entities
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
for (const comment of question.comments ?? []) {
|
|
129
|
-
yield {
|
|
130
|
-
title: `Comment for ${question.title}`,
|
|
131
|
-
text: comment.content,
|
|
132
|
-
location: `/qeta/questions/${question.id}`,
|
|
133
|
-
docType: "qeta",
|
|
134
|
-
author: comment.author,
|
|
135
|
-
score: question.score,
|
|
136
|
-
tags: question.tags,
|
|
137
|
-
entityRefs: question.entities
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
9
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
register(reg) {
|
|
149
|
-
reg.registerInit({
|
|
150
|
-
deps: {
|
|
151
|
-
config: backendPluginApi.coreServices.rootConfig,
|
|
152
|
-
logger: backendPluginApi.coreServices.logger,
|
|
153
|
-
discovery: backendPluginApi.coreServices.discovery,
|
|
154
|
-
auth: backendPluginApi.coreServices.auth,
|
|
155
|
-
scheduler: backendPluginApi.coreServices.scheduler,
|
|
156
|
-
indexRegistry: alpha.searchIndexRegistryExtensionPoint
|
|
157
|
-
},
|
|
158
|
-
async init({
|
|
159
|
-
config,
|
|
160
|
-
logger,
|
|
161
|
-
discovery,
|
|
162
|
-
auth,
|
|
163
|
-
scheduler,
|
|
164
|
-
indexRegistry
|
|
165
|
-
}) {
|
|
166
|
-
indexRegistry.addCollator({
|
|
167
|
-
schedule: scheduler.createScheduledTaskRunner(
|
|
168
|
-
readScheduleConfigOptions(config)
|
|
169
|
-
),
|
|
170
|
-
factory: DefaultQetaCollatorFactory.fromConfig(config, {
|
|
171
|
-
discovery,
|
|
172
|
-
auth,
|
|
173
|
-
logger
|
|
174
|
-
})
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
exports.DefaultQetaCollatorFactory = DefaultQetaCollatorFactory;
|
|
182
|
-
exports.default = searchModuleQetaCollator;
|
|
183
|
-
exports.searchModuleQetaCollator = searchModuleQetaCollator;
|
|
10
|
+
exports.default = module$1.searchModuleQetaCollator;
|
|
11
|
+
exports.searchModuleQetaCollator = module$1.searchModuleQetaCollator;
|
|
12
|
+
exports.DefaultQetaCollatorFactory = DefaultQetaCollatorFactory.DefaultQetaCollatorFactory;
|
|
184
13
|
//# sourceMappingURL=index.cjs.js.map
|
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 readSchedulerServiceTaskScheduleDefinitionFromConfig,\n SchedulerServiceTaskScheduleDefinition,\n} from '@backstage/backend-plugin-api';\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): SchedulerServiceTaskScheduleDefinition {\n let schedule: SchedulerServiceTaskScheduleDefinition | 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 =\n readSchedulerServiceTaskScheduleDefinitionFromConfig(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 entityRefs: question.entities,\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: `${\n answer.correct ? 'Correct answer' : 'Answer'\n } for question ${question.title}`,\n text: answer.content,\n location: `/qeta/questions/${question.id}#answer_${answer.id}`,\n docType: 'qeta',\n entityRefs: question.entities,\n author: answer.author,\n score: answer.score,\n tags: question.tags,\n correctAnswer: answer.correct,\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 entityRefs: question.entities,\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 entityRefs: question.entities,\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';\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":["readSchedulerServiceTaskScheduleDefinitionFromConfig","InputError","Readable","createBackendModule","coreServices","searchIndexRegistryExtensionPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var alpha = require('@backstage/plugin-search-backend-node/alpha');
|
|
5
|
+
var config = require('./collators/config.cjs.js');
|
|
6
|
+
var DefaultQetaCollatorFactory = require('./collators/DefaultQetaCollatorFactory.cjs.js');
|
|
7
|
+
|
|
8
|
+
const searchModuleQetaCollator = backendPluginApi.createBackendModule({
|
|
9
|
+
pluginId: "search",
|
|
10
|
+
moduleId: "qeta-collator",
|
|
11
|
+
register(reg) {
|
|
12
|
+
reg.registerInit({
|
|
13
|
+
deps: {
|
|
14
|
+
config: backendPluginApi.coreServices.rootConfig,
|
|
15
|
+
logger: backendPluginApi.coreServices.logger,
|
|
16
|
+
discovery: backendPluginApi.coreServices.discovery,
|
|
17
|
+
auth: backendPluginApi.coreServices.auth,
|
|
18
|
+
scheduler: backendPluginApi.coreServices.scheduler,
|
|
19
|
+
indexRegistry: alpha.searchIndexRegistryExtensionPoint
|
|
20
|
+
},
|
|
21
|
+
async init({
|
|
22
|
+
config: config$1,
|
|
23
|
+
logger,
|
|
24
|
+
discovery,
|
|
25
|
+
auth,
|
|
26
|
+
scheduler,
|
|
27
|
+
indexRegistry
|
|
28
|
+
}) {
|
|
29
|
+
indexRegistry.addCollator({
|
|
30
|
+
schedule: scheduler.createScheduledTaskRunner(
|
|
31
|
+
config.readScheduleConfigOptions(config$1)
|
|
32
|
+
),
|
|
33
|
+
factory: DefaultQetaCollatorFactory.DefaultQetaCollatorFactory.fromConfig(config$1, {
|
|
34
|
+
discovery,
|
|
35
|
+
auth,
|
|
36
|
+
logger
|
|
37
|
+
})
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
exports.searchModuleQetaCollator = searchModuleQetaCollator;
|
|
45
|
+
//# sourceMappingURL=module.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["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';\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":["createBackendModule","coreServices","searchIndexRegistryExtensionPoint","config","readScheduleConfigOptions","DefaultQetaCollatorFactory"],"mappings":";;;;;;;AAQO,MAAM,2BAA2BA,oCAAoB,CAAA;AAAA,EAC1D,QAAU,EAAA,QAAA;AAAA,EACV,QAAU,EAAA,eAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,MAAMA,6BAAa,CAAA,IAAA;AAAA,QACnB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,aAAe,EAAAC,uCAAA;AAAA,OACjB;AAAA,MACA,MAAM,IAAK,CAAA;AAAA,gBACTC,QAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,OACC,EAAA;AACD,QAAA,aAAA,CAAc,WAAY,CAAA;AAAA,UACxB,UAAU,SAAU,CAAA,yBAAA;AAAA,YAClBC,iCAA0BD,QAAM,CAAA;AAAA,WAClC;AAAA,UACA,OAAA,EAASE,qDAA2B,CAAA,UAAA,CAAWF,QAAQ,EAAA;AAAA,YACrD,SAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA;AAAA,WACD,CAAA;AAAA,SACF,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"search",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.11.0",
|
|
11
11
|
"main": "dist/index.cjs.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -42,18 +42,18 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@backstage/backend-common": "^0.25.0",
|
|
45
|
-
"@backstage/backend-plugin-api": "^1.0.
|
|
45
|
+
"@backstage/backend-plugin-api": "^1.0.1",
|
|
46
46
|
"@backstage/backend-tasks": "^0.6.1",
|
|
47
47
|
"@backstage/config": "^1.2.0",
|
|
48
|
-
"@backstage/core-plugin-api": "^1.
|
|
48
|
+
"@backstage/core-plugin-api": "^1.10.0",
|
|
49
49
|
"@backstage/errors": "^1.2.4",
|
|
50
|
-
"@backstage/plugin-search-backend-node": "^1.3.
|
|
50
|
+
"@backstage/plugin-search-backend-node": "^1.3.3",
|
|
51
51
|
"@backstage/plugin-search-common": "^1.2.14",
|
|
52
|
-
"@drodil/backstage-plugin-qeta-common": "^2.
|
|
52
|
+
"@drodil/backstage-plugin-qeta-common": "^2.11.0"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@backstage/backend-test-utils": "^1.0.
|
|
56
|
-
"@backstage/cli": "^0.
|
|
55
|
+
"@backstage/backend-test-utils": "^1.0.1",
|
|
56
|
+
"@backstage/cli": "^0.28.0",
|
|
57
57
|
"msw": "^1.2.1"
|
|
58
58
|
},
|
|
59
59
|
"files": [
|