bb-api-platforma 0.1.168

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.
@@ -0,0 +1,1879 @@
1
+ import * as I from './Types.js';
2
+ import { api } from './Types.js';
3
+ // #region Consts -----------------------------------------------------------------------
4
+ const locales = {
5
+ /** Be careful on the backend these values may change
6
+ * for chek:
7
+ * https://front-test.restin.win/api/account/GetAvailableLanguages
8
+ */
9
+ en: 'en-US',
10
+ pt: 'pt-PT',
11
+ fr: 'fr-FR',
12
+ es: 'es-ES',
13
+ tr: 'tr-TR',
14
+ uk: 'uk-UA',
15
+ cr: 'cr-HA',
16
+ ru: 'ru-RU',
17
+ };
18
+ const languageIdsRemote = {
19
+ /** Be careful on the backend these values may change
20
+ * for chek:
21
+ * https://front-test.restin.win/api/account/GetAvailableLanguages
22
+ */
23
+ en: 1,
24
+ pt: 0,
25
+ fr: 4,
26
+ es: 3,
27
+ tr: 5,
28
+ uk: 2,
29
+ cr: 6,
30
+ ru: 0,
31
+ };
32
+ const stringify = (obj) => {
33
+ return JSON.stringify(obj, null, 2);
34
+ };
35
+ export function routeNameId(id, text = '') {
36
+ return `${text
37
+ .replace(/[\s\.\,\(\)\[\]\\\/\-\~\`\"\']+/g, ' ')
38
+ .trim()
39
+ .replace(/\s+/g, '-')
40
+ .toLowerCase()}~${id}`;
41
+ }
42
+ export function clearPhone(draftPhoneNumber, prefix = '', suffix = '') {
43
+ return prefix + (String(draftPhoneNumber).match(/\d+/g) || []).join('') + suffix;
44
+ }
45
+ let IS_DEV_MODE = false;
46
+ // #endregion Consts -----------------------------------------------------------------------
47
+ export class BetBoosterOfficeApi {
48
+ // #endregion Class Properties --------------------------------------------------------
49
+ /**
50
+ * Represents the BetBoosterApi class.
51
+ * @constructor
52
+ * @param {AxiosInstance} axiosInstance - The Axios instance to be used for making HTTP requests. Aka axios.create()
53
+ * @param {string} baseUrl - The base URL of the API.
54
+ * @param {string} [lang='en'] - The language to be used for API requests. Defaults to 'en'.
55
+ * @param {number} [maxTimeExecutionMs=15000] - The maximum time allowed for API request execution in milliseconds. Defaults to 15000.
56
+ * @param {boolean} [isDev=false] - Indicates whether the API is running in development mode. Defaults to false.
57
+ */
58
+ constructor(axiosInstance, baseUrl, lang = 'en', maxTimeExecutionMs = 15000, isDev = false) {
59
+ this._locale = 'en-EN';
60
+ this._locales = locales;
61
+ this._languageIdsRemote = languageIdsRemote;
62
+ this.EXIST_LANGUAGES = Object.keys(locales);
63
+ this._languageId = 1;
64
+ this._lang = 'en';
65
+ this._APIv1 = '/api';
66
+ this._APIv2 = '/api/v2';
67
+ this._API_LBC = '/v2/lbc/api';
68
+ this._USER_DATA = {};
69
+ this.LANG_DEFAULT = 'en';
70
+ this.LOCALE_DEFAULT = 'en-EN';
71
+ this.LANG_ID_DEFAULT = 1;
72
+ this.maxTimeExecutionMs = 15000;
73
+ this.liveTimestamp = 0;
74
+ this._liveTimestampReset = false;
75
+ this.liveRecivedIsFullPackage = false;
76
+ this.isNotActive = false;
77
+ const uri = new URL(baseUrl);
78
+ IS_DEV_MODE = isDev;
79
+ this._ENDPOINT_DOMAIN = uri.origin;
80
+ this.maxTimeExecutionMs = maxTimeExecutionMs;
81
+ this.axi = axiosInstance;
82
+ this.setBaseUrl(baseUrl);
83
+ this.setLanguage(lang);
84
+ }
85
+ // #region Getters & Setters -----------------------------------------------------------
86
+ get locale() {
87
+ return this._locale;
88
+ }
89
+ get isSinged() {
90
+ return this.user !== undefined && this.user.UserId !== undefined && this.user.UserId > 0;
91
+ }
92
+ get user() {
93
+ return this._USER_DATA;
94
+ }
95
+ set user(value) {
96
+ this._USER_DATA = value;
97
+ }
98
+ get lang() {
99
+ return this._lang;
100
+ }
101
+ get baseUrl() {
102
+ return this._baseUrl;
103
+ }
104
+ get languageId() {
105
+ return this._languageId;
106
+ }
107
+ get token() {
108
+ var _a;
109
+ return (_a = this._TOKEN) !== null && _a !== void 0 ? _a : undefined;
110
+ }
111
+ set token(value) {
112
+ if (typeof value === 'string') {
113
+ this._TOKEN = value.split(/\s*,\s*/)[0];
114
+ }
115
+ else {
116
+ this._TOKEN = undefined;
117
+ }
118
+ }
119
+ // #endregion Getters & Setters -----------------------------------------------------------
120
+ // #region Handlers -----------------------------------------------------------------------
121
+ /**
122
+ * Обрабатывает данные ответа и возвращает объект с данными, ошибкой, статусом и текстом статуса.
123
+ *
124
+ * @template T - Тип данных, возвращаемых в поле `data`.
125
+ * @param {any} rawData - Сырые данные ответа.
126
+ * @param {number} status - HTTP статус ответа.
127
+ * @param {string} statusText - Текст статуса HTTP ответа.
128
+ * @returns {{ data: T, error: string | null, status: number, statusText: string }} Объект, содержащий данные ответа, ошибку, статус и текст статуса.
129
+ */
130
+ responseHandlerData(rawData, status, statusText) {
131
+ var _a, _b, _c;
132
+ let data = null;
133
+ if (((_a = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _a === void 0 ? void 0 : _a.Data) !== undefined) {
134
+ data = rawData.Data.Data;
135
+ }
136
+ else if (((_b = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _b === void 0 ? void 0 : _b._isSuccessful) !== undefined) {
137
+ data = rawData.Data._isSuccessful;
138
+ }
139
+ else if ((rawData === null || rawData === void 0 ? void 0 : rawData.Data) !== undefined) {
140
+ data = rawData.Data;
141
+ }
142
+ else if (rawData !== undefined) {
143
+ data = rawData;
144
+ }
145
+ // const data: T = rawData?.Data?.Data ?? rawData?.Data ?? rawData ?? null as T;
146
+ const error = ((_c = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _c === void 0 ? void 0 : _c.Error) || (rawData === null || rawData === void 0 ? void 0 : rawData.Error) || (status !== 200 ? statusText : null) || (!data ? 'Unknown error' : null);
147
+ return { data, error, status, statusText };
148
+ }
149
+ setDevMode(devMode) {
150
+ if (devMode === undefined) {
151
+ IS_DEV_MODE = true;
152
+ }
153
+ else {
154
+ IS_DEV_MODE = devMode;
155
+ }
156
+ }
157
+ checkLanguage(lang = 'en') {
158
+ try {
159
+ const _lang = lang.substring(0, 2) || this.LANG_DEFAULT;
160
+ const isExistInLanguages = this.EXIST_LANGUAGES.includes(_lang);
161
+ return isExistInLanguages ? _lang : this.LANG_DEFAULT;
162
+ }
163
+ catch (error) {
164
+ return this.LANG_DEFAULT;
165
+ }
166
+ }
167
+ setLanguage(lang = 'en') {
168
+ var _a, _b;
169
+ this._lang = this.checkLanguage(lang);
170
+ this._locale = (_a = this._locales[this._lang]) !== null && _a !== void 0 ? _a : this.LOCALE_DEFAULT;
171
+ this._languageId = (_b = this._languageIdsRemote[this._lang]) !== null && _b !== void 0 ? _b : this.LANG_ID_DEFAULT;
172
+ return this._lang;
173
+ }
174
+ /**
175
+ * Устанавливает язык и локаль для удаленного API.
176
+ * @param lang Язык (по умолчанию 'en').
177
+ * @returns Возвращает true, если язык и локаль успешно установлены, в противном случае возвращает false.
178
+ */
179
+ async setLanguageRemoteLocale(lang = 'en') {
180
+ this.setLanguage(lang);
181
+ return true;
182
+ // !TODO setLanguageRemoteLocale - проверить как работает
183
+ // if (this.isSinged) {
184
+ // const url = this.url(`/account/SetLanguage`, api.LBC);
185
+ // const res = await this.POST(url, {culture: this.locale});
186
+ // return res || false;
187
+ // }
188
+ // return undefined;
189
+ }
190
+ setBaseUrl(baseUrl) {
191
+ if (baseUrl.endsWith('/')) {
192
+ baseUrl = baseUrl.slice(0, -1);
193
+ }
194
+ this._baseUrl = baseUrl;
195
+ return this._baseUrl;
196
+ }
197
+ statusHandler(status, statusText) {
198
+ if (status === 401) {
199
+ this.user = {};
200
+ this.token = undefined;
201
+ if (IS_DEV_MODE)
202
+ console.log('Status:', status, statusText);
203
+ }
204
+ }
205
+ /**
206
+ * Обработчик строки запроса. Заменяет значения
207
+ * * `null` на `'null'`
208
+ * * `false` на `'false'`
209
+ * * `true` на `'true'`
210
+ * * `undefined` на `''`
211
+ * @param queryStringData - queryString Record<string, any>
212
+ * @returns Обработанные данные строки запроса.
213
+ */
214
+ queryStringHandler(queryStringData = {}) {
215
+ const keys = Object.keys(queryStringData);
216
+ keys.forEach(key => {
217
+ if (queryStringData[key] === null) {
218
+ queryStringData[key] = 'null';
219
+ }
220
+ else if (queryStringData[key] === true) {
221
+ queryStringData[key] = 'true';
222
+ }
223
+ else if (queryStringData[key] === false) {
224
+ queryStringData[key] = 'false';
225
+ }
226
+ else if (queryStringData[key] === undefined) {
227
+ queryStringData[key] = '';
228
+ }
229
+ });
230
+ return queryStringData;
231
+ }
232
+ responseHandler(response) {
233
+ var _a, _b, _c;
234
+ const xToken = (_a = response === null || response === void 0 ? void 0 : response.headers['x-token']) !== null && _a !== void 0 ? _a : null;
235
+ const urlPath = (_c = (_b = response === null || response === void 0 ? void 0 : response.request) === null || _b === void 0 ? void 0 : _b.path) !== null && _c !== void 0 ? _c : null;
236
+ if (IS_DEV_MODE && urlPath)
237
+ console.log(urlPath);
238
+ if (xToken) {
239
+ this.token = xToken;
240
+ if (IS_DEV_MODE)
241
+ console.log('isSinged:', this.isSinged + '\nX-Token:', xToken);
242
+ }
243
+ ;
244
+ }
245
+ /**
246
+ * Обработчик ошибок для Axios.
247
+ *
248
+ * @param error - Объект ошибки AxiosError.
249
+ * @returns Объект с данными об ошибке, включая статус и текст ошибки.
250
+ */
251
+ axiosErrorHandler(error) {
252
+ var _a, _b, _c, _d, _e, _f, _g, _h;
253
+ let errorMessage;
254
+ let status = (_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.status) !== null && _b !== void 0 ? _b : null;
255
+ let statusText = (_d = (_c = error.response) === null || _c === void 0 ? void 0 : _c.statusText) !== null && _d !== void 0 ? _d : null;
256
+ const response = (_e = error.response) !== null && _e !== void 0 ? _e : null;
257
+ // const request = err.request ?? null;
258
+ if (response) {
259
+ // Server responded with a status other than 200 range
260
+ // console.log('err.response.request.url:', response.request.url)
261
+ const brMessage = [
262
+ ...(status ? [status] : []),
263
+ ...(statusText ? [statusText] : []),
264
+ ...(((_f = response === null || response === void 0 ? void 0 : response.data) === null || _f === void 0 ? void 0 : _f.Message) ? [response.data.Message] : []),
265
+ ...(((_g = response === null || response === void 0 ? void 0 : response.data) === null || _g === void 0 ? void 0 : _g.MessageDetail) ? [response.data.MessageDetail] : []),
266
+ ].join(' > ');
267
+ // errorMessage = `Error: ${brMessage}`;
268
+ errorMessage = brMessage;
269
+ if (IS_DEV_MODE) {
270
+ const requestMethod = ((_h = response.config.method) !== null && _h !== void 0 ? _h : '').toUpperCase();
271
+ const fullUrl = response.config.url;
272
+ const requestData = response.config.data;
273
+ console.log('```');
274
+ console.log('ERROR:', requestMethod, fullUrl);
275
+ console.log('DATA:', requestData);
276
+ console.log('RESPONCE:', response === null || response === void 0 ? void 0 : response.data);
277
+ console.log('```');
278
+ }
279
+ }
280
+ else if (error.request) {
281
+ // Request was made but no response was received
282
+ errorMessage = `Error: No response received`;
283
+ // 503 Service Unavailable
284
+ status = 503;
285
+ statusText = 'Service Unavailable';
286
+ }
287
+ else {
288
+ // Something else caused the error
289
+ errorMessage = `Error: ${error === null || error === void 0 ? void 0 : error.message}`;
290
+ status = 601;
291
+ statusText = (error === null || error === void 0 ? void 0 : error.message) || 'Unknown error';
292
+ }
293
+ console.error('Axios request error:', errorMessage);
294
+ return {
295
+ data: null,
296
+ status,
297
+ // statusText,
298
+ statusText: errorMessage || statusText || 'Unknown error',
299
+ };
300
+ }
301
+ /**
302
+ * Возвращает URL для указанного пути API и версии.
303
+ *
304
+ * @param apiPath - Путь API.
305
+ * @param apiVersion - Версия API.
306
+ * @returns URL для указанного пути API и версии.
307
+ */
308
+ url(apiPath, apiVersion) {
309
+ if (apiPath.toLowerCase().startsWith('http')) {
310
+ return apiPath;
311
+ }
312
+ switch (apiVersion) {
313
+ case api.OFFICE:
314
+ return `${this._ENDPOINT_DOMAIN}/api/v1/office/${this.locale}${apiPath}`;
315
+ case api.V1:
316
+ return `${this._ENDPOINT_DOMAIN}/api/v1${apiPath}`;
317
+ case api.V2:
318
+ return `${this._ENDPOINT_DOMAIN}/api/v2${apiPath}`;
319
+ case api.LINE:
320
+ return `${this._ENDPOINT_DOMAIN}/api/line/${this.locale}${apiPath}`;
321
+ case api.LIVE:
322
+ return `${this._ENDPOINT_DOMAIN}/api/live/${this.locale}${apiPath}`;
323
+ case api.BASE:
324
+ return `${this._ENDPOINT_DOMAIN}`;
325
+ default:
326
+ return `${this._ENDPOINT_DOMAIN}/api${apiPath}`;
327
+ }
328
+ }
329
+ // #endregion Handlers --------------------------------------------------------------------
330
+ // #region AXIOS --------------------------------------------------------------------------
331
+ /**
332
+ * Выполняет HTTP-запрос с заданными параметрами.
333
+ * @param url - URL-адрес для выполнения запроса.
334
+ * @returns Объект, содержащий методы для настройки запроса и выполнения запроса.
335
+ */
336
+ request(url) {
337
+ const queryStringHandler = this.queryStringHandler;
338
+ const axi = this.axi;
339
+ const axiosErrorHandler = this.axiosErrorHandler;
340
+ const statusHandler = (status, statusText) => {
341
+ if (status === 401) {
342
+ this.user = {};
343
+ this.token = undefined;
344
+ if (IS_DEV_MODE)
345
+ console.log('Status:', status, statusText);
346
+ }
347
+ };
348
+ const responseHandler = (response) => {
349
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
350
+ // console.log('responseHandler:', response);
351
+ // console.log('Response body:', response.data);
352
+ // console.log('Response response?.config:', response?.config);
353
+ const xToken = (_a = response === null || response === void 0 ? void 0 : response.headers['x-token']) !== null && _a !== void 0 ? _a : null;
354
+ const urlPath = (_c = (_b = response === null || response === void 0 ? void 0 : response.request) === null || _b === void 0 ? void 0 : _b.path) !== null && _c !== void 0 ? _c : null;
355
+ // if (response?.data?.Error === 'Object reference not set to an instance of an object.') {
356
+ if ((_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.Error) {
357
+ const Method = ((_f = (_e = response === null || response === void 0 ? void 0 : response.config) === null || _e === void 0 ? void 0 : _e.method) !== null && _f !== void 0 ? _f : '').toUpperCase();
358
+ const errorData = Object.assign(Object.assign(Object.assign({ method: Method, url: ((_g = response === null || response === void 0 ? void 0 : response.config) === null || _g === void 0 ? void 0 : _g.url) || '' }, (!!((_h = response === null || response === void 0 ? void 0 : response.config) === null || _h === void 0 ? void 0 : _h.params) ? { params: (_k = (_j = response === null || response === void 0 ? void 0 : response.config) === null || _j === void 0 ? void 0 : _j.params) !== null && _k !== void 0 ? _k : '' } : {})), (!!((_l = response === null || response === void 0 ? void 0 : response.config) === null || _l === void 0 ? void 0 : _l.data) ? { POST: (_o = (_m = response === null || response === void 0 ? void 0 : response.config) === null || _m === void 0 ? void 0 : _m.data) !== null && _o !== void 0 ? _o : '' } : {})), { error: (_p = response === null || response === void 0 ? void 0 : response.data) === null || _p === void 0 ? void 0 : _p.Error });
359
+ console.error(errorData);
360
+ }
361
+ if (IS_DEV_MODE && urlPath)
362
+ console.log(urlPath);
363
+ if (xToken) {
364
+ this.token = xToken;
365
+ if (IS_DEV_MODE)
366
+ console.log('isSinged:', this.isSinged + '\nX-Token:', xToken);
367
+ }
368
+ ;
369
+ };
370
+ const now = Date.now();
371
+ const abortController = new AbortController();
372
+ const signal = setTimeout(() => {
373
+ abortController.abort();
374
+ }, this.maxTimeExecutionMs);
375
+ const requestConfig = {
376
+ url,
377
+ method: 'GET',
378
+ params: { _: now },
379
+ headers: Object.assign({}, (this.token ? { 'X-Token': this.token } : {})),
380
+ responseType: 'json',
381
+ signal: abortController.signal,
382
+ };
383
+ return {
384
+ /**
385
+ * Выполняет запрос с заданными параметрами.
386
+ * @param queryParams - Параметры запроса.
387
+ * @returns Экземпляр класса BetBoosterOfficeApi.
388
+ */
389
+ query(queryParams = {}) {
390
+ const query = queryStringHandler(queryParams);
391
+ requestConfig.params = Object.assign(Object.assign({}, query), requestConfig.params);
392
+ return this;
393
+ },
394
+ /**
395
+ * Устанавливает заголовки запроса.
396
+ * @param headers - Объект с заголовками запроса.
397
+ * @returns Экземпляр класса BetBoosterOfficeApi.
398
+ */
399
+ headers(headers = {}) {
400
+ requestConfig.headers = Object.assign(Object.assign({}, requestConfig.headers), headers);
401
+ return this;
402
+ },
403
+ /**
404
+ * Устанавливает метод запроса GET.
405
+ * @returns Экземпляр класса BetBoosterOfficeApi.
406
+ */
407
+ GET() {
408
+ requestConfig.method = 'GET';
409
+ return this;
410
+ },
411
+ /**
412
+ * Устанавливает метод запроса POST.
413
+ * @param payload - Полезная нагрузка для запроса.
414
+ * @returns Экземпляр класса BetBoosterOfficeApi.
415
+ */
416
+ POST(payload = {}) {
417
+ requestConfig.method = 'POST';
418
+ requestConfig.data = payload;
419
+ return this;
420
+ },
421
+ /**
422
+ * Устанавливает метод запроса PUT и устанавливает тело запроса.
423
+ * @param payload - Данные, которые будут отправлены в теле запроса.
424
+ * @returns Экземпляр класса BetBoosterOfficeApi с установленным методом запроса PUT и телом запроса.
425
+ */
426
+ PUT(payload = {}) {
427
+ requestConfig.method = 'PUT';
428
+ requestConfig.data = payload;
429
+ return this;
430
+ },
431
+ /**
432
+ * Устанавливает метод запроса DELETE.
433
+ * @param payload Данные запроса в формате объекта или записи.
434
+ * @returns Экземпляр класса BetBoosterOfficeApi.
435
+ */
436
+ DELETE(payload = {}) {
437
+ requestConfig.method = 'DELETE';
438
+ requestConfig.data = payload;
439
+ return this;
440
+ },
441
+ /**
442
+ * Выполняет запрос к API.
443
+ *
444
+ * @returns Объект, содержащий данные, статус и текст статуса ответа.
445
+ * ```
446
+ * { data, status, statusText }
447
+ * ```
448
+ */
449
+ async exec() {
450
+ if (requestConfig.method !== 'GET') {
451
+ delete requestConfig.params._;
452
+ }
453
+ const response = axi.request(requestConfig)
454
+ .then(response => {
455
+ responseHandler(response);
456
+ return response;
457
+ })
458
+ .catch(axiosErrorHandler)
459
+ .finally(() => clearTimeout(signal));
460
+ const { data, status, statusText } = await response;
461
+ statusHandler(status, statusText);
462
+ return { data, status, statusText };
463
+ },
464
+ /**
465
+ * Получает значение.
466
+ * @returns Промис, который разрешается с данными.
467
+ */
468
+ async value() {
469
+ const { data } = await this.exec();
470
+ await data;
471
+ }
472
+ };
473
+ }
474
+ /**
475
+ * Sends a GET request to the specified endpoint with optional query parameters and options.
476
+ * @param url - The endpoint to send the GET request to.
477
+ * @param queryParams - The query parameters to include in the request URL. Defaults to an empty object.
478
+ * @param headers - The options to include in the request. Defaults to an empty object.
479
+ * @returns A Promise that resolves to the response body of the GET request.
480
+ */
481
+ async GET(url, queryParams = {}, headers = {}) {
482
+ const now = Date.now();
483
+ const abortController = new AbortController();
484
+ const signal = setTimeout(() => {
485
+ abortController.abort();
486
+ }, this.maxTimeExecutionMs);
487
+ const requestConfig = {
488
+ params: this.queryStringHandler(Object.assign(Object.assign({}, queryParams), { _: now })),
489
+ headers: Object.assign(Object.assign({}, (this.token ? { 'X-Token': this.token } : {})), (headers !== null && headers !== void 0 ? headers : {})),
490
+ responseType: 'json',
491
+ signal: abortController.signal,
492
+ };
493
+ const response = this.axi.get(url, requestConfig)
494
+ .then(response => {
495
+ this.responseHandler(response);
496
+ return response;
497
+ })
498
+ .catch(this.axiosErrorHandler)
499
+ .finally(() => clearTimeout(signal));
500
+ const { data, status, statusText } = await response;
501
+ this.statusHandler(status, statusText);
502
+ return data;
503
+ }
504
+ async POST(url, payload = {}, queryParams = {}, headers = {}) {
505
+ const abortController = new AbortController();
506
+ const signal = setTimeout(() => {
507
+ abortController.abort();
508
+ }, this.maxTimeExecutionMs);
509
+ const requestConfig = {
510
+ params: this.queryStringHandler(queryParams),
511
+ headers: Object.assign(Object.assign({}, (this.token ? { 'X-Token': this.token } : {})), (headers !== null && headers !== void 0 ? headers : {})),
512
+ responseType: 'json',
513
+ signal: abortController.signal,
514
+ };
515
+ const response = this.axi.post(url, payload, requestConfig)
516
+ .then(response => {
517
+ this.responseHandler(response);
518
+ return response;
519
+ })
520
+ .catch(this.axiosErrorHandler)
521
+ .finally(() => clearTimeout(signal));
522
+ const axiData = await response;
523
+ // console.log(axiData);
524
+ const { data, status, statusText } = axiData;
525
+ this.statusHandler(status, statusText);
526
+ return data;
527
+ }
528
+ async DELETE(url, payload = {}, queryParams = {}, headers = {}) {
529
+ const abortController = new AbortController();
530
+ const signal = setTimeout(() => {
531
+ abortController.abort();
532
+ }, this.maxTimeExecutionMs);
533
+ const requestConfig = {
534
+ params: this.queryStringHandler(queryParams),
535
+ headers: Object.assign(Object.assign({}, (this.token ? { 'X-Token': this.token } : {})), (headers !== null && headers !== void 0 ? headers : {})),
536
+ responseType: 'json',
537
+ signal: abortController.signal,
538
+ data: payload,
539
+ };
540
+ const response = this.axi.delete(url, requestConfig)
541
+ .then(response => {
542
+ this.responseHandler(response);
543
+ return response;
544
+ })
545
+ .catch(this.axiosErrorHandler)
546
+ .finally(() => clearTimeout(signal));
547
+ const { data, status, statusText } = await response;
548
+ this.statusHandler(status, statusText);
549
+ return data;
550
+ }
551
+ async PUT(url, payload = {}, queryParams = {}, headers = {}) {
552
+ const abortController = new AbortController();
553
+ const signal = setTimeout(() => {
554
+ abortController.abort();
555
+ }, this.maxTimeExecutionMs);
556
+ const requestConfig = {
557
+ params: this.queryStringHandler(queryParams),
558
+ headers: Object.assign(Object.assign({}, (this.token ? { 'X-Token': this.token } : {})), (headers !== null && headers !== void 0 ? headers : {})),
559
+ responseType: 'json',
560
+ signal: abortController.signal,
561
+ };
562
+ const response = this.axi.put(url, payload, requestConfig)
563
+ .then(response => {
564
+ this.responseHandler(response);
565
+ return response;
566
+ })
567
+ .catch(this.axiosErrorHandler)
568
+ .finally(() => clearTimeout(signal));
569
+ const { data, status, statusText } = await response;
570
+ this.statusHandler(status, statusText);
571
+ return data;
572
+ }
573
+ // #endregion AXIOS --------------------------------------------------------------------^^^
574
+ /**
575
+ * Асинхронно выполняет вход в систему.
576
+ * @description Если логин успешен, сохраняет токен в свойстве класса token
577
+ * и сохраняет объект, представляющий пользователя в свойстве класса user
578
+ * в последствии эти свойства используем для обработки запроса
579
+ * @param login Логин пользователя.
580
+ * @param password Пароль пользователя.
581
+ * @returns Объект, представляющий пользователя, если вход выполнен успешно. В противном случае, возвращает пустой объект.
582
+ */
583
+ async login({ login, password }) {
584
+ const url = this.url(`/Login`, api.OFFICE);
585
+ const post = {
586
+ Login: login,
587
+ Password: password,
588
+ };
589
+ const res = await this.POST(url, post);
590
+ if (IS_DEV_MODE)
591
+ console.log(res);
592
+ const { Data } = res !== null && res !== void 0 ? res : {};
593
+ if (!Data && IS_DEV_MODE) {
594
+ console.log("\n```\n/account/LogIn:\n", res, "\n```\n");
595
+ }
596
+ if (Data && Data.UserId > 0) {
597
+ this.user = Data;
598
+ const token = Data['X-Token'];
599
+ this.token = token !== null && token !== void 0 ? token : null;
600
+ if (this.token) {
601
+ return this.user;
602
+ }
603
+ }
604
+ this.user = {};
605
+ return this.user;
606
+ }
607
+ /**
608
+ * Получает данные пользователя.
609
+ * @returns Данные пользователя или null, если пользователь не найден.
610
+ */
611
+ async getUserData() {
612
+ const url = this.url(`/account/GetUserData`, api.V2);
613
+ const user = await this.GET(url);
614
+ if ((user === null || user === void 0 ? void 0 : user.UserId) > 0) {
615
+ this.user = user;
616
+ return user;
617
+ }
618
+ this.user = {};
619
+ return null;
620
+ }
621
+ async getOfficeUserData() {
622
+ const url = this.url(`/account/GetOfficeUserData`, api.V2);
623
+ const user = await this.GET(url);
624
+ if ((user === null || user === void 0 ? void 0 : user.UserId) > 0) {
625
+ this.user = user;
626
+ return user;
627
+ }
628
+ this.user = {};
629
+ return null;
630
+ }
631
+ // #region API Line --------------------------------------------------------------------
632
+ /**
633
+ * Returns the list of prematch sports
634
+ *
635
+ * @param minutes The number of minutes to consider for the data retrieval. Defaults to 0.
636
+ * @returns {Promise<Array<any>>} A promise that resolves to an array of line sports data.
637
+ */
638
+ async getLineSports(minutes = 0) {
639
+ var _a;
640
+ // const url = this.url(`/sports/${minutes}`, api.LINE);
641
+ // +TODO Включить когда обновиться продакшен
642
+ const url = +minutes > 0
643
+ ? this.url(`/sports/${minutes}`, api.LINE)
644
+ : this.url(`/allSports`, api.LINE);
645
+ const response = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
646
+ // console.log(JSON.stringify(response, null, 2));
647
+ return response;
648
+ }
649
+ /**
650
+ * Получает список стран для указанного идентификатора спорта.
651
+ * @param sportId - Идентификатор спорта.
652
+ * @param minutes - Опциональный параметр, количество минут.
653
+ * @returns Промис, который разрешается в массив объектов типа ICountry.
654
+ */
655
+ async getCountriesList(sportId, minutes = 0) {
656
+ var _a;
657
+ const url = this.url(`/countries/sport${sportId}/${minutes}`, api.LINE);
658
+ // console.log(url)
659
+ return (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
660
+ }
661
+ /**
662
+ * Retrieves prematch tournaments based on the specified sport ID, country ID, and minutes.
663
+ * @param sportId - The ID of the sport.
664
+ * @param countryId - The ID of the country.
665
+ * @param minutes - The number of minutes ago for which data is to be retrieved.
666
+ * @returns A promise that resolves to an array of prematch tournaments.
667
+ */
668
+ async getPrematchTournaments(sportId, countryId, minutes = 0) {
669
+ var _a;
670
+ const url = this.url(`/tournaments/sport${sportId}/country${countryId}/${minutes}`, api.LINE);
671
+ // console.log(url)
672
+ return (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
673
+ }
674
+ /**
675
+ * Retrieves prematch events based on the specified parameters.
676
+ * @param sportId - The ID of the sport.
677
+ * @param countryId - The ID of the country.
678
+ * @param tournamentId - The ID of the tournament.
679
+ * @param minutes - The number of minutes ago for which data is to be retrieved.
680
+ * @returns A Promise that resolves to an array of prematch events.
681
+ */
682
+ async getPrematchEvents(sportId, countryId, tournamentId, minutes) {
683
+ var _a;
684
+ // ?TODO Хорошо бы сделать фильтр по нескольким турнирам.
685
+ const url = this.url(`/events/sport${sportId}/country${countryId}/tourney${tournamentId}/${minutes}`, api.LINE);
686
+ const list = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
687
+ return list;
688
+ }
689
+ /**
690
+ * Retrieves the hot prematch events
691
+ * @returns {Promise<Array<any>>} A promise that resolves to an array of hot events.
692
+ */
693
+ async getHotEvents() {
694
+ var _a;
695
+ const url = this.url(`/hotevents`, api.LINE);
696
+ // console.log(url)
697
+ return (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
698
+ }
699
+ /**
700
+ * Получает предматчевое событие по его ID.
701
+ * @param eventId - Идентификатор события.
702
+ * @returns Объект предматчевого события.
703
+ */
704
+ async getEventPrematch(eventId) {
705
+ var _a;
706
+ const url = this.url(`/event/${eventId}`, api.LINE);
707
+ const list = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : {};
708
+ // console.log(list);
709
+ return list;
710
+ }
711
+ /**
712
+ * Retrieves prematch tournaments based on the specified sport ID and minutes.
713
+ * @param sportId - The ID of the sport.
714
+ * @param minutes - The number of minutes ago for which data is to be retrieved.
715
+ * @returns A filtered list of prematch tournaments.
716
+ */
717
+ async getPrematchTournamentsByMinutes(sportId = 0, minutes = 0) {
718
+ var _a;
719
+ const url = this.url(`/events/full/sport${sportId}/${minutes}`, api.LINE);
720
+ const list = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
721
+ return list;
722
+ // return list.filter((item: any) => (item?.EventsHeaders ?? []).length > 0)
723
+ }
724
+ /**
725
+ * Retrieves the headers of prematch tournaments based on the specified sport ID and minutes.
726
+ * @param sportId The ID of the sport. Defaults to 0 if not provided.
727
+ * @param minutes - The number of minutes ago for which data is to be retrieved.
728
+ * @returns A promise that resolves to an array of tournament headers.
729
+ */
730
+ async getPrematchTournamentsHeadersByMinutes(sportId = 0, minutes = 0) {
731
+ var _a;
732
+ // const hours = Math.round(minutes / 60);
733
+ const url = this.url(`/tournaments/headers/sport${sportId}/${minutes}`, api.LINE);
734
+ const list = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : [];
735
+ // console.log(list);
736
+ return list;
737
+ }
738
+ /**
739
+ * Sets or resets the live timestamp reset flag.
740
+ *
741
+ * @param value - Whether to enable live timestamp reset. Defaults to true.
742
+ */
743
+ liveTimestampReset(value = true) {
744
+ this._liveTimestampReset = value;
745
+ }
746
+ // #endregion API Line --------------------------------------------------------------------
747
+ // #region API Live --------------------------------------------------------------------
748
+ /**
749
+ * Получает массив заголовков live событий с главными ставки.
750
+ * @description Для интервального выполнения запроса используется параметр ```this.liveTimestamp```
751
+ * который хранится в этом классе. После выполнения запроса, ```this.liveTimestamp```
752
+ * обновляется из ответа.
753
+ * @param requestFullEventsList - Флаг, указывающий, нужно ли запрашивать
754
+ * полный список событий или только изменения после предыдущего запроса.
755
+ * @param events - Массив ID live событий. В этом случае выбранные live события возвращаются со всеми ставками.
756
+ * @returns Промис, который разрешается в массив данных о live событиях.
757
+ */
758
+ async getLive(requestFullEventsList = false, events = []) {
759
+ var _a;
760
+ let liveRecivedIsFullPackage = false;
761
+ if (requestFullEventsList || this._liveTimestampReset === true) {
762
+ this.liveTimestamp = 0;
763
+ this.liveTimestampReset(false);
764
+ }
765
+ const url = this.url(`/full/${this.liveTimestamp}/0`, api.LIVE);
766
+ const { data, status /* , statusText */ } = await this.request(url).GET().query({ events }).exec();
767
+ const { TimeStamp, LEvents, IsChanges, Error } = data !== null && data !== void 0 ? data : {};
768
+ if (IsChanges === false) {
769
+ liveRecivedIsFullPackage = true;
770
+ }
771
+ else {
772
+ liveRecivedIsFullPackage = false;
773
+ }
774
+ if (status === 200) {
775
+ this.liveTimestamp = (_a = TimeStamp !== null && TimeStamp !== void 0 ? TimeStamp : this.liveTimestamp) !== null && _a !== void 0 ? _a : 0;
776
+ }
777
+ else {
778
+ this.liveTimestamp = 0;
779
+ }
780
+ return Object.assign({ ts: +this.liveTimestamp, events: LEvents !== null && LEvents !== void 0 ? LEvents : [], isFullPackage: liveRecivedIsFullPackage }, (Error ? { Error } : {}));
781
+ }
782
+ /**
783
+ * Возвращает массив из одного полного лайв события со всеми ставками по ID .
784
+ * @param eventId - ID полного live события.
785
+ * @returns Массив с информацией о событии.
786
+ */
787
+ async getLiveEventsAndFullEvent(eventId) {
788
+ var _a;
789
+ const url = this.url(`/bets/${eventId}`, api.LIVE);
790
+ const event = (_a = (await this.GET(url, {}, {}))) !== null && _a !== void 0 ? _a : {};
791
+ // console.log(list);
792
+ return [event];
793
+ }
794
+ /**
795
+ * Возвращает полное лайв событие со всеми ставками по ID .
796
+ * @param eventId - ID полного live события.
797
+ * @returns Массив с информацией о событии.
798
+ */
799
+ async getLiveEventFull(eventId) {
800
+ const url = this.url(`/bets/${eventId}`, api.LIVE);
801
+ const { data /*, status , statusText */ } = await this.request(url).exec();
802
+ // console.log(data);
803
+ return data !== null && data !== void 0 ? data : null;
804
+ }
805
+ // #endregion API Live --------------------------------------------------------------------
806
+ // #region ---- API V2Betting --------------------------------------------------------------------
807
+ /**
808
+ * Получает ограничения на ставку.
809
+ * @returns Объект с минимальным и максимальным значением ограничений на ставки.
810
+ */
811
+ async getBetsLimits() {
812
+ const url = this.url(`/betting/GetLimitations`, api.V2);
813
+ const res = await this.GET(url);
814
+ // console.log('getBetsLimits >>>> ', res);
815
+ return res !== null && res !== void 0 ? res : { Min: 0, Max: 0 };
816
+ // if (this.isSinged) {
817
+ // }
818
+ // return { Min: -Infinity, Max: Infinity };
819
+ }
820
+ /**
821
+ * Добавляет ставку в купон.
822
+ * @param basket - Корзина с информацией о ставке.
823
+ * @returns Результат операции добавления в бетслип или null, если операция не удалась.
824
+ */
825
+ async addToBetslip(basket) {
826
+ basket.culture = this.locale;
827
+ const url = this.url(`/betting/AddToBetslip`, api.V2);
828
+ const res = await this.POST(url, basket);
829
+ return res !== null && res !== void 0 ? res : null;
830
+ }
831
+ /**
832
+ * Добавляет бонус в купон.
833
+ * @param odd - Коэффициент, к которому добавляется бонус.
834
+ * @returns Результат операции или null, если результат не определен.
835
+ */
836
+ async addBonus(odd) {
837
+ const url = this.url(`/betting/AddBonus`, api.V2);
838
+ const res = await this.POST(url, {}, { odd });
839
+ console.log('addBonus >>>> ', res);
840
+ return res !== null && res !== void 0 ? res : null;
841
+ }
842
+ /**
843
+ * Удаляет бонус из купона.
844
+ * @returns {Promise<boolean>} Возвращает true, если бонус успешно удален, в противном случае возвращает false.
845
+ */
846
+ async removeBonus() {
847
+ const url = this.url(`/betting/DeleteBonus`, api.V2);
848
+ const res = await this.POST(url);
849
+ console.log('removeBonus >>>> ', res);
850
+ return res !== null && res !== void 0 ? res : false;
851
+ }
852
+ /**
853
+ * Удаляет ставку из купона.
854
+ * @param basket - Объект, содержащий информацию о купоне.
855
+ * @returns Возвращает true, если элемент успешно удален, в противном случае возвращает false.
856
+ */
857
+ async removeFromBetslip(basket) {
858
+ const url = this.url(`/betting/RemoveFromBetslip`, api.V2);
859
+ const res = await this.POST(url, basket);
860
+ return res || false;
861
+ }
862
+ /**
863
+ * Обновляет ставку в купоне.
864
+ * @param basket - Корзина с информацией о ставке.
865
+ * @returns Возвращает true, если ставка была успешно обновлена, в противном случае возвращает false.
866
+ */
867
+ async updateBet(basket) {
868
+ basket.culture = this.locale;
869
+ const url = this.url(`/betting/UpdateBet`, api.V2);
870
+ const res = await this.POST(url, basket);
871
+ return res === null;
872
+ }
873
+ /**
874
+ * Получает информацию о билете.
875
+ * @description Требует авторизации.
876
+ * @returns {Promise<Betslip | null>} Объект с информацией о билете или null, если токен не установлен.
877
+ * @example
878
+ * ```typescript
879
+ {
880
+ BetslipType: 0,
881
+ Bets: [],
882
+ RecommendedAmount: 0,
883
+ bonuses: [
884
+ [ 'Koef', 9, 1.01 ],
885
+ [ 'Koef', 20, 1.02 ],
886
+ [ 'Koef', 50, 1.03 ],
887
+ [ 'Koef', 100, 1.04 ],
888
+ [ 'Koef', 200, 1.05 ],
889
+ [ 'Koef', 500, 1.06 ],
890
+ [ 'Kolvo', 5, 1.01 ],
891
+ [ 'Kolvo', 9, 1.02 ],
892
+ [ 'Kolvo', 22, 1.03 ],
893
+ [ 'Kolvo', 11, 1.04 ],
894
+ [ 'Kolvo', 13, 1.05 ],
895
+ [ 'Kolvo', 15, 1.06 ],
896
+ [ 'Perestavka', true, 1.03 ],
897
+ [ 'MinOdds', true, 1.02 ]
898
+ ]
899
+ }
900
+ * ```
901
+ */
902
+ async getBetslip() {
903
+ var _a, _b;
904
+ const url = this.url(`/betting/GetBetslip`, api.V2);
905
+ const res = await this.GET(url, {});
906
+ res['bonuses'] = this.convertBonuses((_a = res === null || res === void 0 ? void 0 : res.Bonus) !== null && _a !== void 0 ? _a : {});
907
+ (_b = res.Bets) !== null && _b !== void 0 ? _b : (res.Bets = []);
908
+ delete res.Bonus;
909
+ return res !== null && res !== void 0 ? res : {};
910
+ }
911
+ /**
912
+ * Очищает купон.
913
+ * @returns Промис, который разрешается в логическое значение, указывающее на успешность операции.
914
+ */
915
+ async clearBetslip() {
916
+ const url = this.url(`/betting/ClearBetslip`, api.V2);
917
+ const res = await this.POST(url, {});
918
+ return res !== null && res !== void 0 ? res : false;
919
+ }
920
+ /**
921
+ * Изменяет тип купона.
922
+ * @param betslipType - Тип купона.
923
+ * @returns Возвращает true, если тип купона успешно изменен, в противном случае возвращает false.
924
+ */
925
+ async changeBetslipType(betslipType) {
926
+ const url = this.url(`/betting/ChangeBetslipType`, api.V2);
927
+ const res = await this.POST(url, {}, { betslipType });
928
+ return res !== null && res !== void 0 ? res : false;
929
+ }
930
+ /**
931
+ * Создает купон для размещения ставки.
932
+ * @param betslip - Массив с информацией о ставках.
933
+ * @param amount - Сумма ставки.
934
+ * @param acceptCahngeCoefs - Флаг, указывающий, принимать ли изменения коэффициентов.
935
+ * @param systemIndex - Размер системы (например, из 3-х событий по 2, значит передаем 2). Значение по умолчанию: -1 (если не система).
936
+ * @returns Созданный купон для размещения ставки.
937
+ */
938
+ createCoupon(betslip, amount, acceptCahngeCoefs, systemIndex = -1) {
939
+ var _a, _b, _c, _d, _e;
940
+ const coupon = {
941
+ betAmount: amount,
942
+ // "realAmount": amount,
943
+ // "bonusAmount": bonusSum,
944
+ // "totalCoef": totalOdds,
945
+ doAcceptOddsChanges: acceptCahngeCoefs,
946
+ statuses: {},
947
+ systemIndex: systemIndex, // systemIndex - размер системы (например из 3-х событий по 2, значит передаем 2) -1 если не система
948
+ };
949
+ for (let i = 0; i < betslip.length; i++) {
950
+ const v = betslip[i];
951
+ const betName = [(_a = v.LinesID) !== null && _a !== void 0 ? _a : 'null', (_b = v.BetVarID) !== null && _b !== void 0 ? _b : 'null', (_c = v.HandSize) !== null && _c !== void 0 ? _c : 'null', (_d = v.Add1) !== null && _d !== void 0 ? _d : 'null', (_e = v.Add2) !== null && _e !== void 0 ? _e : 'null'].join('_');
952
+ coupon.statuses[betName] = true;
953
+ }
954
+ return coupon;
955
+ }
956
+ /**
957
+ * Ставит ставку.
958
+ * @param payload - Параметры размещения ставки.
959
+ * @returns Результат размещения ставки.
960
+ */
961
+ async placeCoupon(payload) {
962
+ if (this.isSinged) {
963
+ const url = this.url(`/betting/PlaceBet`, api.V2);
964
+ const res = await this.POST(url, payload);
965
+ return res;
966
+ }
967
+ return;
968
+ }
969
+ /**
970
+ * Удаляет купон по указанному коду в течении 10 минут.
971
+ *
972
+ * @param {string} code - Код купона, который необходимо удалить.
973
+ * @returns {Promise<any | null>} Объект ответа или null, если пользователь не авторизован.
974
+ */
975
+ async deleteCoupon(code) {
976
+ const url = this.url(`/betting/DeleteBet`, api.V2);
977
+ const { data, status, statusText } = await this.request(url).query({ code }).exec();
978
+ // console.log('deleteCoupon data:', data , status , statusText);
979
+ return this.responseHandlerData(data, status, statusText);
980
+ }
981
+ /**
982
+ * Устанавливает настройки корзины ставок.
983
+ * @param betslipSettings - Настройки купона ставок.
984
+ * @returns Массив результатов или пустой массив, если пользователь не авторизован.
985
+ */
986
+ async setBetslipSettings(betslipSettings) {
987
+ if (this.isSinged) {
988
+ const url = this.url(`/betting/SetBetslipSettings`, api.V2);
989
+ const res = await this.POST(url, betslipSettings);
990
+ return res !== null && res !== void 0 ? res : [];
991
+ }
992
+ return [];
993
+ }
994
+ /**
995
+ * Получает список ставок пользователя, доступных для кэшаута.
996
+ * @returns Список ставок пользователя, доступных для кэшаута.
997
+ */
998
+ async getUserCashoutBets() {
999
+ // !TODO getUserCashoutBets - проверить
1000
+ if (this.isSinged) {
1001
+ const url = this.url(`/betting/GetUserCashoutBets`, api.V2);
1002
+ const res = await this.GET(url, { culture: this.locale });
1003
+ return res !== null && res !== void 0 ? res : [];
1004
+ }
1005
+ return [];
1006
+ }
1007
+ /**
1008
+ * Метот делает попытку сделать CashOut для ставки
1009
+ * @param betId - ID ставки.
1010
+ * @returns Объект с ошибками, если возникли ошибки при выполнении запроса, или null, если запрос выполнен успешно.
1011
+ */
1012
+ async returnCashOutBet(betId) {
1013
+ if (this.isSinged) {
1014
+ const url = this.url(`/betting/CashOutReturnBet`, api.V2);
1015
+ const res = await this.POST(url, {}, { betId });
1016
+ return res !== null && res !== void 0 ? res : null;
1017
+ }
1018
+ return null;
1019
+ }
1020
+ async payBet(payload) {
1021
+ if (this.isSinged) {
1022
+ const url = this.url(`/betting/PayBet`, api.V2);
1023
+ const res = await this.POST(url, {}, payload);
1024
+ return res !== null && res !== void 0 ? res : null;
1025
+ }
1026
+ return null;
1027
+ }
1028
+ // #endregion ---- API V2Betting --------------------------------------------------------------------
1029
+ /**
1030
+ * Retrieves the user's balance.
1031
+ * @returns A promise that resolves to the user's balance.
1032
+ */
1033
+ async balance() {
1034
+ if (this.isSinged) {
1035
+ const url = this.url(`/account/GetUserBalance`, api.V2);
1036
+ const res = await this.GET(url);
1037
+ // console.log('balance:', res);
1038
+ return res !== null && res !== void 0 ? res : {};
1039
+ }
1040
+ return {};
1041
+ }
1042
+ /**
1043
+ *
1044
+ * @returns
1045
+ * item1 = Лимит кассы на постановку ставки
1046
+ * item2 = Frozzen balanse
1047
+ * ```
1048
+ * { item1: 10000, currence1: '₴', item2: 2371, currence2: '₴' }
1049
+ * ```
1050
+ */
1051
+ async balanceCashPoint() {
1052
+ if (this.isSinged) {
1053
+ const url = this.url(`/account/GetFinPointBalance`, api.V2);
1054
+ const { data, status, statusText } = await this.request(url).exec();
1055
+ return { data, status, statusText };
1056
+ }
1057
+ return { data: null, status: 401, statusText: 'Unauthorized' };
1058
+ }
1059
+ /**
1060
+ * Возвращает подробности ставки по номеру купона
1061
+ * @param code
1062
+ * @returns Объект, содержащий данные, статус и текст статуса ответа.
1063
+ * ```
1064
+ * { data, status, statusText }
1065
+ *
1066
+ * ```
1067
+ *
1068
+ */
1069
+ async getBetByCoupon(code, locale) {
1070
+ var _a;
1071
+ const url = this.url(`/betting/GetBet`, api.V2);
1072
+ // const url = this.url(`https://exam_plex.com`, api.V2);
1073
+ const lLocale = (_a = locale !== null && locale !== void 0 ? locale : this.locale) !== null && _a !== void 0 ? _a : I.ELocales.en;
1074
+ const query = {
1075
+ code,
1076
+ culture: lLocale,
1077
+ };
1078
+ const { data, status, statusText } = await this.request(url).query(query).exec();
1079
+ return { data, status, statusText };
1080
+ }
1081
+ /**
1082
+ * Выполняет погашение ставки.
1083
+ * @param payload - Параметры для погашения ставки.
1084
+ * ```
1085
+ * {
1086
+ * BetId: number;
1087
+ * AmountOut: number;
1088
+ * }
1089
+ * ```
1090
+ * @returns Результат выполнения погашения ставки.
1091
+ */
1092
+ async redeemTheBet(payload) {
1093
+ const url = this.url(`/betting/RedeemTheBet`, api.V2);
1094
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1095
+ return { data, status, statusText };
1096
+ }
1097
+ async getLimitForPoint() {
1098
+ const url = this.url(`/account/GetLimitForPoint`, api.V2);
1099
+ const res = await this.GET(url);
1100
+ // console.log('getAllHandbooks:', res);
1101
+ return res !== null && res !== void 0 ? res : {};
1102
+ }
1103
+ /**
1104
+ * Выполняет выход пользователя из системы.
1105
+ * @returns Объект, содержащий информацию об успешности выхода и статусе авторизации пользователя.
1106
+ */
1107
+ async logout() {
1108
+ const url = this.url(`/Logout`, api.OFFICE);
1109
+ const res = await this.GET(url);
1110
+ const resOk = (res === false);
1111
+ this.user = {};
1112
+ this.token = undefined;
1113
+ return {
1114
+ ok: resOk,
1115
+ isLogged: resOk ? res : false,
1116
+ };
1117
+ }
1118
+ /**
1119
+ * Изменяет пароль пользователя.
1120
+ * @param payload - Объект, содержащий данные для изменения пароля. Doc: https://betseller.gitlab.io/bb-api-platforma/interfaces/Types.IChangePasswordOfficePayload.html
1121
+ * @returns Возвращает `null` в случае, если пользователь не авторизован.
1122
+ */
1123
+ async changePassword(payload) {
1124
+ var _a;
1125
+ if (this.isSinged) {
1126
+ const url = this.url(`/ChangePassword`, api.OFFICE);
1127
+ const res = await this.POST(url, payload);
1128
+ // console.log(res);
1129
+ return {
1130
+ ok: !res.IsError || false,
1131
+ status: (_a = res.ErrorCode) !== null && _a !== void 0 ? _a : 5001
1132
+ };
1133
+ }
1134
+ return {
1135
+ ok: false,
1136
+ status: 5001
1137
+ };
1138
+ }
1139
+ async setRemoteLanguage(lang) {
1140
+ lang !== null && lang !== void 0 ? lang : (lang = this.lang);
1141
+ return await this.setLanguageRemoteLocale(lang);
1142
+ }
1143
+ /**
1144
+ * Получает содержимое ставки по идентификатору.
1145
+ * @param betId - Идентификатор ставки.
1146
+ * @returns Содержимое ставки.
1147
+ */
1148
+ async getBetContent(betId) {
1149
+ const payload = {
1150
+ id: betId,
1151
+ culture: this.locale
1152
+ };
1153
+ if (this.isSinged) {
1154
+ const url = this.url(`/account/GetBetContent`, api.V2);
1155
+ const res = await this.GET(url, payload);
1156
+ return res;
1157
+ }
1158
+ return {};
1159
+ }
1160
+ /**
1161
+ * Получает содержимое ставки по идентификатору.
1162
+ * @param betId - Идентификатор ставки.
1163
+ * @returns Содержимое ставки.
1164
+ */
1165
+ async getBetContentByLang(betId, lang = 'en') {
1166
+ const payload = {
1167
+ id: betId,
1168
+ culture: this._locales[lang] || 'en-US'
1169
+ };
1170
+ if (this.isSinged) {
1171
+ const url = this.url(`/account/GetBetContent`, api.V2);
1172
+ const res = await this.GET(url, payload);
1173
+ return res;
1174
+ }
1175
+ return {};
1176
+ }
1177
+ /**
1178
+ * Получает ставки пользователя.
1179
+ * @param payload - Параметры запроса.
1180
+ * @returns Промис, который разрешается с результатом запроса.
1181
+ * @note Размер страницы должен быть не больше 20 строк на страницу
1182
+ * @deprecated Use getUserBets02 method
1183
+ */
1184
+ async getUserBets(payload) {
1185
+ /**
1186
+ !TODO при больших значениях страниц метод зависает, потому, что требуется
1187
+ очень много переводов. Я ограничил страницу 20 записей.
1188
+ * Необходима оптимизация на сервере
1189
+ */
1190
+ Object.assign(payload, { culture: this.locale });
1191
+ if (this.isSinged) {
1192
+ const url = this.url(`/account/GetUserBets`, api.V2);
1193
+ const res = await this.GET(url, payload);
1194
+ return res;
1195
+ }
1196
+ return;
1197
+ }
1198
+ /**
1199
+ * Получает ставки пользователя.
1200
+ * @param payload - Параметры запроса.
1201
+ * @returns Промис, который разрешается с результатом запроса.
1202
+ * @note Размер страницы должен быть не больше 20 строк на страницу
1203
+ * @deprecated Use getUserBets02 method
1204
+ */
1205
+ async getUserBets02(payload) {
1206
+ /**
1207
+ !TODO при больших значениях страниц метод зависает, потому, что требуется
1208
+ очень много переводов. Я ограничил страницу 20 записей.
1209
+ * Необходима оптимизация на сервере
1210
+ */
1211
+ Object.assign(payload, { culture: this.locale });
1212
+ if (this.isSinged) {
1213
+ const url = this.url(`/account/GetUserBets`, api.V2);
1214
+ const { data: rawData, status, statusText } = await this.request(url).query(payload).exec();
1215
+ const data = rawData !== null && rawData !== void 0 ? rawData : null;
1216
+ const error = status !== 200 ? statusText : null;
1217
+ return { data, error, status, statusText };
1218
+ }
1219
+ return { data: null, error: 'Unauthorized', status: 401, statusText: 'Unauthorized' };
1220
+ }
1221
+ /**
1222
+ * Fetches user bets with administrative filters and pagination.
1223
+ *
1224
+ * @param payload - The payload containing pagination and filter information.
1225
+ * @returns A promise that resolves to an object containing the data, error, status, and statusText.
1226
+ *
1227
+ * @template I.IPaginationPayload<I.IUsersBetsAdmPayload> - The type of the pagination payload.
1228
+ * @template { data: any; error: string | string[] | null; status: number; statusText: string; } - The return type of the promise.
1229
+ *
1230
+ * @example
1231
+ * ```typescript
1232
+ * const payload = {
1233
+ * Filter: {
1234
+ * DateStart: "2024-11-01T00:00:00", // in 'Europe/Kiev' timezone
1235
+ * DateEnd: "2024-11-16T00:00:00", // in 'Europe/Kiev' timezone
1236
+ * UserId: 123,
1237
+ * // other filter fields...
1238
+ * },
1239
+ * PageNumber: 1,
1240
+ * PageSize: 20,
1241
+ * };
1242
+ * const result = await getUserBetsAdm(payload);
1243
+ * console.log(result.data);
1244
+ * ```
1245
+ */
1246
+ async getUserBetsAdm(payload) {
1247
+ const defaultPayload = {
1248
+ "Filter": {
1249
+ /** Format: "2024-11-01T00:00:00", // in 'Europe/Kiev' timezone */
1250
+ "DateStart": "",
1251
+ /** Format: "2024-11-01T00:00:00", // in 'Europe/Kiev' timezone */
1252
+ "DateEnd": "",
1253
+ "UserId": null,
1254
+ "PointIds": [],
1255
+ "RepaymentDate": null,
1256
+ "LiveOnly": null,
1257
+ "ShowAll": true,
1258
+ "ShowWinBets": null,
1259
+ "ShowLossBets": null,
1260
+ "ShowWorkBets": null,
1261
+ "ShowRepaymentBets": null,
1262
+ "ShowNotRepaymentBets": null,
1263
+ "ShowPerestavBets": null,
1264
+ "ShowKontoraBets": null,
1265
+ "ShowReturnBets": null,
1266
+ "IsKontoraMoney": null,
1267
+ "InServerCurrency": null,
1268
+ "BetSum": null,
1269
+ "FiscalBill": null,
1270
+ /** Sort: 0 | null - Date DESC; 1 - Amount DESC */
1271
+ "SortType": null,
1272
+ "HideRemoved": true,
1273
+ "Amount": null,
1274
+ "ShowRemoved": false
1275
+ },
1276
+ "PageNumber": 0,
1277
+ "PageSize": 10,
1278
+ };
1279
+ defaultPayload.Filter = Object.assign({}, defaultPayload.Filter, payload.Filter);
1280
+ defaultPayload.PageNumber = (payload === null || payload === void 0 ? void 0 : payload.PageNumber) ? payload.PageNumber : 0;
1281
+ defaultPayload.PageSize = (payload === null || payload === void 0 ? void 0 : payload.PageSize) ? payload.PageSize : 10;
1282
+ // console.log('```');
1283
+ // console.log(JSON.stringify(defaultPayload, null, 2));
1284
+ // console.log('```');
1285
+ // Object.assign(payload, {culture: this.locale});
1286
+ const url = this.url(`/UserBets`, api.OFFICE);
1287
+ const { data, status, statusText } = await this.request(url).POST(defaultPayload).exec();
1288
+ // return { data, error, status, statusText };
1289
+ return this.responseHandlerData(data, status, statusText);
1290
+ }
1291
+ /** Конвертирует различные представления корзины в единый формат
1292
+ * @param betslipItem - элемент корзины
1293
+ */
1294
+ convertBasketToPost(betslipItem) {
1295
+ return {
1296
+ a1: betslipItem.Add1,
1297
+ a2: betslipItem.Add2,
1298
+ bId: betslipItem.BetVarID,
1299
+ eId: betslipItem.LinesID,
1300
+ fs: betslipItem.HandSize,
1301
+ isLive: betslipItem.IsLive,
1302
+ r: betslipItem.Odds,
1303
+ };
1304
+ }
1305
+ /**
1306
+ * Преобразует бонусы в массив.
1307
+ * @param bonus Объект, содержащий бонусы.
1308
+ * @returns Массив бонусов.
1309
+ */
1310
+ convertBonuses(bonus) {
1311
+ let bonuses = [];
1312
+ Object.keys(bonus).forEach(k => {
1313
+ const koefMatch = k.match(/B_Koef(\d)_Value/);
1314
+ if (koefMatch) {
1315
+ const num = koefMatch[1];
1316
+ bonuses.push(['Koef', bonus[`B_Koef${num}`], bonus[`B_Koef${num}_Value`]]);
1317
+ }
1318
+ const kolvoMatch = k.match(/B_Kolvo(\d)_Value/);
1319
+ if (kolvoMatch) {
1320
+ const num = kolvoMatch[1];
1321
+ bonuses.push(['Kolvo', bonus[`B_Kolvo${num}`], bonus[`B_Kolvo${num}_Value`]]);
1322
+ }
1323
+ if (k === 'B_Perestavka_Value') {
1324
+ bonuses.push(['Perestavka', true, bonus[`B_Perestavka_Value`]]);
1325
+ }
1326
+ if (k === 'B_MinOdds') {
1327
+ bonuses.push(['MinOdds', true, bonus[`B_MinOdds`]]);
1328
+ }
1329
+ });
1330
+ return bonuses;
1331
+ }
1332
+ /**
1333
+ * Получает полные данные о текущих событиях в режиме реального времени без сохранения временной метки.
1334
+ * @returns Промис, который разрешается в массив объектов типа I.ILiveData.
1335
+ */
1336
+ async getFullLiveWithoutSaveTimeStamp() {
1337
+ const url = this.url(`/full/0/0`, api.LIVE);
1338
+ const { data } = await this.request(url).GET().exec();
1339
+ const { LEvents } = data !== null && data !== void 0 ? data : {};
1340
+ return LEvents !== null && LEvents !== void 0 ? LEvents : [];
1341
+ }
1342
+ /**
1343
+ * Retrieves sports events (live & prematch) based on the provided search text.
1344
+ * @param searchText - The text to search for.
1345
+ * @returns A promise that resolves to an array of ISearchEventsData.
1346
+ */
1347
+ async getSportsEventsSearch(searchText) {
1348
+ var _a, _b;
1349
+ if (!searchText)
1350
+ return [];
1351
+ const url = this.url(`/SearchFullByCulture`, api.LINE);
1352
+ const [preDraft, liveDraft] = await Promise.all([
1353
+ (_a = this.GET(url, { searchText })) !== null && _a !== void 0 ? _a : [],
1354
+ (_b = this.getFullLiveWithoutSaveTimeStamp()) !== null && _b !== void 0 ? _b : []
1355
+ ]);
1356
+ const pre = preDraft
1357
+ .filter((v) => v.Type > 1)
1358
+ .map((v) => {
1359
+ var _a;
1360
+ const eventDate = new Date((_a = v === null || v === void 0 ? void 0 : v.Date) !== null && _a !== void 0 ? _a : '');
1361
+ const options = { weekday: 'short', day: '2-digit', month: 'long', hour: '2-digit', minute: '2-digit' };
1362
+ const formattedDate = eventDate.toLocaleDateString(this.locale, options).replace(',', '');
1363
+ return Object.assign(v, {
1364
+ Date: formattedDate,
1365
+ to: { name: 'eventprematch', params: { prEventId: routeNameId(v.Id, v.Name) } },
1366
+ t1: v.Name.split(/\s*\-\s*/)[0],
1367
+ t2: v.Name.split(/\s*\-\s*/)[1],
1368
+ });
1369
+ });
1370
+ // console.log(JSON.stringify(pre, null, 2) /* , liveDraft */);
1371
+ const filter = searchText.toLowerCase();
1372
+ const live = liveDraft
1373
+ .filter((v) => {
1374
+ return (v.Description.NameTeam1.toLowerCase().includes(filter) ||
1375
+ v.Description.NameTeam2.toLowerCase().includes(filter) ||
1376
+ v.Description.TName.toLowerCase().includes(filter));
1377
+ })
1378
+ .map((v) => {
1379
+ const spEvntName = `${v.Description.NameTeam1} vs ${v.Description.NameTeam2} ${v.Description.SportName}`;
1380
+ const eventDate = new Date(v.Description.Date);
1381
+ const options = { weekday: 'short', day: '2-digit', month: 'long', hour: '2-digit', minute: '2-digit' };
1382
+ const formattedDate = eventDate.toLocaleDateString(this.locale, options).replace(',', '');
1383
+ return {
1384
+ CountryId: v.Description.CountryId,
1385
+ Date: formattedDate,
1386
+ Id: +v.Id,
1387
+ Name: spEvntName,
1388
+ PriceNum: v.Description.PriceNum,
1389
+ SportId: v.Description.SportId,
1390
+ SportName: v.Description.SportName,
1391
+ TournamentId: v.Description.TournamentId,
1392
+ TournamentName: v.Description.TName,
1393
+ Type: 3,
1394
+ isLive: true,
1395
+ to: { name: 'eventinplay', params: { prEventId: routeNameId(v.Id, spEvntName) } },
1396
+ t1: v.Description.NameTeam1,
1397
+ t2: v.Description.NameTeam2,
1398
+ };
1399
+ });
1400
+ // console.log(JSON.stringify(live, null, 2) /* , liveDraft */);
1401
+ return [...live, ...pre];
1402
+ }
1403
+ /**
1404
+ * Проверяет авторизацию пользователя.
1405
+ * @returns Объект, содержащий информацию о состоянии авторизации.
1406
+ */
1407
+ async checkAuth() {
1408
+ const url = this.url(`/account/CheckAuthorization`, api.V2);
1409
+ const { data, status, statusText } = await this.request(url).exec();
1410
+ return { isSinged: data === true, status, statusText };
1411
+ }
1412
+ /**
1413
+ * Получает информацию о пользователе.
1414
+ *
1415
+ * @param {I.IGetUserInfoPayload} payload - Параметры запроса, которые могут содержать:
1416
+ * @param {number | string} payload.userAccount - Учетная запись пользователя (необязательный параметр).
1417
+ * @param {string} payload.userName - Имя пользователя (необязательный параметр).
1418
+ * @param {number | string} payload.userId - Идентификатор пользователя (необязательный параметр).
1419
+ *
1420
+ * @returns {Promise<{ userInfo: I.IGetUserInfoResponse | null; error: string | null; status: number; statusText: string; }>} Объект, содержащий информацию о пользователе, статус и текст статуса.
1421
+ *
1422
+ * @example
1423
+ * const payload = {
1424
+ * userAccount: 12345,
1425
+ * userName: 'JohnDoe',
1426
+ * userId: '67890'
1427
+ * };
1428
+ * const result = await getUserInfo(payload);
1429
+ * // Возвращает объект с информацией о пользователе, статусом и текстом статуса.
1430
+ */
1431
+ async getUserInfo(payload) {
1432
+ var _a, _b, _c, _d, _e;
1433
+ payload = Object.assign({}, { userAccount: 0, userName: '', userId: 0 }, payload);
1434
+ const url = this.url(`/account/GetUserInfo`, api.V2);
1435
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1436
+ const userInfo = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1437
+ let error = (_e = ((_d = (_c = data === null || data === void 0 ? void 0 : data.Data) === null || _c === void 0 ? void 0 : _c.Error) !== null && _d !== void 0 ? _d : [])[0]) !== null && _e !== void 0 ? _e : null;
1438
+ error !== null && error !== void 0 ? error : (error = userInfo === null ? 'Unknown error' : null);
1439
+ return { userInfo, error, status, statusText };
1440
+ }
1441
+ /**
1442
+ * Получает информацию о пользователе с транзакциями вывода средств.
1443
+ * @param payload - Параметры запроса.
1444
+ * @returns Объект, содержащий информацию о пользователе, статус и текст статуса.
1445
+ * @example
1446
+ ```
1447
+ IGetUserInfoPayload {
1448
+ userAccount?: number | string;
1449
+ userName?: string;
1450
+ userId?: number | string;
1451
+ }
1452
+ ```
1453
+ */
1454
+ async getUserInfoWithWithdrawalTrans(payload) {
1455
+ var _a, _b, _c, _d, _e;
1456
+ payload = Object.assign({}, { userAccount: 0, userName: '', userId: 0 }, payload);
1457
+ const url = this.url(`/account/GetUserInfoWithWithdrawalTrans`, api.V2);
1458
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1459
+ const userInfo = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1460
+ let error = (_e = ((_d = (_c = data === null || data === void 0 ? void 0 : data.Data) === null || _c === void 0 ? void 0 : _c.Error) !== null && _d !== void 0 ? _d : [])[0]) !== null && _e !== void 0 ? _e : null;
1461
+ error !== null && error !== void 0 ? error : (error = userInfo === null ? 'Unknown error' : null);
1462
+ return { userInfo, error, status, statusText };
1463
+ }
1464
+ /**
1465
+ * Получает список заказов для вывода заказы для вывода.
1466
+ * @returns Объект, содержащий данные о заказах для вывода, статус и текст статуса.
1467
+ */
1468
+ async getOrdersForWithdrawal() {
1469
+ var _a, _b;
1470
+ const url = this.url(`/betting/TakeOrdersForWithdrawal`, api.V2);
1471
+ const { data, status, statusText } = await this.request(url).query({ culture: this.locale }).exec();
1472
+ const withdrawalData = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : [];
1473
+ return { withdrawalData, status, statusText };
1474
+ }
1475
+ /**
1476
+ * Вносит деньги на счет игрока.
1477
+ *
1478
+ * @param {I.IDepositMoneyPayload} payload - Параметры для внесения денег.
1479
+ * @returns {Promise<{ depositInfo: boolean | null; error: string | null; status: number; statusText: string; }>} Объект, содержащий данные, статус и текст статуса.
1480
+ *
1481
+ * @example
1482
+ * const payload = {
1483
+ * userId: 1,
1484
+ * sum: 100
1485
+ * };
1486
+ * const result = await depositMoney(payload);
1487
+ * // Возвращает объект с данными, статусом и текстом статуса.
1488
+ */
1489
+ async depositMoney(payload) {
1490
+ var _a, _b, _c, _d, _e;
1491
+ const url = this.url(`/betting/DepositMoney`, api.V2);
1492
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1493
+ const depositInfo = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1494
+ let error = (_e = ((_d = (_c = data === null || data === void 0 ? void 0 : data.Data) === null || _c === void 0 ? void 0 : _c.Error) !== null && _d !== void 0 ? _d : [])[0]) !== null && _e !== void 0 ? _e : null;
1495
+ error !== null && error !== void 0 ? error : (error = depositInfo === null ? 'Unknown error' : null);
1496
+ return { depositInfo, error, status, statusText };
1497
+ }
1498
+ /**
1499
+ * Метод для вывода денег с баланса игрока.
1500
+ *
1501
+ * @param {I.IWithdrawlMoneyPayload} payload - Параметры вывода денег.
1502
+ * @returns {Promise<{ withdrawlInfo: boolean | null; error: string | null; status: number; statusText: string; }>} Объект, содержащий данные, статус и текст статуса.
1503
+ *
1504
+ * @example
1505
+ * const payload = {
1506
+ * userId: 1,
1507
+ * amount: 100,
1508
+ * code: 'ABC123'
1509
+ * };
1510
+ * const result = await withdrawlMoney(payload);
1511
+ * // Возвращает объект с данными, статусом и текстом статуса.
1512
+ */
1513
+ async withdrawlMoney(payload) {
1514
+ var _a, _b, _c, _d, _e;
1515
+ const url = this.url(`/betting/WithdrawlMoney`, api.V2);
1516
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1517
+ const withdrawlInfo = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1518
+ let error = (_e = ((_d = (_c = data === null || data === void 0 ? void 0 : data.Data) === null || _c === void 0 ? void 0 : _c.Error) !== null && _d !== void 0 ? _d : [])[0]) !== null && _e !== void 0 ? _e : null;
1519
+ error !== null && error !== void 0 ? error : (error = withdrawlInfo === null ? 'Unknown error' : null);
1520
+ return { withdrawlInfo, error, status, statusText };
1521
+ }
1522
+ /**
1523
+ * Метод для вывода денег с баланса игрока с использованием ID транзакции.
1524
+ *
1525
+ * @param {I.IWithdrawlMoneyByTransactionPayload} payload - Параметры вывода денег.
1526
+ * @returns {Promise<{ data: boolean | null; error: string | null; status: number; statusText: string; }>} Объект, содержащий данные, статус и текст статуса.
1527
+ *
1528
+ * @example
1529
+ * const payload = {
1530
+ * userId: 1,
1531
+ * transactionId: 1,
1532
+ * };
1533
+ * const result = await withdrawlMoney(payload);
1534
+ * // Возвращает объект с данными, статусом и текстом статуса.
1535
+ */
1536
+ async withdrawlMoneyByTransaction(payload) {
1537
+ const url = this.url(`/betting/WithdrawlMoneyByTransaction`, api.V2);
1538
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1539
+ return this.responseHandlerData(data, status, statusText);
1540
+ }
1541
+ /**
1542
+ * Проверяет, существует ли пользователь с указанным логином.
1543
+ * @param userName - Логин пользователя.
1544
+ * @returns Объект, содержащий информацию о наличии пользователя.
1545
+ */
1546
+ async isUserExists(userName) {
1547
+ const url = this.url(`/account/IsUserExists`, api.V2);
1548
+ const { data, status, statusText } = await this.request(url).query({ userName }).exec();
1549
+ return { data, status, statusText };
1550
+ }
1551
+ /**
1552
+ * Создает интернет пользователя для кассы !!! напрямую в БД
1553
+ * @param payload - Параметры регистрации пользователя.
1554
+ * @returns Объект, содержащий информацию о результате операции.
1555
+ * @example
1556
+ * const SignUpPayloadDirect: I.TSignUpPayload = {
1557
+ * PartnerSiteUid: "partner.win",
1558
+ * EmailOrPhone: "380671110000", // телефон записываем без "+"
1559
+ * PointId: 85,
1560
+ * Password: "Password",
1561
+ * PasswordRepeat: "Password",
1562
+ * }
1563
+ */
1564
+ async createInternetUser(payload) {
1565
+ var _a, _b;
1566
+ if (payload.CurrencyId) {
1567
+ const clonedCurrencyId = payload.CurrencyId;
1568
+ payload.PointId = clonedCurrencyId;
1569
+ delete payload.CurrencyId;
1570
+ }
1571
+ payload = Object.assign({}, payload, { Culture: this.locale });
1572
+ /** Если указана обычная касса переводим её в разряд интернет касс
1573
+ * через добавление 10000 к идентификатору валюты.
1574
+ */
1575
+ if (!(payload === null || payload === void 0 ? void 0 : payload.PointId)) {
1576
+ return { created: null, error: 'parametersError', status: 200, statusText: '' };
1577
+ }
1578
+ else if (payload.PointId && payload.PointId < 10000) {
1579
+ payload.PointId = payload.PointId + 10000;
1580
+ }
1581
+ const url = this.url(`/account/registrationNewWhithOutEmail`, api.V2);
1582
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1583
+ // console.log(data);
1584
+ const created = (_b = (_a = data === null || data === void 0 ? void 0 : data.Data) === null || _a === void 0 ? void 0 : _a._isSuccessful) !== null && _b !== void 0 ? _b : null;
1585
+ const error = (data === null || data === void 0 ? void 0 : data.Error) || null;
1586
+ return { created, error, status, statusText };
1587
+ }
1588
+ /**
1589
+ * Получает GUID кассира для автологина в офисе .
1590
+ * @returns Объект, содержащий GUID кассира, ошибку, статус и текст статуса.
1591
+ */
1592
+ async getCashierGuid() {
1593
+ var _a, _b, _c, _d;
1594
+ const url = this.url(`/account/GetCashierGuid`, api.V2);
1595
+ const { data, status, statusText } = await this.request(url).exec();
1596
+ const guid = (_a = data === null || data === void 0 ? void 0 : data.Data) !== null && _a !== void 0 ? _a : null;
1597
+ let error = (_d = ((_c = (_b = data === null || data === void 0 ? void 0 : data.Data) === null || _b === void 0 ? void 0 : _b.Error) !== null && _c !== void 0 ? _c : '')[0]) !== null && _d !== void 0 ? _d : null;
1598
+ error !== null && error !== void 0 ? error : (error = guid === null ? 'Unknown error' : null);
1599
+ return { guid, error, status, statusText };
1600
+ }
1601
+ /**
1602
+ * Получает список игроков кассира.
1603
+ * @param {I.ICashierPlayersPayload} payload - Параметры запроса.
1604
+ * @returns {Promise<{ data: I.ICashierPlayersResponse; status:number; statusText:string; }>} - Объект с данными, статусом и текстом статуса.
1605
+ * @example
1606
+ * const payload = {
1607
+ * CurrentPage: 1,
1608
+ * CountItemOnPage: 10
1609
+ * };
1610
+ * const response = await getCashierPlayers(payload);
1611
+ * console.log(response.data); // Выводит данные игроков
1612
+ * console.log(response.status); // Выводит статус ответа
1613
+ * console.log(response.statusText); // Выводит текст статуса ответа
1614
+ */
1615
+ async getCashierPlayers({ CurrentPage, CountItemOnPage }) {
1616
+ const url = this.url(`/GetCashierPlayers`, api.OFFICE);
1617
+ const { data, status, statusText } = await this.request(url).POST({ CurrentPage, CountItemOnPage }).exec();
1618
+ return { data, status, statusText };
1619
+ }
1620
+ /** Получает фильтрованный список ставок на кассе */
1621
+ async getTakedBets(getBetsPayload) {
1622
+ // getBetsPayload = Object.assign({}, {
1623
+ var _a;
1624
+ // }, getBetsPayload);
1625
+ const url = this.url(`/betting/TakeBets`, api.V2);
1626
+ const { data, status, statusText } = await this.request(url).POST(getBetsPayload).exec();
1627
+ // console.log(data);
1628
+ const betsData = (_a = data === null || data === void 0 ? void 0 : data.Data) !== null && _a !== void 0 ? _a : null;
1629
+ let error = (data === null || data === void 0 ? void 0 : data.Error) || null;
1630
+ error !== null && error !== void 0 ? error : (error = betsData === null ? 'Unknown error' : null);
1631
+ return { betsData, error, status, statusText };
1632
+ }
1633
+ async getBetsStatistic(betsStatisticPayload) {
1634
+ const url = this.url(`/betting/BetsStatistic`, api.V2);
1635
+ const { data, status, statusText } = await this.request(url).POST(betsStatisticPayload).exec();
1636
+ // console.log(data);
1637
+ const error = (data === null || data === void 0 ? void 0 : data.Error) || (!data ? 'Unknown error' : null);
1638
+ return { data, error, status, statusText };
1639
+ }
1640
+ async getMainFinanceReport(betsStatisticPayload) {
1641
+ var _a;
1642
+ const url = this.url(`/report/MainFinanceReport`, api.V2);
1643
+ const { data: rawData, status, statusText } = await this.request(url).POST(betsStatisticPayload).exec();
1644
+ const data = (_a = rawData === null || rawData === void 0 ? void 0 : rawData.Data) !== null && _a !== void 0 ? _a : null;
1645
+ const error = (rawData === null || rawData === void 0 ? void 0 : rawData.Error) || (!data ? 'Unknown error' : null);
1646
+ return { data, error, status, statusText };
1647
+ }
1648
+ /** Возвращает справочники
1649
+ * @example
1650
+ * ```
1651
+ * {
1652
+ Culture: string;
1653
+ HandBooks: ('Roles' | 'AccessRoles' | 'Pointers' | 'PointersGroups' | 'PlayerLevel' | 'Languages' | 'SearchType' | 'All')[];
1654
+ }
1655
+ * ```
1656
+ * */
1657
+ async getAllHandbooks(payload) {
1658
+ var _a, _b, _c, _d, _e;
1659
+ if (!payload.HandBooks || payload.HandBooks.length === 0) {
1660
+ payload.HandBooks = ['All'];
1661
+ }
1662
+ payload.Culture = this.locale;
1663
+ const url = this.url(`/GetAllHandbooks`, api.OFFICE);
1664
+ // const res = await this.POST(url, payload);
1665
+ const { data: rawData, status, statusText } = await this.request(url).POST(payload).exec();
1666
+ const data = (_b = (_a = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1667
+ const error = (_e = ((_d = (_c = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _c === void 0 ? void 0 : _c.Error) !== null && _d !== void 0 ? _d : [])[0]) !== null && _e !== void 0 ? _e : (!rawData ? 'Unknown error' : null);
1668
+ // console.log('getAllHandbooks:', data);
1669
+ return { data, error, status, statusText };
1670
+ }
1671
+ async getAvailableHandBooks() {
1672
+ var _a;
1673
+ // !TODO Проверимть. Там какие-то баги. Список касс отдаётся не полняй
1674
+ const url = this.url(`/GetAvailableHandBooks`, api.OFFICE);
1675
+ const { data: rawData, status, statusText } = await this.request(url).GET().exec();
1676
+ // console.log('getAllHandbooks:', res);
1677
+ const data = (_a = rawData === null || rawData === void 0 ? void 0 : rawData.Data) !== null && _a !== void 0 ? _a : null;
1678
+ const error = (rawData === null || rawData === void 0 ? void 0 : rawData.Error) || (!rawData ? 'Unknown error' : null);
1679
+ return { data, error, status, statusText };
1680
+ }
1681
+ /** Создаёт пользователя из Temp таблицы */
1682
+ async createUserFromTempGetInfo(userName) {
1683
+ var _a, _b;
1684
+ const url = this.url(`/account/CreateUserFromTempGetInfo`, api.V2);
1685
+ const { data: rawData, status, statusText } = await this.request(url).GET().query({ userName }).exec();
1686
+ // console.log('rawData:', rawData);
1687
+ const data = (_b = (_a = rawData === null || rawData === void 0 ? void 0 : rawData.Data) === null || _a === void 0 ? void 0 : _a.Data) !== null && _b !== void 0 ? _b : null;
1688
+ const error = (rawData === null || rawData === void 0 ? void 0 : rawData.Error) || (!rawData ? 'Unknown error' : null);
1689
+ return { data, error, status, statusText };
1690
+ }
1691
+ /** Возвращает данные незарегистрированного пользователя из временной таблицы */
1692
+ async getUserInfoFromTemp(userName) {
1693
+ const url = this.url(`/account/GetUserInfoFromTemp`, api.V2);
1694
+ const { data, status, statusText } = await this.request(url).GET().query({ userName }).exec();
1695
+ return this.responseHandlerData(data, status, statusText);
1696
+ }
1697
+ async getBaseRates(baseCurrency) {
1698
+ /* ! Надо быть внимательным /gwapi это интегрированный API от Crypto GW */
1699
+ const url = this.url(`/gwapi/exchange/coinbase/${baseCurrency}`, api.BASE);
1700
+ const { data, status, statusText } = await this.request(url).GET().exec();
1701
+ return { data, status, statusText };
1702
+ }
1703
+ /**
1704
+ * Асинхронно получает список пользователей.
1705
+ *
1706
+ * @param {I.IPaginationPayload<I.IGetUsersListFilter>} payload - Параметры запроса для получения списка пользователей. https://betseller.gitlab.io/bb-api-platforma/interfaces/Types.IGetUsersListPayload.html
1707
+ * @returns {Promise<I.IApiResponse<I.IGetUsersListData> | null>} Объект ответа API, содержащий данные списка пользователей, или null в случае ошибки.
1708
+ */
1709
+ async getUsersList(payload) {
1710
+ const url = this.url(`/TakeUsers`, api.OFFICE);
1711
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1712
+ // console.log('deleteCoupon data:', data , status , statusText);
1713
+ return this.responseHandlerData(data, status, statusText);
1714
+ }
1715
+ /**
1716
+ * Асинхронно получает список Касс.
1717
+ *
1718
+ * @param payload - Параметры пагинации и фильтрации для получения списка точек.
1719
+ * @returns Обработанный ответ API, содержащий страницы точек или null.
1720
+ */
1721
+ async getPointsList(payload) {
1722
+ const url = this.url(`/TakePoints`, api.OFFICE);
1723
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1724
+ // console.log('deleteCoupon data:', data , status , statusText);
1725
+ return this.responseHandlerData(data, status, statusText);
1726
+ }
1727
+ /**
1728
+ * Выполняет запрос на снятие денег с аккаунта.
1729
+ *
1730
+ * @param payload - Объект, содержащий данные для снятия денег с аккаунта. https://betseller.gitlab.io/bb-api-platforma/interfaces/Types.IAccountMoneyPayload.html
1731
+ * @returns Промис, который разрешается с данными ответа или null в случае ошибки.
1732
+ */
1733
+ async accountMoneyWithdraw(payload) {
1734
+ const url = this.url(`/AccountMoneyWithdraw`, api.OFFICE);
1735
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1736
+ console.log('accountMoneyWithdraw data:', data, status, statusText);
1737
+ return this.responseHandlerData(data, status, statusText);
1738
+ }
1739
+ /**
1740
+ * Асинхронный метод для добавления денег на счет.
1741
+ *
1742
+ * @param payload - Объект, содержащий данные для добавления денег на счет. https://betseller.gitlab.io/bb-api-platforma/interfaces/Types.IAccountMoneyPayload.html
1743
+ * @returns Обработанный ответ, содержащий данные типа boolean или null.
1744
+ */
1745
+ async accountMoneyAdd(payload) {
1746
+ const url = this.url(`/AccountMoneyAdd`, api.OFFICE);
1747
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1748
+ // console.log('accountMoneyAdd data:', data , status , statusText);
1749
+ return this.responseHandlerData(data, status, statusText);
1750
+ }
1751
+ /**
1752
+ * Sets a password for a cashier on behalf of an Admin, SubAdmin, or Owner.
1753
+ * @param payload - An object containing the data for changing the password. Doc: https://betseller.gitlab.io/bb-api-platforma/interfaces/Types.ISetPasswordOfficePayload.html
1754
+ * @returns Returns `null` if the user is not authorized.
1755
+ */
1756
+ async setPassword(payload) {
1757
+ const url = this.url(`/SetPassword`, api.OFFICE);
1758
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1759
+ // console.log('!!! setPassword data:', data , status , statusText);
1760
+ return this.responseHandlerData(data, status, statusText);
1761
+ }
1762
+ async pingApi() {
1763
+ const url = this.url(`/Ping`, api.OFFICE);
1764
+ const { data, status, statusText } = await this.request(url).exec();
1765
+ // console.log('!!! pingApi:', data , status , statusText);
1766
+ return this.responseHandlerData(data, status, statusText);
1767
+ }
1768
+ /**
1769
+ * Retrieves a list of user transactions.
1770
+ *
1771
+ * @param payload - The payload containing pagination and filter information.
1772
+ * @returns A promise that resolves to the API response containing user transactions or null.
1773
+ *
1774
+ * @remarks
1775
+ * This method sends a POST request to the `/GetUserTransactions` endpoint of the OFFICE API.
1776
+ * * (102)
1777
+ *
1778
+ * @example
1779
+ * ```typescript
1780
+ * const payload = {
1781
+ * page: 0,
1782
+ * pageSize: 10,
1783
+ * Filter: {
1784
+ * DateBeg: string
1785
+ * DateEnd: string;
1786
+ * ...
1787
+ * }
1788
+ * };
1789
+ * const transactions = await api.getUserTransactions(payload);
1790
+ * console.log(transactions);
1791
+ * ```
1792
+ */
1793
+ async getUserTransactions(payload) {
1794
+ // * (102) Список транзакций пользователя /api/v1/office/en-US/GetUserTransactions
1795
+ // !TODO Нет пагинации
1796
+ const url = this.url(`/GetUserTransactions`, api.OFFICE);
1797
+ const { data, status, statusText } = await this.request(url).POST(payload).exec();
1798
+ // console.log('deleteCoupon data:', data , status , statusText);
1799
+ return this.responseHandlerData(data, status, statusText);
1800
+ }
1801
+ /**
1802
+ * Выводит список подтверждённых заказов на вывод средств.
1803
+ *
1804
+ * @remarks
1805
+ * Endpoint: `/api/v1/office/en-US/ConfirmWithdrawalOrder`
1806
+ *
1807
+ * @param payload - Параметры для подтверждения заказа на вывод средств.
1808
+ * @returns Возвращает `true`, если заказ успешно подтвержден, иначе `null`.
1809
+ *
1810
+ * @example
1811
+ * Пример запроса:
1812
+ * ```typescript
1813
+ * const payload: I.IConfirmWithdrawalOrderPayload = {
1814
+ * transactionId: 123456, // ID транзакции
1815
+ * confirmedAmount: 100.50 // Подтвержденная сумма
1816
+ * };
1817
+ *
1818
+ * const result = await api.confirmWithdrawalOrder(payload);
1819
+ * console.log(result); // true или null
1820
+ * ```
1821
+ */
1822
+ async getConfirmedWithdrawalOrders(payload) {
1823
+ var _a, _b, _c, _d;
1824
+ (_a = payload.pointId) !== null && _a !== void 0 ? _a : (payload.pointId = -100);
1825
+ (_b = payload.periodType) !== null && _b !== void 0 ? _b : (payload.periodType = 0);
1826
+ (_c = payload.culture) !== null && _c !== void 0 ? _c : (payload.culture = this.locale);
1827
+ (_d = payload.userName) !== null && _d !== void 0 ? _d : (payload.userName = '');
1828
+ const url = this.url(`/orders/GetConfirmedOrders`, api.V2);
1829
+ const { data, status, statusText } = await this.request(url).query(payload).POST().exec();
1830
+ // console.log('deleteCoupon data:', data , status , statusText);
1831
+ return this.responseHandlerData(data, status, statusText);
1832
+ }
1833
+ /** only Admin & SubAdmin */
1834
+ async getWithdrawalOrdersForConfirmed(payload = {}) {
1835
+ // !TODO не отдаёт все данные
1836
+ // * +(103) Список на подтверждение на вывод /api/v2/orders/GetOrdersWithdrawal
1837
+ payload.culture = this.locale;
1838
+ const url = this.url(`/orders/GetOrdersWithdrawal`, api.V2);
1839
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1840
+ // console.log('deleteCoupon data:', data , status , statusText);
1841
+ return this.responseHandlerData(data, status, statusText);
1842
+ }
1843
+ async сonfirmWithdrawalOrder(payload) {
1844
+ // !TODO непонятны полномочия кассиров
1845
+ // * +(103)
1846
+ const url = this.url(`/orders/ConfirmMoneyOut`, api.V2);
1847
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1848
+ // console.log('deleteCoupon data:', data , status , statusText);
1849
+ return this.responseHandlerData(data, status, statusText);
1850
+ }
1851
+ /**
1852
+ * Cancels a withdrawal order.
1853
+ *
1854
+ * @param payload - The payload containing the details required to cancel the withdrawal order.
1855
+ *
1856
+ * @remarks
1857
+ * This method sends a POST request to the `/api/v2/orders/CancelOrderedTransaction` endpoint of the OFFICE API.
1858
+ * * (102)
1859
+ *
1860
+ * @returns A promise that resolves to the API response.
1861
+ */
1862
+ async cancelWithdrawalOrder(payload) {
1863
+ // !TODO непонятны полномочия кассиров
1864
+ // * +(103)
1865
+ const url = this.url(`/orders/CancelOrderedTransaction`, api.V2);
1866
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1867
+ // console.log('deleteCoupon data:', data , status , statusText);
1868
+ return this.responseHandlerData(data, status, statusText);
1869
+ }
1870
+ /** Возвращает содержание ставки по betId и userId */
1871
+ async getBetContentAdm(payload) {
1872
+ payload.culture = this.locale;
1873
+ const url = this.url(`/account/GetBet`, api.V2);
1874
+ const { data, status, statusText } = await this.request(url).query(payload).exec();
1875
+ // console.log('deleteCoupon data:', data , status , statusText);
1876
+ return this.responseHandlerData(data, status, statusText);
1877
+ }
1878
+ }
1879
+ // @workspace /doc в комментарии приведи полный пример payload из I.IConfirmWithdrawalOrderPayload