@up-im/medotvet_sdk 0.0.3 → 0.0.4
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/README.md +229 -1
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/test.d.ts +41 -0
- package/dist/api/test.js +58 -0
- package/dist/http/apiRoute.d.ts +4 -0
- package/dist/http/apiRoute.js +6 -1
- package/dist/interfaces/iUserSurvey.d.ts +2 -9
- package/dist/interfaces/iUserSurvey.js +0 -9
- package/dist/interfaces/userSurveyStatus.d.ts +9 -0
- package/dist/interfaces/userSurveyStatus.js +10 -0
- package/package.json +1 -1
- package/src/api/index.ts +2 -0
- package/src/api/test.ts +78 -0
- package/src/http/apiRoute.ts +7 -1
- package/src/interfaces/iUserSurvey.ts +2 -10
- package/src/interfaces/userSurveyStatus.ts +10 -0
package/README.md
CHANGED
|
@@ -132,5 +132,233 @@ const client = createClient({
|
|
|
132
132
|
### promocode
|
|
133
133
|
- `activate(code)` — активировать промокод, ответ `{ sum }`; требует токен.
|
|
134
134
|
|
|
135
|
+
### test (верификационный тест по специальности)
|
|
136
|
+
- `getQuestions()` — получить вопросы для теста верификации. Вопросы
|
|
137
|
+
выбираются на основе специализаций пользователя (по 4 на каждую).
|
|
138
|
+
Возвращает `{ questions: iTestQuestionForUser[] }`.
|
|
139
|
+
- `submit(answers: iTestUserAnswer[])` — отправить результаты теста.
|
|
140
|
+
`answers` — массив ответов с полями `specialization`, `questionIndex`,
|
|
141
|
+
`answer_indices`, `answer_time?`. Возвращает `{ success, passed, message }`.
|
|
142
|
+
- `getResults()` — получить результаты последнего теста. Возвращает
|
|
143
|
+
`{ hasResults, message?, testDate?, results?, passed? }`. Если
|
|
144
|
+
`hasResults=false` — тест ещё не проходился.
|
|
145
|
+
- `getStatus()` — проверить статус прохождения теста. Возвращает
|
|
146
|
+
`{ testPassed, testDate, canTakeTest }`. `canTakeTest` всегда `true` —
|
|
147
|
+
тест можно проходить неограниченно.
|
|
148
|
+
|
|
135
149
|
### geoIp
|
|
136
|
-
- `detect()` — определить город по IP.
|
|
150
|
+
- `detect()` — определить город по IP.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Модели данных
|
|
155
|
+
|
|
156
|
+
### iUser
|
|
157
|
+
```ts
|
|
158
|
+
interface iUser {
|
|
159
|
+
id: number
|
|
160
|
+
register_date: string | null
|
|
161
|
+
role: UserRoleValue // 0-пользователь, 1-модератор, 2-админ
|
|
162
|
+
phone: string | null
|
|
163
|
+
phone_confirm: boolean
|
|
164
|
+
email: string | null
|
|
165
|
+
email_confirm: boolean
|
|
166
|
+
firstname: string
|
|
167
|
+
lastname: string
|
|
168
|
+
middlename: string
|
|
169
|
+
photo: string
|
|
170
|
+
city: iCity | null
|
|
171
|
+
specialization: number[] | null // специализации врача
|
|
172
|
+
birthdate: string | null
|
|
173
|
+
workplace_type: number | null // тип учреждения (ID)
|
|
174
|
+
workplace_name: string | null // название учреждения
|
|
175
|
+
diploma_status: DiplomaStatusValue // 1-не загружен, 2-проверка, 3-принят, 4-отклонён
|
|
176
|
+
diploma_files: string[] | null
|
|
177
|
+
diploma_reject_reason: string | null
|
|
178
|
+
test_status: number | null // 1-не пройден, 2-пройден (TestStatus)
|
|
179
|
+
ref: iUserData | null // пригласивший пользователь
|
|
180
|
+
my_ref_code: string | null // рефкод для приглашения других
|
|
181
|
+
agreement: boolean | null
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### iSurvey
|
|
186
|
+
```ts
|
|
187
|
+
interface iSurvey {
|
|
188
|
+
id: number
|
|
189
|
+
node: number
|
|
190
|
+
title: string
|
|
191
|
+
partner: number | null
|
|
192
|
+
budget: number
|
|
193
|
+
budget_min: number
|
|
194
|
+
date_start: string | null
|
|
195
|
+
date_end: string | null
|
|
196
|
+
reward_base: number // базовое вознаграждение (50%)
|
|
197
|
+
reward_max: number // макс. вознаграждение (100%)
|
|
198
|
+
questions: iSurveyQuestion[] | null
|
|
199
|
+
slots: number // всего мест
|
|
200
|
+
slots_taken?: number // занято мест
|
|
201
|
+
specialization: iRefItem[] | null // {id, title}[]
|
|
202
|
+
city: iRefItem[] | null // только эти города
|
|
203
|
+
city_not: iRefItem[] | null // кроме этих городов
|
|
204
|
+
promo_title: string
|
|
205
|
+
promo_subtitle: string
|
|
206
|
+
promo_image: string
|
|
207
|
+
promo_text: string
|
|
208
|
+
promo_disclaimer: string
|
|
209
|
+
text: string
|
|
210
|
+
text_full: string
|
|
211
|
+
public: boolean
|
|
212
|
+
priority?: number // 1-4 для спецразмещения
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### iUserSurvey
|
|
217
|
+
```ts
|
|
218
|
+
const UserSurveyStatus = {
|
|
219
|
+
queue: 0, // в очереди
|
|
220
|
+
in_progress: 1, // в процессе
|
|
221
|
+
success: 2, // завершён
|
|
222
|
+
cancelled: 3, // отменён
|
|
223
|
+
timeout: 4 // таймаут
|
|
224
|
+
} as const
|
|
225
|
+
|
|
226
|
+
interface iUserSurvey {
|
|
227
|
+
id: number
|
|
228
|
+
reg_date: string
|
|
229
|
+
user: number
|
|
230
|
+
survey: number
|
|
231
|
+
status: UserSurveyStatusValue
|
|
232
|
+
date_start: string | null
|
|
233
|
+
date_end: string | null
|
|
234
|
+
timeout_at: string | null
|
|
235
|
+
survey_title?: string
|
|
236
|
+
reward_base?: number
|
|
237
|
+
reward_max?: number
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### iPayment
|
|
242
|
+
```ts
|
|
243
|
+
interface iPayment {
|
|
244
|
+
id: number
|
|
245
|
+
reg_date: string
|
|
246
|
+
status: PaymentStatusValue // 1-ожидание, 2-завершено, 3-ошибка, 4-отмена
|
|
247
|
+
pay_type: PaymentTypeValue // 1-начисление, 2-выплата
|
|
248
|
+
title: string
|
|
249
|
+
receipt: number | null
|
|
250
|
+
receipt_product: number | null
|
|
251
|
+
catalog: number | null
|
|
252
|
+
sku: number | null
|
|
253
|
+
shop: number | null
|
|
254
|
+
cashback_level: 0 | 1 | 2 | 3
|
|
255
|
+
max_cashback_level: null | 0 | 1 | 2 | 3
|
|
256
|
+
payout_type: PayoutTypeValue | null // 1-СБП, 2-карта
|
|
257
|
+
last_error: string
|
|
258
|
+
price: number // >0 начисление, <0 списание
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### iBalance
|
|
263
|
+
```ts
|
|
264
|
+
interface iBalance {
|
|
265
|
+
accrued: number // всего начислено
|
|
266
|
+
paid: number // всего выплачено
|
|
267
|
+
invite_user: number // начислено от рефералов
|
|
268
|
+
balance: number // текущий баланс
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### iPush
|
|
273
|
+
```ts
|
|
274
|
+
interface iPush {
|
|
275
|
+
id: number
|
|
276
|
+
reg_date: string
|
|
277
|
+
send_date: string | null
|
|
278
|
+
user: number
|
|
279
|
+
status: PushStatusValue // 1-ожидание, 2-отправлено, 3-ошибка
|
|
280
|
+
mailing: number | null
|
|
281
|
+
priority: number
|
|
282
|
+
title: string
|
|
283
|
+
text: string
|
|
284
|
+
route: string
|
|
285
|
+
view: boolean
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### iMessage (чат)
|
|
290
|
+
```ts
|
|
291
|
+
interface iMessageIncome {
|
|
292
|
+
route: "/message"
|
|
293
|
+
id: number
|
|
294
|
+
date: Date
|
|
295
|
+
from_user_id: number
|
|
296
|
+
from_user_name: string
|
|
297
|
+
text: string
|
|
298
|
+
file: string | undefined
|
|
299
|
+
view: 0 | 1
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Test interfaces
|
|
304
|
+
```ts
|
|
305
|
+
// Вопрос теста для пользователя
|
|
306
|
+
interface iTestQuestionForUser {
|
|
307
|
+
specialization: number
|
|
308
|
+
questionIndex: number
|
|
309
|
+
question: string
|
|
310
|
+
answers: { title: string }[]
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Ответ пользователя
|
|
314
|
+
interface iTestUserAnswer {
|
|
315
|
+
specialization: number
|
|
316
|
+
questionIndex: number
|
|
317
|
+
answer_indices: number[] // индексы выбранных ответов
|
|
318
|
+
answer_time?: number // время ответа в секундах
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Результаты по специализациям
|
|
322
|
+
interface iTestResultBySpecialization {
|
|
323
|
+
[specializationId: number]: {
|
|
324
|
+
correct: number
|
|
325
|
+
total: number
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Статус теста
|
|
330
|
+
const TestStatus = {
|
|
331
|
+
not_passed: 1,
|
|
332
|
+
passed: 2,
|
|
333
|
+
} as const
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### DiplomaStatus
|
|
337
|
+
```ts
|
|
338
|
+
const DiplomaStatus = {
|
|
339
|
+
not_uploaded: 1, // не загружен
|
|
340
|
+
pending: 2, // на проверке
|
|
341
|
+
verified: 3, // верифицирован
|
|
342
|
+
rejected: 4, // отклонён
|
|
343
|
+
} as const
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### iBanner
|
|
347
|
+
```ts
|
|
348
|
+
interface iBanner {
|
|
349
|
+
banner_id: number
|
|
350
|
+
sku_id: number
|
|
351
|
+
image: string
|
|
352
|
+
adv_info: string
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### iEnv
|
|
357
|
+
```ts
|
|
358
|
+
interface iEnv {
|
|
359
|
+
referrer_cashback_percent: number
|
|
360
|
+
referrer_register_bonus: number
|
|
361
|
+
root_catalog_id: number
|
|
362
|
+
payout_min_price: number
|
|
363
|
+
}
|
|
364
|
+
```
|
package/dist/api/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { ApiPromocode } from "./promocode";
|
|
|
8
8
|
import { ApiPush } from "./push";
|
|
9
9
|
import { ApiSurvey } from "./survey";
|
|
10
10
|
import { ApiStat } from "./stat";
|
|
11
|
+
import { ApiTest } from "./test";
|
|
11
12
|
import { ApiUser } from "./user";
|
|
12
13
|
export declare function createClient({ host, wsHost, storage }: {
|
|
13
14
|
host: string;
|
|
@@ -24,4 +25,5 @@ export declare function createClient({ host, wsHost, storage }: {
|
|
|
24
25
|
bookmarks: ApiBookmarks;
|
|
25
26
|
push: ApiPush;
|
|
26
27
|
promocode: ApiPromocode;
|
|
28
|
+
test: ApiTest;
|
|
27
29
|
};
|
package/dist/api/index.js
CHANGED
|
@@ -12,6 +12,7 @@ const promocode_1 = require("./promocode");
|
|
|
12
12
|
const push_1 = require("./push");
|
|
13
13
|
const survey_1 = require("./survey");
|
|
14
14
|
const stat_1 = require("./stat");
|
|
15
|
+
const test_1 = require("./test");
|
|
15
16
|
const user_2 = require("./user");
|
|
16
17
|
function createClient({ host, wsHost, storage }) {
|
|
17
18
|
const userStorage = new user_1.UserStorage(storage || default_1.storageDefault);
|
|
@@ -27,5 +28,6 @@ function createClient({ host, wsHost, storage }) {
|
|
|
27
28
|
bookmarks: new bookmarks_1.ApiBookmarks(constructorProps),
|
|
28
29
|
push: new push_1.ApiPush(constructorProps),
|
|
29
30
|
promocode: new promocode_1.ApiPromocode(constructorProps),
|
|
31
|
+
test: new test_1.ApiTest(constructorProps),
|
|
30
32
|
};
|
|
31
33
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { iTestQuestionForUser, iTestUserAnswer } from "../interfaces/iTestQuestion";
|
|
2
|
+
import { iTestResultBySpecialization } from "../interfaces/iTestResult";
|
|
3
|
+
import { ApiAbstract } from "./abstract";
|
|
4
|
+
export declare class ApiTest extends ApiAbstract {
|
|
5
|
+
/**
|
|
6
|
+
* Получить вопросы для теста верификации
|
|
7
|
+
* Вопросы выбираются на основе специализаций пользователя (по 4 на каждую)
|
|
8
|
+
*/
|
|
9
|
+
getQuestions(): Promise<{
|
|
10
|
+
questions: iTestQuestionForUser[];
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Отправить результаты теста
|
|
14
|
+
* @param answers - массив ответов пользователя
|
|
15
|
+
* @returns { success, passed, message } - результат прохождения теста
|
|
16
|
+
*/
|
|
17
|
+
submit(answers: iTestUserAnswer[]): Promise<{
|
|
18
|
+
success: boolean;
|
|
19
|
+
passed: boolean;
|
|
20
|
+
message: string;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Получить результаты последнего теста пользователя
|
|
24
|
+
*/
|
|
25
|
+
getResults(): Promise<{
|
|
26
|
+
hasResults: boolean;
|
|
27
|
+
message?: string;
|
|
28
|
+
testDate?: Date;
|
|
29
|
+
results?: iTestResultBySpecialization;
|
|
30
|
+
passed?: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Проверить статус прохождения теста
|
|
34
|
+
* @returns testPassed - прошел ли тест, testDate - дата прохождения, canTakeTest - можно ли пройти тест
|
|
35
|
+
*/
|
|
36
|
+
getStatus(): Promise<{
|
|
37
|
+
testPassed: boolean;
|
|
38
|
+
testDate: Date | null;
|
|
39
|
+
canTakeTest: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
package/dist/api/test.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiTest = void 0;
|
|
4
|
+
const apiError_1 = require("../http/apiError");
|
|
5
|
+
const apiRoute_1 = require("../http/apiRoute");
|
|
6
|
+
const abstract_1 = require("./abstract");
|
|
7
|
+
class ApiTest extends abstract_1.ApiAbstract {
|
|
8
|
+
/**
|
|
9
|
+
* Получить вопросы для теста верификации
|
|
10
|
+
* Вопросы выбираются на основе специализаций пользователя (по 4 на каждую)
|
|
11
|
+
*/
|
|
12
|
+
async getQuestions() {
|
|
13
|
+
if (!await this.userStorage.isAuth())
|
|
14
|
+
throw new apiError_1.ApiError(401, "Пользователь не авторизован");
|
|
15
|
+
return await this.fetcher({
|
|
16
|
+
route: apiRoute_1.apiRouteTestQuestions,
|
|
17
|
+
options: { addToken: true }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Отправить результаты теста
|
|
22
|
+
* @param answers - массив ответов пользователя
|
|
23
|
+
* @returns { success, passed, message } - результат прохождения теста
|
|
24
|
+
*/
|
|
25
|
+
async submit(answers) {
|
|
26
|
+
if (!await this.userStorage.isAuth())
|
|
27
|
+
throw new apiError_1.ApiError(401, "Пользователь не авторизован");
|
|
28
|
+
return await this.fetcher({
|
|
29
|
+
route: apiRoute_1.apiRouteTestSubmit,
|
|
30
|
+
postBody: { answers },
|
|
31
|
+
options: { addToken: true }
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Получить результаты последнего теста пользователя
|
|
36
|
+
*/
|
|
37
|
+
async getResults() {
|
|
38
|
+
if (!await this.userStorage.isAuth())
|
|
39
|
+
throw new apiError_1.ApiError(401, "Пользователь не авторизован");
|
|
40
|
+
return await this.fetcher({
|
|
41
|
+
route: apiRoute_1.apiRouteTestResults,
|
|
42
|
+
options: { addToken: true }
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Проверить статус прохождения теста
|
|
47
|
+
* @returns testPassed - прошел ли тест, testDate - дата прохождения, canTakeTest - можно ли пройти тест
|
|
48
|
+
*/
|
|
49
|
+
async getStatus() {
|
|
50
|
+
if (!await this.userStorage.isAuth())
|
|
51
|
+
throw new apiError_1.ApiError(401, "Пользователь не авторизован");
|
|
52
|
+
return await this.fetcher({
|
|
53
|
+
route: apiRoute_1.apiRouteTestStatus,
|
|
54
|
+
options: { addToken: true }
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.ApiTest = ApiTest;
|
package/dist/http/apiRoute.d.ts
CHANGED
|
@@ -96,3 +96,7 @@ export declare const apiRoutePushView = "/push/view";
|
|
|
96
96
|
export declare const apiRoutePushViewAll = "/push/view_all";
|
|
97
97
|
export declare const apiRouteChatUnread = "/chat/unread";
|
|
98
98
|
export declare const apiRoutePromocodeActivate = "/promocode/activate";
|
|
99
|
+
export declare const apiRouteTestQuestions = "/test/questions";
|
|
100
|
+
export declare const apiRouteTestSubmit = "/test/submit";
|
|
101
|
+
export declare const apiRouteTestResults = "/test/results";
|
|
102
|
+
export declare const apiRouteTestStatus = "/test/status";
|
package/dist/http/apiRoute.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.apiRoutePushRegister = exports.apiRoutePushCountNew = exports.apiRoutePushList = exports.apiRouteBannerGetRand = exports.apiRouteBookmarksCount = exports.apiRouteBookmarksRemove = exports.apiRouteBookmarksAdd = exports.apiRouteBookmarksGet = exports.apiRouteStatGet = exports.apiRouteStatAdd = exports.apiRouteViewAdd = exports.apiRoutePaymentVerificationStatus = exports.apiRoutePaymentVerificationUrl = exports.apiRoutePaymentBalance = exports.apiRoutePaymentList = exports.apiRoutePaymentAdd = exports.apiRouteSurveyHistory = exports.apiRouteSurveyCancel = exports.apiRouteSurveySaveAnswer = exports.apiRouteSurveyStart = exports.apiRouteSurveyItem = exports.apiRouteSurveyList = exports.apiRouteUserDiplomaStatus = exports.apiRouteUserDiplomaUpload = exports.apiRouteUserSetRef = exports.apiRouteUserDelete = exports.apiRouteUserLogout = exports.apiRouteUserUploadPhoto = exports.apiRouteUserEdit = exports.apiRouteUserLoginWithCode = exports.apiRouteUserRefresh = exports.apiRouteUserGetMe = exports.apiRouteGeoDetect = exports.apiRouteBasketMoveToDraft = exports.apiRouteBasketMutate = exports.apiRouteBasketGet = exports.apiRouteBasketTotal = exports.apiRouteNodeGeneratedLinks = exports.apiRouteNodeById = exports.apiRouteNode = exports.apiRouteNodeList = exports.apiRouteNodeTreeContentByFilters = exports.apiRouteNodeTree = exports.apiRouteItemById = exports.apiRouteItem = exports.apiRouteFilters = exports.apiRouteList = exports.apiRouteGetCloudVersion = exports.apiRouteCheckAppVersion = exports.apiRouteEnv = void 0;
|
|
4
|
-
exports.apiRoutePromocodeActivate = exports.apiRouteChatUnread = exports.apiRoutePushViewAll = exports.apiRoutePushView = exports.apiRoutePushIsSubscribed = exports.apiRoutePushUnsubscribe = void 0;
|
|
4
|
+
exports.apiRouteTestStatus = exports.apiRouteTestResults = exports.apiRouteTestSubmit = exports.apiRouteTestQuestions = exports.apiRoutePromocodeActivate = exports.apiRouteChatUnread = exports.apiRoutePushViewAll = exports.apiRoutePushView = exports.apiRoutePushIsSubscribed = exports.apiRoutePushUnsubscribe = void 0;
|
|
5
5
|
const queryString_1 = require("../utils/queryString");
|
|
6
6
|
exports.apiRouteEnv = "/env";
|
|
7
7
|
const apiRouteCheckAppVersion = (appStore, appVersion) => `/env/check_app_version/${appStore}/${appVersion}`;
|
|
@@ -195,3 +195,8 @@ exports.apiRoutePushView = '/push/view';
|
|
|
195
195
|
exports.apiRoutePushViewAll = '/push/view_all';
|
|
196
196
|
exports.apiRouteChatUnread = '/chat/unread';
|
|
197
197
|
exports.apiRoutePromocodeActivate = '/promocode/activate';
|
|
198
|
+
// test
|
|
199
|
+
exports.apiRouteTestQuestions = '/test/questions';
|
|
200
|
+
exports.apiRouteTestSubmit = '/test/submit';
|
|
201
|
+
exports.apiRouteTestResults = '/test/results';
|
|
202
|
+
exports.apiRouteTestStatus = '/test/status';
|
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
queue = 0,// в очереди (создан, но не начат)
|
|
3
|
-
in_progress = 1,// в процессе прохождения
|
|
4
|
-
success = 2,// успешно завершен
|
|
5
|
-
cancelled = 3,// отменен пользователем
|
|
6
|
-
timeout = 4
|
|
7
|
-
}
|
|
8
|
-
export type UserSurveyStatusKeys = keyof typeof UserSurveyStatus;
|
|
1
|
+
import { UserSurveyStatusValue } from "./userSurveyStatus";
|
|
9
2
|
export interface iUserSurvey {
|
|
10
3
|
id: number;
|
|
11
4
|
reg_date: string;
|
|
12
5
|
user: number;
|
|
13
6
|
survey: number;
|
|
14
|
-
status:
|
|
7
|
+
status: UserSurveyStatusValue;
|
|
15
8
|
date_start: string | null;
|
|
16
9
|
date_end: string | null;
|
|
17
10
|
timeout_at: string | null;
|
|
@@ -1,11 +1,2 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UserSurveyStatus = void 0;
|
|
4
|
-
var UserSurveyStatus;
|
|
5
|
-
(function (UserSurveyStatus) {
|
|
6
|
-
UserSurveyStatus[UserSurveyStatus["queue"] = 0] = "queue";
|
|
7
|
-
UserSurveyStatus[UserSurveyStatus["in_progress"] = 1] = "in_progress";
|
|
8
|
-
UserSurveyStatus[UserSurveyStatus["success"] = 2] = "success";
|
|
9
|
-
UserSurveyStatus[UserSurveyStatus["cancelled"] = 3] = "cancelled";
|
|
10
|
-
UserSurveyStatus[UserSurveyStatus["timeout"] = 4] = "timeout"; // таймаут (не завершен за 1 час)
|
|
11
|
-
})(UserSurveyStatus || (exports.UserSurveyStatus = UserSurveyStatus = {}));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const UserSurveyStatus: {
|
|
2
|
+
readonly queue: 0;
|
|
3
|
+
readonly in_progress: 1;
|
|
4
|
+
readonly success: 2;
|
|
5
|
+
readonly cancelled: 3;
|
|
6
|
+
readonly timeout: 4;
|
|
7
|
+
};
|
|
8
|
+
export type UserSurveyStatusKeys = keyof typeof UserSurveyStatus;
|
|
9
|
+
export type UserSurveyStatusValue = typeof UserSurveyStatus[UserSurveyStatusKeys];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserSurveyStatus = void 0;
|
|
4
|
+
exports.UserSurveyStatus = {
|
|
5
|
+
queue: 0, // в очереди (создан, но не начат)
|
|
6
|
+
in_progress: 1, // в процессе прохождения
|
|
7
|
+
success: 2, // успешно завершен
|
|
8
|
+
cancelled: 3, // отменен пользователем
|
|
9
|
+
timeout: 4 // таймаут (не завершен за 1 час)
|
|
10
|
+
};
|
package/package.json
CHANGED
package/src/api/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { ApiPromocode } from "./promocode";
|
|
|
10
10
|
import { ApiPush } from "./push";
|
|
11
11
|
import { ApiSurvey } from "./survey";
|
|
12
12
|
import { ApiStat } from "./stat";
|
|
13
|
+
import { ApiTest } from "./test";
|
|
13
14
|
import { ApiUser } from "./user";
|
|
14
15
|
|
|
15
16
|
export function createClient({
|
|
@@ -34,5 +35,6 @@ export function createClient({
|
|
|
34
35
|
bookmarks: new ApiBookmarks(constructorProps),
|
|
35
36
|
push: new ApiPush(constructorProps),
|
|
36
37
|
promocode: new ApiPromocode(constructorProps),
|
|
38
|
+
test: new ApiTest(constructorProps),
|
|
37
39
|
}
|
|
38
40
|
}
|
package/src/api/test.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { ApiError } from "../http/apiError"
|
|
2
|
+
import {
|
|
3
|
+
apiRouteTestQuestions,
|
|
4
|
+
apiRouteTestSubmit,
|
|
5
|
+
apiRouteTestResults,
|
|
6
|
+
apiRouteTestStatus
|
|
7
|
+
} from "../http/apiRoute"
|
|
8
|
+
import { iTestQuestionForUser, iTestUserAnswer } from "../interfaces/iTestQuestion"
|
|
9
|
+
import { iTestResultBySpecialization } from "../interfaces/iTestResult"
|
|
10
|
+
import { ApiAbstract } from "./abstract"
|
|
11
|
+
|
|
12
|
+
export class ApiTest extends ApiAbstract {
|
|
13
|
+
/**
|
|
14
|
+
* Получить вопросы для теста верификации
|
|
15
|
+
* Вопросы выбираются на основе специализаций пользователя (по 4 на каждую)
|
|
16
|
+
*/
|
|
17
|
+
async getQuestions() {
|
|
18
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
19
|
+
return await this.fetcher<{
|
|
20
|
+
questions: iTestQuestionForUser[]
|
|
21
|
+
}>({
|
|
22
|
+
route: apiRouteTestQuestions,
|
|
23
|
+
options: { addToken: true }
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Отправить результаты теста
|
|
29
|
+
* @param answers - массив ответов пользователя
|
|
30
|
+
* @returns { success, passed, message } - результат прохождения теста
|
|
31
|
+
*/
|
|
32
|
+
async submit(answers: iTestUserAnswer[]) {
|
|
33
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
34
|
+
return await this.fetcher<{
|
|
35
|
+
success: boolean
|
|
36
|
+
passed: boolean
|
|
37
|
+
message: string
|
|
38
|
+
}>({
|
|
39
|
+
route: apiRouteTestSubmit,
|
|
40
|
+
postBody: { answers },
|
|
41
|
+
options: { addToken: true }
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Получить результаты последнего теста пользователя
|
|
47
|
+
*/
|
|
48
|
+
async getResults() {
|
|
49
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
50
|
+
return await this.fetcher<{
|
|
51
|
+
hasResults: boolean
|
|
52
|
+
message?: string
|
|
53
|
+
testDate?: Date
|
|
54
|
+
results?: iTestResultBySpecialization
|
|
55
|
+
passed?: boolean
|
|
56
|
+
}>({
|
|
57
|
+
route: apiRouteTestResults,
|
|
58
|
+
options: { addToken: true }
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Проверить статус прохождения теста
|
|
64
|
+
* @returns testPassed - прошел ли тест, testDate - дата прохождения, canTakeTest - можно ли пройти тест
|
|
65
|
+
*/
|
|
66
|
+
async getStatus() {
|
|
67
|
+
if (!await this.userStorage.isAuth()) throw new ApiError(401, "Пользователь не авторизован")
|
|
68
|
+
return await this.fetcher<{
|
|
69
|
+
testPassed: boolean
|
|
70
|
+
testDate: Date | null
|
|
71
|
+
canTakeTest: boolean
|
|
72
|
+
}>({
|
|
73
|
+
route: apiRouteTestStatus,
|
|
74
|
+
options: { addToken: true }
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
package/src/http/apiRoute.ts
CHANGED
|
@@ -231,4 +231,10 @@ export const apiRoutePushViewAll = '/push/view_all'
|
|
|
231
231
|
|
|
232
232
|
export const apiRouteChatUnread = '/chat/unread'
|
|
233
233
|
|
|
234
|
-
export const apiRoutePromocodeActivate = '/promocode/activate'
|
|
234
|
+
export const apiRoutePromocodeActivate = '/promocode/activate'
|
|
235
|
+
|
|
236
|
+
// test
|
|
237
|
+
export const apiRouteTestQuestions = '/test/questions'
|
|
238
|
+
export const apiRouteTestSubmit = '/test/submit'
|
|
239
|
+
export const apiRouteTestResults = '/test/results'
|
|
240
|
+
export const apiRouteTestStatus = '/test/status'
|
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
queue = 0, // в очереди (создан, но не начат)
|
|
3
|
-
in_progress = 1, // в процессе прохождения
|
|
4
|
-
success = 2, // успешно завершен
|
|
5
|
-
cancelled = 3, // отменен пользователем
|
|
6
|
-
timeout = 4 // таймаут (не завершен за 1 час)
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export type UserSurveyStatusKeys = keyof typeof UserSurveyStatus
|
|
1
|
+
import { UserSurveyStatusValue } from "./userSurveyStatus"
|
|
10
2
|
|
|
11
3
|
export interface iUserSurvey {
|
|
12
4
|
id: number
|
|
13
5
|
reg_date: string
|
|
14
6
|
user: number
|
|
15
7
|
survey: number
|
|
16
|
-
status:
|
|
8
|
+
status: UserSurveyStatusValue
|
|
17
9
|
date_start: string | null
|
|
18
10
|
date_end: string | null
|
|
19
11
|
timeout_at: string | null
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const UserSurveyStatus = {
|
|
2
|
+
queue: 0, // в очереди (создан, но не начат)
|
|
3
|
+
in_progress: 1, // в процессе прохождения
|
|
4
|
+
success: 2, // успешно завершен
|
|
5
|
+
cancelled: 3, // отменен пользователем
|
|
6
|
+
timeout: 4 // таймаут (не завершен за 1 час)
|
|
7
|
+
} as const
|
|
8
|
+
|
|
9
|
+
export type UserSurveyStatusKeys = keyof typeof UserSurveyStatus
|
|
10
|
+
export type UserSurveyStatusValue = typeof UserSurveyStatus[UserSurveyStatusKeys]
|