@drodil/backstage-plugin-search-backend-module-qeta 3.2.0 → 3.3.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.
|
@@ -54,9 +54,29 @@ class DefaultQetaCollatorFactory {
|
|
|
54
54
|
totalQuestions = data.total;
|
|
55
55
|
indexedQuestions += posts.length;
|
|
56
56
|
for (const post of posts) {
|
|
57
|
+
const questionContent = `# Question: ${post.title}
|
|
58
|
+
|
|
59
|
+
${post.content}`;
|
|
60
|
+
const answersContent = (post.answers ?? []).map((a) => {
|
|
61
|
+
return `## ${a.correct ? "Correct answer" : "Answer"} by ${a.author}: ${a.content}`;
|
|
62
|
+
});
|
|
63
|
+
const allComments = (post.comments ?? []).concat(
|
|
64
|
+
(post.answers ?? []).flatMap((a) => a.comments ?? [])
|
|
65
|
+
);
|
|
66
|
+
const commentsContent = allComments.map((c) => {
|
|
67
|
+
return `* Comment by ${c.author}: ${c.content}`;
|
|
68
|
+
});
|
|
57
69
|
yield {
|
|
58
70
|
title: post.title,
|
|
59
|
-
text:
|
|
71
|
+
text: `${questionContent}
|
|
72
|
+
|
|
73
|
+
${answersContent.join(
|
|
74
|
+
"\n\n"
|
|
75
|
+
)}
|
|
76
|
+
|
|
77
|
+
Comments:
|
|
78
|
+
|
|
79
|
+
${commentsContent.join("\n\n")}`,
|
|
60
80
|
location: post.type === "question" ? `/qeta/questions/${post.id}` : `/qeta/articles/${post.id}`,
|
|
61
81
|
docType: "qeta",
|
|
62
82
|
author: post.author,
|
|
@@ -66,43 +86,6 @@ class DefaultQetaCollatorFactory {
|
|
|
66
86
|
views: post.views,
|
|
67
87
|
tags: post.tags
|
|
68
88
|
};
|
|
69
|
-
for (const answer of post.answers ?? []) {
|
|
70
|
-
yield {
|
|
71
|
-
title: `${answer.correct ? "Correct answer" : "Answer"} for question ${post.title}`,
|
|
72
|
-
text: answer.content,
|
|
73
|
-
location: `/qeta/questions/${post.id}#answer_${answer.id}`,
|
|
74
|
-
docType: "qeta",
|
|
75
|
-
entityRefs: post.entities,
|
|
76
|
-
author: answer.author,
|
|
77
|
-
score: answer.score,
|
|
78
|
-
tags: post.tags,
|
|
79
|
-
correctAnswer: answer.correct
|
|
80
|
-
};
|
|
81
|
-
for (const comment of answer.comments ?? []) {
|
|
82
|
-
yield {
|
|
83
|
-
title: `Comment for ${post.title}`,
|
|
84
|
-
text: comment.content,
|
|
85
|
-
location: `/qeta/questions/${post.id}#answer_${answer.id}`,
|
|
86
|
-
docType: "qeta",
|
|
87
|
-
author: comment.author,
|
|
88
|
-
score: answer.score,
|
|
89
|
-
tags: post.tags,
|
|
90
|
-
entityRefs: post.entities
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const comment of post.comments ?? []) {
|
|
95
|
-
yield {
|
|
96
|
-
title: `Comment for ${post.title}`,
|
|
97
|
-
text: comment.content,
|
|
98
|
-
location: post.type === "question" ? `/qeta/questions/${post.id}` : `/qeta/articles/${post.id}`,
|
|
99
|
-
docType: "qeta",
|
|
100
|
-
author: comment.author,
|
|
101
|
-
score: post.score,
|
|
102
|
-
tags: post.tags,
|
|
103
|
-
entityRefs: post.entities
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
89
|
}
|
|
107
90
|
}
|
|
108
91
|
}
|
|
@@ -1 +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 QetaApi,\n QetaClient,\n QetaDocument,\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 auth?: AuthService;\n private readonly api: QetaApi;\n\n private constructor(_config: Config, options: QetaCollatorFactoryOptions) {\n this.logger = options.logger;\n this.auth = options.auth;\n this.api = new QetaClient({ discoveryApi: options.discovery });\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\n while (totalQuestions > indexedQuestions) {\n let tok = undefined;\n\n if (this.auth) {\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'qeta',\n });\n tok = token;\n }\n\n const data = await this.api.getPosts(\n {\n includeAnswers: true,\n includeComments: true,\n orderBy: 'created',\n order: 'asc',\n limit: 50,\n offset: indexedQuestions,\n },\n { token: tok },\n );\n\n if (!data || 'errors' in data || !('posts' in data)) {\n this.logger.error(\n `Error while fetching posts from qeta: ${JSON.stringify(data)}`,\n );\n return;\n }\n\n const posts = data.posts;\n this.logger.info(`Indexing ${posts.length} posts`);\n totalQuestions = data.total;\n indexedQuestions += posts.length;\n\n for (const post of posts) {\n
|
|
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 QetaApi,\n QetaClient,\n QetaDocument,\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 auth?: AuthService;\n private readonly api: QetaApi;\n\n private constructor(_config: Config, options: QetaCollatorFactoryOptions) {\n this.logger = options.logger;\n this.auth = options.auth;\n this.api = new QetaClient({ discoveryApi: options.discovery });\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\n while (totalQuestions > indexedQuestions) {\n let tok = undefined;\n\n if (this.auth) {\n const { token } = await this.auth.getPluginRequestToken({\n onBehalfOf: await this.auth.getOwnServiceCredentials(),\n targetPluginId: 'qeta',\n });\n tok = token;\n }\n\n const data = await this.api.getPosts(\n {\n includeAnswers: true,\n includeComments: true,\n orderBy: 'created',\n order: 'asc',\n limit: 50,\n offset: indexedQuestions,\n },\n { token: tok },\n );\n\n if (!data || 'errors' in data || !('posts' in data)) {\n this.logger.error(\n `Error while fetching posts from qeta: ${JSON.stringify(data)}`,\n );\n return;\n }\n\n const posts = data.posts;\n this.logger.info(`Indexing ${posts.length} posts`);\n totalQuestions = data.total;\n indexedQuestions += posts.length;\n\n for (const post of posts) {\n const questionContent = `# Question: ${post.title}\\n\\n${post.content}`;\n const answersContent = (post.answers ?? []).map(a => {\n return `## ${a.correct ? 'Correct answer' : 'Answer'} by ${\n a.author\n }: ${a.content}`;\n });\n\n const allComments = (post.comments ?? []).concat(\n (post.answers ?? []).flatMap(a => a.comments ?? []),\n );\n const commentsContent = allComments.map(c => {\n return `* Comment by ${c.author}: ${c.content}`;\n });\n\n yield {\n title: post.title,\n text: `${questionContent}\\n\\n${answersContent.join(\n '\\n\\n',\n )}\\n\\nComments:\\n\\n${commentsContent.join('\\n\\n')}`,\n location:\n post.type === 'question'\n ? `/qeta/questions/${post.id}`\n : `/qeta/articles/${post.id}`,\n docType: 'qeta',\n author: post.author,\n score: post.score,\n entityRefs: post.entities,\n answerCount: post.answersCount,\n views: post.views,\n tags: post.tags,\n };\n }\n }\n }\n}\n"],"names":["QetaClient","Readable"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"search",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.3.0",
|
|
11
11
|
"main": "dist/index.cjs.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
"@backstage/backend-plugin-api": "^1.0.1",
|
|
45
45
|
"@backstage/config": "^1.2.0",
|
|
46
46
|
"@backstage/errors": "^1.2.4",
|
|
47
|
-
"@backstage/plugin-search-backend-node": "^1.3.
|
|
47
|
+
"@backstage/plugin-search-backend-node": "^1.3.4",
|
|
48
48
|
"@backstage/plugin-search-common": "^1.2.14",
|
|
49
|
-
"@drodil/backstage-plugin-qeta-common": "^3.
|
|
49
|
+
"@drodil/backstage-plugin-qeta-common": "^3.3.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@backstage/backend-test-utils": "^1.0.
|
|
53
|
-
"@backstage/cli": "^0.28.
|
|
52
|
+
"@backstage/backend-test-utils": "^1.0.2",
|
|
53
|
+
"@backstage/cli": "^0.28.1",
|
|
54
54
|
"msw": "^1.2.1"
|
|
55
55
|
},
|
|
56
56
|
"files": [
|