@drodil/backstage-plugin-qeta 2.14.0 → 3.0.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/components/ArticlePage/ArticlePage.esm.js +45 -0
- package/dist/components/ArticlePage/ArticlePage.esm.js.map +1 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js +34 -0
- package/dist/components/ArticlesPage/ArticlesPage.esm.js.map +1 -0
- package/dist/components/AskPage/AskPage.esm.js +4 -4
- package/dist/components/AskPage/AskPage.esm.js.map +1 -1
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js +20 -0
- package/dist/components/CollectionCreatePage/CollectionCreatePage.esm.js.map +1 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js +34 -0
- package/dist/components/CollectionPage/CollectionPage.esm.js.map +1 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js +11 -0
- package/dist/components/CollectionsPage/CollectionsPage.esm.js.map +1 -0
- package/dist/components/EntityPage/EntityPage.esm.js +75 -0
- package/dist/components/EntityPage/EntityPage.esm.js.map +1 -0
- package/dist/components/FavoritePage/FavoritePage.esm.js +14 -22
- package/dist/components/FavoritePage/FavoritePage.esm.js.map +1 -1
- package/dist/components/HomePage/HomePage.esm.js +7 -10
- package/dist/components/HomePage/HomePage.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenu.esm.js +47 -16
- package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
- package/dist/components/LeftMenu/LeftMenuButton.esm.js +75 -0
- package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -0
- package/dist/components/QetaPage/QetaPage.esm.js +51 -9
- package/dist/components/QetaPage/QetaPage.esm.js.map +1 -1
- package/dist/components/QuestionPage/QuestionPage.esm.js +7 -13
- package/dist/components/QuestionPage/QuestionPage.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js +1 -1
- package/dist/components/QuestionTableCard/Content.esm.js.map +1 -1
- package/dist/components/QuestionTableCard/index.esm.js +0 -1
- package/dist/components/QuestionTableCard/index.esm.js.map +1 -1
- package/dist/components/QuestionsPage/QuestionsPage.esm.js +13 -15
- package/dist/components/QuestionsPage/QuestionsPage.esm.js.map +1 -1
- package/dist/components/Statistics/GlobalStatsContent.esm.js +1 -3
- package/dist/components/Statistics/GlobalStatsContent.esm.js.map +1 -1
- package/dist/components/Statistics/StatisticsPage.esm.js +2 -3
- package/dist/components/Statistics/StatisticsPage.esm.js.map +1 -1
- package/dist/components/TagPage/TagPage.esm.js +32 -25
- package/dist/components/TagPage/TagPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserPage.esm.js +7 -15
- package/dist/components/UserPage/UserPage.esm.js.map +1 -1
- package/dist/components/UserPage/UserStatsContent.esm.js +1 -3
- package/dist/components/UserPage/UserStatsContent.esm.js.map +1 -1
- package/dist/components/UsersPage/UsersPage.esm.js +11 -0
- package/dist/components/UsersPage/UsersPage.esm.js.map +1 -0
- package/dist/components/WritePage/WritePage.esm.js +40 -0
- package/dist/components/WritePage/WritePage.esm.js.map +1 -0
- package/dist/index.d.ts +8 -422
- package/dist/index.esm.js +0 -10
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -2
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +4 -24
- package/dist/api/QetaClient.esm.js +0 -513
- package/dist/api/QetaClient.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerList.esm.js +0 -100
- package/dist/components/AnswersContainer/AnswerList.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswerListItem.esm.js +0 -87
- package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +0 -1
- package/dist/components/AnswersContainer/AnswersContainer.esm.js +0 -210
- package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +0 -1
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js +0 -34
- package/dist/components/AskAnonymouslyCheckbox/AskAnonymouslyCheckbox.esm.js.map +0 -1
- package/dist/components/AskForm/AskForm.esm.js +0 -245
- package/dist/components/AskForm/AskForm.esm.js.map +0 -1
- package/dist/components/AskForm/EntitiesInput.esm.js +0 -100
- package/dist/components/AskForm/EntitiesInput.esm.js.map +0 -1
- package/dist/components/AskForm/TagInput.esm.js +0 -81
- package/dist/components/AskForm/TagInput.esm.js.map +0 -1
- package/dist/components/Buttons/AskQuestionButton.esm.js +0 -45
- package/dist/components/Buttons/AskQuestionButton.esm.js.map +0 -1
- package/dist/components/Buttons/BackToQuestionsButton.esm.js +0 -39
- package/dist/components/Buttons/BackToQuestionsButton.esm.js.map +0 -1
- package/dist/components/Buttons/EntityFollowButton.esm.js +0 -34
- package/dist/components/Buttons/EntityFollowButton.esm.js.map +0 -1
- package/dist/components/Buttons/TagFollowButton.esm.js +0 -33
- package/dist/components/Buttons/TagFollowButton.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentList.esm.js +0 -47
- package/dist/components/CommentSection/CommentList.esm.js.map +0 -1
- package/dist/components/CommentSection/CommentSection.esm.js +0 -126
- package/dist/components/CommentSection/CommentSection.esm.js.map +0 -1
- package/dist/components/DeleteModal/DeleteModal.esm.js +0 -78
- package/dist/components/DeleteModal/DeleteModal.esm.js.map +0 -1
- package/dist/components/HomePageCards/ImpactCard.esm.js +0 -20
- package/dist/components/HomePageCards/ImpactCard.esm.js.map +0 -1
- package/dist/components/HomePageCards/QuestionsCard.esm.js +0 -21
- package/dist/components/HomePageCards/QuestionsCard.esm.js.map +0 -1
- package/dist/components/Links/Links.esm.js +0 -33
- package/dist/components/Links/Links.esm.js.map +0 -1
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +0 -78
- package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +0 -1
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +0 -37
- package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js +0 -43
- package/dist/components/QetaPage/FollowedEntitiesList.esm.js.map +0 -1
- package/dist/components/QetaPage/FollowedTagsList.esm.js +0 -56
- package/dist/components/QetaPage/FollowedTagsList.esm.js.map +0 -1
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js +0 -64
- package/dist/components/QuestionHighlightList/QuestionHighlightList.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerCard.esm.js +0 -113
- package/dist/components/QuestionPage/AnswerCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/AnswerForm.esm.js +0 -153
- package/dist/components/QuestionPage/AnswerForm.esm.js.map +0 -1
- package/dist/components/QuestionPage/AuthorBox.esm.js +0 -25
- package/dist/components/QuestionPage/AuthorBox.esm.js.map +0 -1
- package/dist/components/QuestionPage/EntityChip.esm.js +0 -27
- package/dist/components/QuestionPage/EntityChip.esm.js.map +0 -1
- package/dist/components/QuestionPage/FavoriteButton.esm.js +0 -45
- package/dist/components/QuestionPage/FavoriteButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/LinkButton.esm.js +0 -28
- package/dist/components/QuestionPage/LinkButton.esm.js.map +0 -1
- package/dist/components/QuestionPage/QuestionCard.esm.js +0 -107
- package/dist/components/QuestionPage/QuestionCard.esm.js.map +0 -1
- package/dist/components/QuestionPage/TagsAndEntities.esm.js +0 -44
- package/dist/components/QuestionPage/TagsAndEntities.esm.js.map +0 -1
- package/dist/components/QuestionPage/VoteButtons.esm.js +0 -153
- package/dist/components/QuestionPage/VoteButtons.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js +0 -21
- package/dist/components/QuestionTableCard/QuestionTableRow.esm.js.map +0 -1
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js +0 -130
- package/dist/components/QuestionTableCard/QuestionsTable.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js +0 -110
- package/dist/components/QuestionsContainer/DateRangeFilter.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/FilterPanel.esm.js +0 -237
- package/dist/components/QuestionsContainer/FilterPanel.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js +0 -47
- package/dist/components/QuestionsContainer/NoQuestionsCard.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionList.esm.js +0 -103
- package/dist/components/QuestionsContainer/QuestionList.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js +0 -123
- package/dist/components/QuestionsContainer/QuestionListItem.esm.js.map +0 -1
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js +0 -243
- package/dist/components/QuestionsContainer/QuestionsContainer.esm.js.map +0 -1
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +0 -22
- package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +0 -1
- package/dist/components/Statistics/StatsChart.esm.js +0 -60
- package/dist/components/Statistics/StatsChart.esm.js.map +0 -1
- package/dist/components/Statistics/SummaryStatsGrid.esm.js +0 -47
- package/dist/components/Statistics/SummaryStatsGrid.esm.js.map +0 -1
- package/dist/components/Statistics/TopRankingUsersCard.esm.js +0 -161
- package/dist/components/Statistics/TopRankingUsersCard.esm.js.map +0 -1
- package/dist/components/Statistics/TrophyIcon.esm.js +0 -19
- package/dist/components/Statistics/TrophyIcon.esm.js.map +0 -1
- package/dist/components/Statistics/styles.esm.js +0 -23
- package/dist/components/Statistics/styles.esm.js.map +0 -1
- package/dist/components/TagPage/TagsContainer.esm.js +0 -57
- package/dist/components/TagPage/TagsContainer.esm.js.map +0 -1
- package/dist/locale/fi.esm.js +0 -195
- package/dist/locale/fi.esm.js.map +0 -1
- package/dist/translation.esm.js +0 -359
- package/dist/translation.esm.js.map +0 -1
- package/dist/utils/hooks.esm.js +0 -430
- package/dist/utils/hooks.esm.js.map +0 -1
- package/dist/utils/utils.esm.js +0 -72
- package/dist/utils/utils.esm.js.map +0 -1
|
@@ -1,513 +0,0 @@
|
|
|
1
|
-
import { createApiRef } from '@backstage/core-plugin-api';
|
|
2
|
-
import { CustomErrorBase } from '@backstage/errors';
|
|
3
|
-
import omitBy from 'lodash/omitBy';
|
|
4
|
-
import isEmpty from 'lodash/isEmpty';
|
|
5
|
-
|
|
6
|
-
const qetaApiRef = createApiRef({
|
|
7
|
-
id: "plugin.qeta.service"
|
|
8
|
-
});
|
|
9
|
-
class QetaError extends CustomErrorBase {
|
|
10
|
-
errors;
|
|
11
|
-
constructor(message, errors) {
|
|
12
|
-
super(message);
|
|
13
|
-
this.errors = errors;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
class QetaClient {
|
|
17
|
-
fetchApi;
|
|
18
|
-
discoveryApi;
|
|
19
|
-
constructor(options) {
|
|
20
|
-
this.fetchApi = options.fetchApi;
|
|
21
|
-
this.discoveryApi = options.discoveryApi;
|
|
22
|
-
}
|
|
23
|
-
async getBaseUrl() {
|
|
24
|
-
return this.discoveryApi.getBaseUrl("qeta");
|
|
25
|
-
}
|
|
26
|
-
async getQuestions(options) {
|
|
27
|
-
const query = this.getQueryParameters(options).toString();
|
|
28
|
-
let url = `${await this.getBaseUrl()}/questions`;
|
|
29
|
-
if (query) {
|
|
30
|
-
url += `?${query}`;
|
|
31
|
-
}
|
|
32
|
-
const response = await this.fetchApi.fetch(url);
|
|
33
|
-
if (response.status === 403) {
|
|
34
|
-
return { questions: [], total: 0 };
|
|
35
|
-
}
|
|
36
|
-
const data = await response.json();
|
|
37
|
-
if ("errors" in data) {
|
|
38
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
39
|
-
}
|
|
40
|
-
return data;
|
|
41
|
-
}
|
|
42
|
-
async getQuestionsList(type, options) {
|
|
43
|
-
const query = this.getQueryParameters(options).toString();
|
|
44
|
-
let url = `${await this.getBaseUrl()}/questions/list/${type}`;
|
|
45
|
-
if (query) {
|
|
46
|
-
url += `?${query}`;
|
|
47
|
-
}
|
|
48
|
-
const response = await this.fetchApi.fetch(url);
|
|
49
|
-
if (response.status === 403) {
|
|
50
|
-
return { questions: [], total: 0 };
|
|
51
|
-
}
|
|
52
|
-
const data = await response.json();
|
|
53
|
-
if ("errors" in data) {
|
|
54
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
55
|
-
}
|
|
56
|
-
return data;
|
|
57
|
-
}
|
|
58
|
-
async postQuestion(question) {
|
|
59
|
-
const response = await this.fetchApi.fetch(
|
|
60
|
-
`${await this.getBaseUrl()}/questions`,
|
|
61
|
-
{
|
|
62
|
-
method: "POST",
|
|
63
|
-
body: JSON.stringify(question),
|
|
64
|
-
headers: { "Content-Type": "application/json" }
|
|
65
|
-
}
|
|
66
|
-
);
|
|
67
|
-
const data = await response.json();
|
|
68
|
-
if ("errors" in data) {
|
|
69
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
70
|
-
}
|
|
71
|
-
return data;
|
|
72
|
-
}
|
|
73
|
-
async commentQuestion(id, content) {
|
|
74
|
-
const response = await this.fetchApi.fetch(
|
|
75
|
-
`${await this.getBaseUrl()}/questions/${id}/comments`,
|
|
76
|
-
{
|
|
77
|
-
method: "POST",
|
|
78
|
-
body: JSON.stringify({ content }),
|
|
79
|
-
headers: { "Content-Type": "application/json" }
|
|
80
|
-
}
|
|
81
|
-
);
|
|
82
|
-
const data = await response.json();
|
|
83
|
-
if ("errors" in data) {
|
|
84
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
85
|
-
}
|
|
86
|
-
return data;
|
|
87
|
-
}
|
|
88
|
-
async deleteQuestionComment(questionId, id) {
|
|
89
|
-
const response = await this.fetchApi.fetch(
|
|
90
|
-
`${await this.getBaseUrl()}/questions/${questionId}/comments/${id}`,
|
|
91
|
-
{
|
|
92
|
-
method: "DELETE"
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
const data = await response.json();
|
|
96
|
-
if ("errors" in data) {
|
|
97
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
98
|
-
}
|
|
99
|
-
return data;
|
|
100
|
-
}
|
|
101
|
-
async getQuestion(id) {
|
|
102
|
-
if (!id) {
|
|
103
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
104
|
-
}
|
|
105
|
-
const response = await this.fetchApi.fetch(
|
|
106
|
-
`${await this.getBaseUrl()}/questions/${id}`
|
|
107
|
-
);
|
|
108
|
-
const data = await response.json();
|
|
109
|
-
if ("errors" in data) {
|
|
110
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
111
|
-
}
|
|
112
|
-
return data;
|
|
113
|
-
}
|
|
114
|
-
async getTags() {
|
|
115
|
-
const response = await this.fetchApi.fetch(
|
|
116
|
-
`${await this.getBaseUrl()}/tags`
|
|
117
|
-
);
|
|
118
|
-
return await response.json();
|
|
119
|
-
}
|
|
120
|
-
async getEntities() {
|
|
121
|
-
const response = await this.fetchApi.fetch(
|
|
122
|
-
`${await this.getBaseUrl()}/entities`
|
|
123
|
-
);
|
|
124
|
-
return await response.json();
|
|
125
|
-
}
|
|
126
|
-
async voteQuestionUp(id) {
|
|
127
|
-
if (!id) {
|
|
128
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
129
|
-
}
|
|
130
|
-
const response = await this.fetchApi.fetch(
|
|
131
|
-
`${await this.getBaseUrl()}/questions/${id}/upvote`
|
|
132
|
-
);
|
|
133
|
-
const data = await response.json();
|
|
134
|
-
if ("errors" in data) {
|
|
135
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
136
|
-
}
|
|
137
|
-
return data;
|
|
138
|
-
}
|
|
139
|
-
async voteQuestionDown(id) {
|
|
140
|
-
if (!id) {
|
|
141
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
142
|
-
}
|
|
143
|
-
const response = await this.fetchApi.fetch(
|
|
144
|
-
`${await this.getBaseUrl()}/questions/${id}/downvote`
|
|
145
|
-
);
|
|
146
|
-
const data = await response.json();
|
|
147
|
-
if ("errors" in data) {
|
|
148
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
149
|
-
}
|
|
150
|
-
return data;
|
|
151
|
-
}
|
|
152
|
-
async favoriteQuestion(id) {
|
|
153
|
-
if (!id) {
|
|
154
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
155
|
-
}
|
|
156
|
-
const response = await this.fetchApi.fetch(
|
|
157
|
-
`${await this.getBaseUrl()}/questions/${id}/favorite`
|
|
158
|
-
);
|
|
159
|
-
const data = await response.json();
|
|
160
|
-
if ("errors" in data) {
|
|
161
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
162
|
-
}
|
|
163
|
-
return data;
|
|
164
|
-
}
|
|
165
|
-
async unfavoriteQuestion(id) {
|
|
166
|
-
if (!id) {
|
|
167
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
168
|
-
}
|
|
169
|
-
const response = await this.fetchApi.fetch(
|
|
170
|
-
`${await this.getBaseUrl()}/questions/${id}/unfavorite`
|
|
171
|
-
);
|
|
172
|
-
const data = await response.json();
|
|
173
|
-
if ("errors" in data) {
|
|
174
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
175
|
-
}
|
|
176
|
-
return data;
|
|
177
|
-
}
|
|
178
|
-
async postAnswer(answer) {
|
|
179
|
-
const response = await this.fetchApi.fetch(
|
|
180
|
-
`${await this.getBaseUrl()}/questions/${answer.questionId}/answers`,
|
|
181
|
-
{
|
|
182
|
-
method: "POST",
|
|
183
|
-
body: JSON.stringify({
|
|
184
|
-
answer: answer.answer,
|
|
185
|
-
images: answer.images,
|
|
186
|
-
anonymous: answer.anonymous
|
|
187
|
-
}),
|
|
188
|
-
headers: { "Content-Type": "application/json" }
|
|
189
|
-
}
|
|
190
|
-
);
|
|
191
|
-
const data = await response.json();
|
|
192
|
-
if ("errors" in data) {
|
|
193
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
194
|
-
}
|
|
195
|
-
return data;
|
|
196
|
-
}
|
|
197
|
-
async commentAnswer(questionId, id, content) {
|
|
198
|
-
const response = await this.fetchApi.fetch(
|
|
199
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/comments`,
|
|
200
|
-
{
|
|
201
|
-
method: "POST",
|
|
202
|
-
body: JSON.stringify({ content }),
|
|
203
|
-
headers: { "Content-Type": "application/json" }
|
|
204
|
-
}
|
|
205
|
-
);
|
|
206
|
-
const data = await response.json();
|
|
207
|
-
if ("errors" in data) {
|
|
208
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
209
|
-
}
|
|
210
|
-
return data;
|
|
211
|
-
}
|
|
212
|
-
async deleteAnswerComment(questionId, answerId, id) {
|
|
213
|
-
const response = await this.fetchApi.fetch(
|
|
214
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${answerId}/comments/${id}`,
|
|
215
|
-
{
|
|
216
|
-
method: "DELETE"
|
|
217
|
-
}
|
|
218
|
-
);
|
|
219
|
-
const data = await response.json();
|
|
220
|
-
if ("errors" in data) {
|
|
221
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
222
|
-
}
|
|
223
|
-
return data;
|
|
224
|
-
}
|
|
225
|
-
async voteAnswerUp(questionId, id) {
|
|
226
|
-
if (!id || !questionId) {
|
|
227
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
228
|
-
}
|
|
229
|
-
const response = await this.fetchApi.fetch(
|
|
230
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/upvote`
|
|
231
|
-
);
|
|
232
|
-
const data = await response.json();
|
|
233
|
-
if ("errors" in data) {
|
|
234
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
235
|
-
}
|
|
236
|
-
return data;
|
|
237
|
-
}
|
|
238
|
-
async voteAnswerDown(questionId, id) {
|
|
239
|
-
if (!id || !questionId) {
|
|
240
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
241
|
-
}
|
|
242
|
-
const response = await this.fetchApi.fetch(
|
|
243
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/downvote`
|
|
244
|
-
);
|
|
245
|
-
const data = await response.json();
|
|
246
|
-
if ("errors" in data) {
|
|
247
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
248
|
-
}
|
|
249
|
-
return data;
|
|
250
|
-
}
|
|
251
|
-
async markAnswerCorrect(questionId, id) {
|
|
252
|
-
if (!id || !questionId) {
|
|
253
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
254
|
-
}
|
|
255
|
-
const response = await this.fetchApi.fetch(
|
|
256
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/correct`
|
|
257
|
-
);
|
|
258
|
-
const data = await response;
|
|
259
|
-
return data.ok;
|
|
260
|
-
}
|
|
261
|
-
async markAnswerIncorrect(questionId, id) {
|
|
262
|
-
if (!id || !questionId) {
|
|
263
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
264
|
-
}
|
|
265
|
-
const response = await this.fetchApi.fetch(
|
|
266
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/incorrect`
|
|
267
|
-
);
|
|
268
|
-
const data = await response;
|
|
269
|
-
return data.ok;
|
|
270
|
-
}
|
|
271
|
-
async deleteQuestion(questionId) {
|
|
272
|
-
if (!questionId) {
|
|
273
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
274
|
-
}
|
|
275
|
-
const response = await this.fetchApi.fetch(
|
|
276
|
-
`${await this.getBaseUrl()}/questions/${questionId}`,
|
|
277
|
-
{
|
|
278
|
-
method: "DELETE"
|
|
279
|
-
}
|
|
280
|
-
);
|
|
281
|
-
const data = await response;
|
|
282
|
-
return data.ok;
|
|
283
|
-
}
|
|
284
|
-
async deleteAnswer(questionId, id) {
|
|
285
|
-
if (!questionId || !id) {
|
|
286
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
287
|
-
}
|
|
288
|
-
const response = await this.fetchApi.fetch(
|
|
289
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,
|
|
290
|
-
{
|
|
291
|
-
method: "DELETE"
|
|
292
|
-
}
|
|
293
|
-
);
|
|
294
|
-
const data = await response;
|
|
295
|
-
return data.ok;
|
|
296
|
-
}
|
|
297
|
-
async updateQuestion(id, question) {
|
|
298
|
-
const response = await this.fetchApi.fetch(
|
|
299
|
-
`${await this.getBaseUrl()}/questions/${id}`,
|
|
300
|
-
{
|
|
301
|
-
method: "POST",
|
|
302
|
-
body: JSON.stringify(question),
|
|
303
|
-
headers: { "Content-Type": "application/json" }
|
|
304
|
-
}
|
|
305
|
-
);
|
|
306
|
-
const data = await response.json();
|
|
307
|
-
if ("errors" in data) {
|
|
308
|
-
throw new QetaError("Failed to update", data.errors);
|
|
309
|
-
}
|
|
310
|
-
return data;
|
|
311
|
-
}
|
|
312
|
-
async updateAnswer(id, answer) {
|
|
313
|
-
const response = await this.fetchApi.fetch(
|
|
314
|
-
`${await this.getBaseUrl()}/questions/${answer.questionId}/answers/${id}`,
|
|
315
|
-
{
|
|
316
|
-
method: "POST",
|
|
317
|
-
body: JSON.stringify({ answer: answer.answer, images: answer.images }),
|
|
318
|
-
headers: { "Content-Type": "application/json" }
|
|
319
|
-
}
|
|
320
|
-
);
|
|
321
|
-
const data = await response.json();
|
|
322
|
-
if ("errors" in data) {
|
|
323
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
324
|
-
}
|
|
325
|
-
return data;
|
|
326
|
-
}
|
|
327
|
-
async getAnswers(options) {
|
|
328
|
-
const query = this.getQueryParameters(options).toString();
|
|
329
|
-
let url = `${await this.getBaseUrl()}/answers`;
|
|
330
|
-
if (query) {
|
|
331
|
-
url += `?${query}`;
|
|
332
|
-
}
|
|
333
|
-
const response = await this.fetchApi.fetch(url);
|
|
334
|
-
if (response.status === 403) {
|
|
335
|
-
return { answers: [], total: 0 };
|
|
336
|
-
}
|
|
337
|
-
const data = await response.json();
|
|
338
|
-
if ("errors" in data) {
|
|
339
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
340
|
-
}
|
|
341
|
-
return data;
|
|
342
|
-
}
|
|
343
|
-
async getAnswer(questionId, id) {
|
|
344
|
-
if (!questionId || !id) {
|
|
345
|
-
throw new QetaError("Invalid id provided", void 0);
|
|
346
|
-
}
|
|
347
|
-
const response = await this.fetchApi.fetch(
|
|
348
|
-
`${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`
|
|
349
|
-
);
|
|
350
|
-
const data = await response.json();
|
|
351
|
-
if ("errors" in data) {
|
|
352
|
-
throw new QetaError("Failed to fetch", data.errors);
|
|
353
|
-
}
|
|
354
|
-
return data;
|
|
355
|
-
}
|
|
356
|
-
async getFollowedTags() {
|
|
357
|
-
const response = await this.fetchApi.fetch(
|
|
358
|
-
`${await this.getBaseUrl()}/tags/followed`
|
|
359
|
-
);
|
|
360
|
-
return await response.json();
|
|
361
|
-
}
|
|
362
|
-
async followTag(tag) {
|
|
363
|
-
const response = await this.fetchApi.fetch(
|
|
364
|
-
`${await this.getBaseUrl()}/tags/follow/${tag}`,
|
|
365
|
-
{
|
|
366
|
-
method: "PUT"
|
|
367
|
-
}
|
|
368
|
-
);
|
|
369
|
-
return response.ok;
|
|
370
|
-
}
|
|
371
|
-
async unfollowTag(tag) {
|
|
372
|
-
const response = await this.fetchApi.fetch(
|
|
373
|
-
`${await this.getBaseUrl()}/tags/follow/${tag}`,
|
|
374
|
-
{
|
|
375
|
-
method: "DELETE"
|
|
376
|
-
}
|
|
377
|
-
);
|
|
378
|
-
return response.ok;
|
|
379
|
-
}
|
|
380
|
-
async getFollowedEntities() {
|
|
381
|
-
const response = await this.fetchApi.fetch(
|
|
382
|
-
`${await this.getBaseUrl()}/entities/followed`
|
|
383
|
-
);
|
|
384
|
-
return await response.json();
|
|
385
|
-
}
|
|
386
|
-
async followEntity(entityRef) {
|
|
387
|
-
const response = await this.fetchApi.fetch(
|
|
388
|
-
`${await this.getBaseUrl()}/entities/follow/${entityRef}`,
|
|
389
|
-
{
|
|
390
|
-
method: "PUT"
|
|
391
|
-
}
|
|
392
|
-
);
|
|
393
|
-
return response.ok;
|
|
394
|
-
}
|
|
395
|
-
async unfollowEntity(entityRef) {
|
|
396
|
-
const response = await this.fetchApi.fetch(
|
|
397
|
-
`${await this.getBaseUrl()}/entities/follow/${entityRef}`,
|
|
398
|
-
{
|
|
399
|
-
method: "DELETE"
|
|
400
|
-
}
|
|
401
|
-
);
|
|
402
|
-
return response.ok;
|
|
403
|
-
}
|
|
404
|
-
async postAttachment(file) {
|
|
405
|
-
const qetaUrl = `${await this.getBaseUrl()}/attachments`;
|
|
406
|
-
const formData = new FormData();
|
|
407
|
-
formData.append("image", file);
|
|
408
|
-
const requestOptions = {
|
|
409
|
-
method: "POST",
|
|
410
|
-
body: formData
|
|
411
|
-
};
|
|
412
|
-
const response = await this.fetchApi.fetch(qetaUrl, requestOptions);
|
|
413
|
-
return await response.json();
|
|
414
|
-
}
|
|
415
|
-
async getMostUpvotedAnswers(options) {
|
|
416
|
-
const query = this.getQueryParameters(options.options).toString();
|
|
417
|
-
let url = `${await this.getBaseUrl()}/statistics/answers/top-upvoted-users`;
|
|
418
|
-
if (query) {
|
|
419
|
-
url += `?${query}`;
|
|
420
|
-
}
|
|
421
|
-
const response = await this.fetchApi.fetch(url);
|
|
422
|
-
const data = await response.json();
|
|
423
|
-
return data;
|
|
424
|
-
}
|
|
425
|
-
async getMostUpvotedCorrectAnswers(options) {
|
|
426
|
-
const query = this.getQueryParameters(options.options).toString();
|
|
427
|
-
let url = `${await this.getBaseUrl()}/statistics/answers/top-correct-upvoted-users`;
|
|
428
|
-
if (query) {
|
|
429
|
-
url += `?${query}`;
|
|
430
|
-
}
|
|
431
|
-
const response = await this.fetchApi.fetch(url);
|
|
432
|
-
const data = await response.json();
|
|
433
|
-
return data;
|
|
434
|
-
}
|
|
435
|
-
async getMostUpvotedQuestions(options) {
|
|
436
|
-
const query = this.getQueryParameters(options.options).toString();
|
|
437
|
-
let url = `${await this.getBaseUrl()}/statistics/questions/top-upvoted-users`;
|
|
438
|
-
if (query) {
|
|
439
|
-
url += `?${query}`;
|
|
440
|
-
}
|
|
441
|
-
const response = await this.fetchApi.fetch(url);
|
|
442
|
-
const data = await response.json();
|
|
443
|
-
return data;
|
|
444
|
-
}
|
|
445
|
-
async getMostQuestions(options) {
|
|
446
|
-
const query = this.getQueryParameters(options.options).toString();
|
|
447
|
-
let url = `${await this.getBaseUrl()}/statistics/questions/most-questions`;
|
|
448
|
-
if (query) {
|
|
449
|
-
url += `?${query}`;
|
|
450
|
-
}
|
|
451
|
-
const response = await this.fetchApi.fetch(url);
|
|
452
|
-
const data = await response.json();
|
|
453
|
-
return data;
|
|
454
|
-
}
|
|
455
|
-
async getMostAnswers(options) {
|
|
456
|
-
const query = this.getQueryParameters(options.options).toString();
|
|
457
|
-
let url = `${await this.getBaseUrl()}/statistics/answers/most-answers`;
|
|
458
|
-
if (query) {
|
|
459
|
-
url += `?${query}`;
|
|
460
|
-
}
|
|
461
|
-
const response = await this.fetchApi.fetch(url);
|
|
462
|
-
const data = await response.json();
|
|
463
|
-
return data;
|
|
464
|
-
}
|
|
465
|
-
async getTopStatisticsHomepage(options) {
|
|
466
|
-
const response = await Promise.all([
|
|
467
|
-
this.getMostQuestions(options),
|
|
468
|
-
this.getMostAnswers(options),
|
|
469
|
-
this.getMostUpvotedQuestions(options),
|
|
470
|
-
this.getMostUpvotedAnswers(options),
|
|
471
|
-
this.getMostUpvotedCorrectAnswers(options)
|
|
472
|
-
]);
|
|
473
|
-
return response;
|
|
474
|
-
}
|
|
475
|
-
async getUserImpact() {
|
|
476
|
-
const response = await this.fetchApi.fetch(
|
|
477
|
-
`${await this.getBaseUrl()}/statistics/user/impact`
|
|
478
|
-
);
|
|
479
|
-
return await response.json();
|
|
480
|
-
}
|
|
481
|
-
async getGlobalStats() {
|
|
482
|
-
const response = await this.fetchApi.fetch(
|
|
483
|
-
`${await this.getBaseUrl()}/statistics/global`
|
|
484
|
-
);
|
|
485
|
-
return await response.json();
|
|
486
|
-
}
|
|
487
|
-
async getUserStats(userRef) {
|
|
488
|
-
const response = await this.fetchApi.fetch(
|
|
489
|
-
`${await this.getBaseUrl()}/statistics/user/${userRef}`
|
|
490
|
-
);
|
|
491
|
-
return await response.json();
|
|
492
|
-
}
|
|
493
|
-
getQueryParameters(params) {
|
|
494
|
-
if (!params) {
|
|
495
|
-
return new URLSearchParams();
|
|
496
|
-
}
|
|
497
|
-
const asStrings = Object.fromEntries(
|
|
498
|
-
Object.entries(params).map(([k, v]) => {
|
|
499
|
-
if (!v) {
|
|
500
|
-
return [k, ""];
|
|
501
|
-
}
|
|
502
|
-
if (Array.isArray(v)) {
|
|
503
|
-
return [k, v.join(",")];
|
|
504
|
-
}
|
|
505
|
-
return [k, `${v}`];
|
|
506
|
-
})
|
|
507
|
-
);
|
|
508
|
-
return new URLSearchParams(omitBy(asStrings, isEmpty));
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
export { QetaClient, QetaError, qetaApiRef };
|
|
513
|
-
//# sourceMappingURL=QetaClient.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QetaClient.esm.js","sources":["../../src/api/QetaClient.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { GetAnswersOptions, GetQuestionsOptions, QetaApi } from './QetaApi';\nimport {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport { CustomErrorBase } from '@backstage/errors';\nimport {\n Answer,\n AnswerRequest,\n AnswerResponseBody,\n AnswersResponse,\n AnswersResponseBody,\n AttachmentResponseBody,\n EntityResponse,\n ImpactResponse,\n Question,\n QuestionRequest,\n QuestionResponseBody,\n QuestionsResponse,\n QuestionsResponseBody,\n StatisticResponse,\n StatisticsRequestParameters,\n StatisticsResponse,\n TagResponse,\n UserEntitiesResponse,\n UserTagsResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport omitBy from 'lodash/omitBy';\nimport isEmpty from 'lodash/isEmpty';\n\nexport const qetaApiRef = createApiRef<QetaApi>({\n id: 'plugin.qeta.service',\n});\n\nexport class QetaError extends CustomErrorBase {\n public errors: null | undefined | any[];\n\n constructor(message: string, errors: null | undefined | any[]) {\n super(message);\n\n this.errors = errors;\n }\n}\n\nexport class QetaClient implements QetaApi {\n private readonly fetchApi: FetchApi;\n private readonly discoveryApi: DiscoveryApi;\n\n constructor(options: { fetchApi: FetchApi; discoveryApi: DiscoveryApi }) {\n this.fetchApi = options.fetchApi;\n this.discoveryApi = options.discoveryApi;\n }\n\n async getBaseUrl(): Promise<string> {\n return this.discoveryApi.getBaseUrl('qeta');\n }\n\n async getQuestions(options: GetQuestionsOptions): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/questions`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestionsList(\n type: string,\n options?: GetQuestionsOptions,\n ): Promise<QuestionsResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/questions/list/${type}`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { questions: [], total: 0 };\n }\n\n const data = (await response.json()) as QuestionsResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postQuestion(question: QuestionRequest): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentQuestion(id: number, content: string): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteQuestionComment(\n questionId: number,\n id: number,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getQuestion(id?: string): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n );\n\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getTags(): Promise<TagResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags`,\n );\n return (await response.json()) as TagResponse[];\n }\n\n async getEntities(): Promise<EntityResponse[]> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities`,\n );\n return (await response.json()) as EntityResponse[];\n }\n\n async voteQuestionUp(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/upvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteQuestionDown(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/downvote`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async favoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/favorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async unfavoriteQuestion(id: number): Promise<Question> {\n if (!id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}/unfavorite`,\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async postAnswer(answer: AnswerRequest): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers`,\n {\n method: 'POST',\n body: JSON.stringify({\n answer: answer.answer,\n images: answer.images,\n anonymous: answer.anonymous,\n }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async commentAnswer(\n questionId: number,\n id: number,\n content: string,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/comments`,\n {\n method: 'POST',\n body: JSON.stringify({ content }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async deleteAnswerComment(\n questionId: number,\n answerId: number,\n id: number,\n ): Promise<Answer> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${answerId}/comments/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerUp(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/upvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async voteAnswerDown(questionId: number, id: number): Promise<Answer> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/downvote`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async markAnswerCorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/correct`,\n );\n const data = await response;\n return data.ok;\n }\n\n async markAnswerIncorrect(questionId: number, id: number): Promise<boolean> {\n if (!id || !questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}/incorrect`,\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteQuestion(questionId: number): Promise<boolean> {\n if (!questionId) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async deleteAnswer(questionId: number, id: number): Promise<boolean> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n {\n method: 'DELETE',\n },\n );\n const data = await response;\n return data.ok;\n }\n\n async updateQuestion(\n id: string,\n question: QuestionRequest,\n ): Promise<Question> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${id}`,\n {\n method: 'POST',\n body: JSON.stringify(question),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as QuestionResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to update', data.errors);\n }\n\n return data;\n }\n\n async updateAnswer(\n id: number,\n answer: AnswerRequest,\n ): Promise<AnswerResponseBody> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${answer.questionId}/answers/${id}`,\n {\n method: 'POST',\n body: JSON.stringify({ answer: answer.answer, images: answer.images }),\n headers: { 'Content-Type': 'application/json' },\n },\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswers(options: GetAnswersOptions): Promise<AnswersResponse> {\n const query = this.getQueryParameters(options).toString();\n\n let url = `${await this.getBaseUrl()}/answers`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n if (response.status === 403) {\n return { answers: [], total: 0 };\n }\n const data = (await response.json()) as AnswersResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getAnswer(\n questionId: string | number | undefined,\n id: string | number | undefined,\n ): Promise<AnswerResponseBody> {\n if (!questionId || !id) {\n throw new QetaError('Invalid id provided', undefined);\n }\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/questions/${questionId}/answers/${id}`,\n );\n const data = (await response.json()) as AnswerResponseBody;\n\n if ('errors' in data) {\n throw new QetaError('Failed to fetch', data.errors);\n }\n\n return data;\n }\n\n async getFollowedTags(): Promise<UserTagsResponse> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags/followed`,\n );\n return (await response.json()) as UserTagsResponse;\n }\n\n async followTag(tag: string): Promise<boolean> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags/follow/${tag}`,\n {\n method: 'PUT',\n },\n );\n return response.ok;\n }\n\n async unfollowTag(tag: string): Promise<boolean> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/tags/follow/${tag}`,\n {\n method: 'DELETE',\n },\n );\n return response.ok;\n }\n\n async getFollowedEntities(): Promise<UserEntitiesResponse> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities/followed`,\n );\n return (await response.json()) as UserEntitiesResponse;\n }\n\n async followEntity(entityRef: string): Promise<boolean> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities/follow/${entityRef}`,\n {\n method: 'PUT',\n },\n );\n return response.ok;\n }\n\n async unfollowEntity(entityRef: string): Promise<boolean> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/entities/follow/${entityRef}`,\n {\n method: 'DELETE',\n },\n );\n return response.ok;\n }\n\n async postAttachment(file: Blob): Promise<AttachmentResponseBody> {\n const qetaUrl = `${await this.getBaseUrl()}/attachments`;\n const formData = new FormData();\n\n formData.append('image', file);\n\n const requestOptions = {\n method: 'POST',\n body: formData,\n };\n\n const response = await this.fetchApi.fetch(qetaUrl, requestOptions);\n return (await response.json()) as AttachmentResponseBody;\n }\n\n async getMostUpvotedAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n\n let url = `${await this.getBaseUrl()}/statistics/answers/top-upvoted-users`;\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedCorrectAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/top-correct-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostUpvotedQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/top-upvoted-users`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostQuestions(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/questions/most-questions`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getMostAnswers(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse> {\n const query = this.getQueryParameters(options.options).toString();\n let url = `${await this.getBaseUrl()}/statistics/answers/most-answers`;\n\n if (query) {\n url += `?${query}`;\n }\n\n const response = await this.fetchApi.fetch(url);\n\n const data = (await response.json()) as StatisticResponse;\n\n return data;\n }\n\n async getTopStatisticsHomepage(\n options: StatisticsRequestParameters,\n ): Promise<StatisticResponse[]> {\n const response = await Promise.all([\n this.getMostQuestions(options),\n this.getMostAnswers(options),\n this.getMostUpvotedQuestions(options),\n this.getMostUpvotedAnswers(options),\n this.getMostUpvotedCorrectAnswers(options),\n ]);\n\n return response;\n }\n\n async getUserImpact(): Promise<ImpactResponse> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/statistics/user/impact`,\n );\n\n return (await response.json()) as ImpactResponse;\n }\n\n async getGlobalStats(): Promise<StatisticsResponse> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/statistics/global`,\n );\n return (await response.json()) as StatisticsResponse;\n }\n\n async getUserStats(userRef: string): Promise<StatisticsResponse> {\n const response = await this.fetchApi.fetch(\n `${await this.getBaseUrl()}/statistics/user/${userRef}`,\n );\n return (await response.json()) as StatisticsResponse;\n }\n\n private getQueryParameters(params?: any): URLSearchParams {\n if (!params) {\n return new URLSearchParams();\n }\n const asStrings = Object.fromEntries(\n Object.entries(params).map(([k, v]) => {\n if (!v) {\n return [k, ''];\n }\n if (Array.isArray(v)) {\n return [k, v.join(',')];\n }\n return [k, `${v}`];\n }),\n );\n return new URLSearchParams(omitBy(asStrings, isEmpty));\n }\n}\n"],"names":[],"mappings":"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"}
|