@drodil/backstage-plugin-search-backend-module-qeta 3.3.0 → 3.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.
|
@@ -21,9 +21,9 @@ class DefaultQetaCollatorFactory {
|
|
|
21
21
|
}
|
|
22
22
|
async *execute() {
|
|
23
23
|
this.logger.info("Executing QetaCollator");
|
|
24
|
-
let
|
|
25
|
-
let
|
|
26
|
-
while (
|
|
24
|
+
let totalPosts = Number.MAX_VALUE;
|
|
25
|
+
let indexedPosts = 0;
|
|
26
|
+
while (totalPosts > indexedPosts) {
|
|
27
27
|
let tok = void 0;
|
|
28
28
|
if (this.auth) {
|
|
29
29
|
const { token } = await this.auth.getPluginRequestToken({
|
|
@@ -39,7 +39,7 @@ class DefaultQetaCollatorFactory {
|
|
|
39
39
|
orderBy: "created",
|
|
40
40
|
order: "asc",
|
|
41
41
|
limit: 50,
|
|
42
|
-
offset:
|
|
42
|
+
offset: indexedPosts
|
|
43
43
|
},
|
|
44
44
|
{ token: tok }
|
|
45
45
|
);
|
|
@@ -51,8 +51,8 @@ class DefaultQetaCollatorFactory {
|
|
|
51
51
|
}
|
|
52
52
|
const posts = data.posts;
|
|
53
53
|
this.logger.info(`Indexing ${posts.length} posts`);
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
totalPosts = data.total;
|
|
55
|
+
indexedPosts += posts.length;
|
|
56
56
|
for (const post of posts) {
|
|
57
57
|
const questionContent = `# Question: ${post.title}
|
|
58
58
|
|
|
@@ -78,7 +78,7 @@ Comments:
|
|
|
78
78
|
|
|
79
79
|
${commentsContent.join("\n\n")}`,
|
|
80
80
|
location: post.type === "question" ? `/qeta/questions/${post.id}` : `/qeta/articles/${post.id}`,
|
|
81
|
-
docType: "
|
|
81
|
+
docType: "qeta_post",
|
|
82
82
|
author: post.author,
|
|
83
83
|
score: post.score,
|
|
84
84
|
entityRefs: post.entities,
|
|
@@ -88,6 +88,48 @@ ${commentsContent.join("\n\n")}`,
|
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
let totalCollections = Number.MAX_VALUE;
|
|
92
|
+
let indexedCollections = 0;
|
|
93
|
+
while (totalCollections > indexedCollections) {
|
|
94
|
+
let tok = void 0;
|
|
95
|
+
if (this.auth) {
|
|
96
|
+
const { token } = await this.auth.getPluginRequestToken({
|
|
97
|
+
onBehalfOf: await this.auth.getOwnServiceCredentials(),
|
|
98
|
+
targetPluginId: "qeta"
|
|
99
|
+
});
|
|
100
|
+
tok = token;
|
|
101
|
+
}
|
|
102
|
+
const data = await this.api.getCollections(
|
|
103
|
+
{
|
|
104
|
+
orderBy: "created",
|
|
105
|
+
order: "asc",
|
|
106
|
+
limit: 50,
|
|
107
|
+
offset: indexedCollections
|
|
108
|
+
},
|
|
109
|
+
{ token: tok }
|
|
110
|
+
);
|
|
111
|
+
if (!data || "errors" in data || !("collections" in data)) {
|
|
112
|
+
this.logger.error(
|
|
113
|
+
`Error while fetching collections from qeta: ${JSON.stringify(data)}`
|
|
114
|
+
);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const collections = data.collections;
|
|
118
|
+
this.logger.info(`Indexing ${collections.length} collections`);
|
|
119
|
+
totalCollections = data.total;
|
|
120
|
+
indexedCollections += collections.length;
|
|
121
|
+
for (const collection of collections) {
|
|
122
|
+
yield {
|
|
123
|
+
title: collection.title,
|
|
124
|
+
text: collection.description ?? "",
|
|
125
|
+
location: `/qeta/collections/${collection.id}`,
|
|
126
|
+
docType: "qeta_collection",
|
|
127
|
+
owner: collection.owner,
|
|
128
|
+
created: collection.created,
|
|
129
|
+
headerImage: collection.headerImage
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
91
133
|
}
|
|
92
134
|
}
|
|
93
135
|
|
|
@@ -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
|
|
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 QetaCollectionDocument,\n QetaPostDocument,\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<QetaPostDocument | QetaCollectionDocument> {\n this.logger.info('Executing QetaCollator');\n let totalPosts = Number.MAX_VALUE;\n let indexedPosts = 0;\n\n while (totalPosts > indexedPosts) {\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: indexedPosts,\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 totalPosts = data.total;\n indexedPosts += 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_post',\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 let totalCollections = Number.MAX_VALUE;\n let indexedCollections = 0;\n\n while (totalCollections > indexedCollections) {\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.getCollections(\n {\n orderBy: 'created',\n order: 'asc',\n limit: 50,\n offset: indexedCollections,\n },\n { token: tok },\n );\n\n if (!data || 'errors' in data || !('collections' in data)) {\n this.logger.error(\n `Error while fetching collections from qeta: ${JSON.stringify(data)}`,\n );\n return;\n }\n\n const collections = data.collections;\n this.logger.info(`Indexing ${collections.length} collections`);\n totalCollections = data.total;\n indexedCollections += collections.length;\n\n for (const collection of collections) {\n yield {\n title: collection.title,\n text: collection.description ?? '',\n location: `/qeta/collections/${collection.id}`,\n docType: 'qeta_collection',\n owner: collection.owner,\n created: collection.created,\n headerImage: collection.headerImage,\n };\n }\n }\n }\n}\n"],"names":["QetaClient","Readable"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { LoggerService, DiscoveryService, AuthService } from '@backstage/backend
|
|
|
3
3
|
import { Config } from '@backstage/config';
|
|
4
4
|
import { Readable } from 'stream';
|
|
5
5
|
import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
|
|
6
|
-
import {
|
|
6
|
+
import { QetaPostDocument, QetaCollectionDocument } from '@drodil/backstage-plugin-qeta-common';
|
|
7
7
|
|
|
8
8
|
declare const searchModuleQetaCollator: _backstage_backend_plugin_api.BackendFeature;
|
|
9
9
|
|
|
@@ -20,7 +20,7 @@ declare class DefaultQetaCollatorFactory implements DocumentCollatorFactory {
|
|
|
20
20
|
private constructor();
|
|
21
21
|
static fromConfig(config: Config, options: QetaCollatorFactoryOptions): DefaultQetaCollatorFactory;
|
|
22
22
|
getCollator(): Promise<Readable>;
|
|
23
|
-
execute(): AsyncGenerator<
|
|
23
|
+
execute(): AsyncGenerator<QetaPostDocument | QetaCollectionDocument>;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export { DefaultQetaCollatorFactory, searchModuleQetaCollator as default, searchModuleQetaCollator };
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"search",
|
|
8
8
|
"backstage.io"
|
|
9
9
|
],
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.4.1",
|
|
11
11
|
"main": "dist/index.cjs.js",
|
|
12
12
|
"types": "dist/index.d.ts",
|
|
13
13
|
"prepublishOnly": "yarn tsc && yarn build",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@backstage/errors": "^1.2.4",
|
|
47
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.4.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@backstage/backend-test-utils": "^1.0.2",
|