@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 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
+ ```
@@ -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
+ }
@@ -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;
@@ -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";
@@ -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
- export declare enum UserSurveyStatus {
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: typeof UserSurveyStatus[UserSurveyStatusKeys];
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@up-im/medotvet_sdk",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
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
  }
@@ -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
+
@@ -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
- export enum UserSurveyStatus {
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: typeof UserSurveyStatus[UserSurveyStatusKeys]
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]