bx-rest 0.26.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.en.md +52 -4
- package/README.md +71 -14
- package/esm2022/functions/lowerCaseOrder.mjs +23 -0
- package/esm2022/request-navvy/crm/company.mjs +8 -2
- package/esm2022/request-navvy/crm/contact.mjs +8 -2
- package/esm2022/request-navvy/crm/deal.mjs +8 -2
- package/esm2022/request-navvy/crm/lead.mjs +8 -2
- package/esm2022/services/http/HttpBX.mjs +63 -30
- package/esm2022/services/http/sessionKey.mjs +21 -2
- package/esm2022/settings.mjs +15 -3
- package/esm2022/typification/rest/batch/batchRequestParam.mjs +1 -1
- package/esm2022/typification/rest/crm/company/list.mjs +1 -1
- package/esm2022/typification/rest/crm/contact/list.mjs +1 -1
- package/esm2022/typification/rest/crm/deal/list.mjs +1 -1
- package/esm2022/typification/rest/crm/lead/list.mjs +1 -1
- package/esm2022/typification/rest/support/param.mjs +1 -1
- package/esm2022/typification/rest/task/access/getaccess.mjs +1 -1
- package/esm2022/typification/rest/task/commentitem/commentitem.mjs +1 -1
- package/esm2022/typification/rest/tasks/task.mjs +1 -1
- package/esm2022/typification/settings.mjs +1 -1
- package/fesm2022/bx-rest.mjs +143 -36
- package/fesm2022/bx-rest.mjs.map +1 -1
- package/functions/lowerCaseOrder.d.ts +15 -0
- package/map/tasks/task.d.ts +1 -3
- package/package.json +2 -1
- package/request-navvy/crm/company.d.ts +6 -1
- package/request-navvy/crm/contact.d.ts +6 -1
- package/request-navvy/crm/deal.d.ts +6 -1
- package/request-navvy/crm/lead.d.ts +6 -1
- package/services/http/HttpBX.d.ts +2 -1
- package/services/http/sessionKey.d.ts +7 -1
- package/settings.d.ts +7 -0
- package/typification/rest/batch/batchRequestParam.d.ts +3 -9
- package/typification/rest/crm/company/list.d.ts +2 -1
- package/typification/rest/crm/contact/list.d.ts +2 -1
- package/typification/rest/crm/deal/list.d.ts +2 -1
- package/typification/rest/crm/lead/list.d.ts +2 -1
- package/typification/rest/support/param.d.ts +0 -2
- package/typification/rest/task/access/getaccess.d.ts +1 -3
- package/typification/rest/task/commentitem/commentitem.d.ts +1 -3
- package/typification/rest/tasks/task.d.ts +5 -9
- package/typification/settings.d.ts +9 -0
package/fesm2022/bx-rest.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { switchMap, map, catchError, take, mergeMap as mergeMap$1 } from 'rxjs/operators';
|
|
2
|
-
import { Subscription, of, throwError, from, forkJoin, last, shareReplay, mergeMap, concatMap, toArray, map as map$1, tap } from 'rxjs';
|
|
2
|
+
import { Subscription, of, throwError, from, forkJoin, defer, last, shareReplay, mergeMap, concatMap, toArray, map as map$1, tap } from 'rxjs';
|
|
3
3
|
import clone from 'just-clone';
|
|
4
4
|
import axios from 'axios';
|
|
5
5
|
import flatten from 'just-flatten-it';
|
|
@@ -20,7 +20,7 @@ const DEFAULT_BX_REST_SETTINGS = {
|
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
const BXRestSettings = {
|
|
23
|
-
|
|
23
|
+
value: {
|
|
24
24
|
auth: {
|
|
25
25
|
source: 'cookies',
|
|
26
26
|
key: 'auth',
|
|
@@ -31,8 +31,20 @@ const BXRestSettings = {
|
|
|
31
31
|
additional_part: 'rest',
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
+
/**
|
|
35
|
+
* @deprecated Переименовано в `BXRestSettings.value` — имя `date` не
|
|
36
|
+
* отражало содержимое (настройки auth/urls, а не дату) и сбивало с толку
|
|
37
|
+
* в публичном API. Геттер/сеттер оставлен только для обратной совместимости
|
|
38
|
+
* с кодом, написанным против API до 1.0.
|
|
39
|
+
*/
|
|
40
|
+
get date() {
|
|
41
|
+
return this.value;
|
|
42
|
+
},
|
|
43
|
+
set date(newValue) {
|
|
44
|
+
this.value = newValue;
|
|
45
|
+
},
|
|
34
46
|
update(newSettings) {
|
|
35
|
-
this.
|
|
47
|
+
this.value = { ...this.value, ...newSettings };
|
|
36
48
|
},
|
|
37
49
|
};
|
|
38
50
|
|
|
@@ -514,12 +526,20 @@ class SessionKeyError extends Error {
|
|
|
514
526
|
}
|
|
515
527
|
}
|
|
516
528
|
class SessionKeyServices {
|
|
529
|
+
// Геттер, а не поле с одноразовым снимком: BXRestSettings.update() создаёт
|
|
530
|
+
// НОВЫЙ объект (this.value = {...this.value, ...}), а не мутирует старый —
|
|
531
|
+
// поэтому `= BXRestSettings.value` в виде обычного поля навсегда
|
|
532
|
+
// "заморозил" бы то, что было на момент создания SessionKeyServices.
|
|
533
|
+
// Геттер вместо этого читает актуальный BXRestSettings.value при каждом
|
|
534
|
+
// обращении.
|
|
535
|
+
get BX_REST_SETTINGS() {
|
|
536
|
+
return BXRestSettings.value;
|
|
537
|
+
}
|
|
517
538
|
constructor() {
|
|
518
539
|
this.authHave = false;
|
|
519
540
|
this.subscribe = {
|
|
520
541
|
authData: new Subscription()
|
|
521
542
|
};
|
|
522
|
-
this.BX_REST_SETTINGS = BXRestSettings.date;
|
|
523
543
|
const authData = this.getSessionItem(this.constructor.name);
|
|
524
544
|
if (this.getAuth().length > 0) {
|
|
525
545
|
this.authHave = true;
|
|
@@ -556,6 +576,17 @@ class SessionKeyServices {
|
|
|
556
576
|
return 'auth';
|
|
557
577
|
}
|
|
558
578
|
}
|
|
579
|
+
/**
|
|
580
|
+
* Стоит ли прикладывать браузерные cookie к запросу (axios `withCredentials`).
|
|
581
|
+
* Явный `BXRestSettings.withCredentials` имеет приоритет; если не задан —
|
|
582
|
+
* сохраняется историческое поведение: включаем только для `auth.key === 'OAuth2'`.
|
|
583
|
+
*/
|
|
584
|
+
getWithCredentials() {
|
|
585
|
+
if (typeof this.BX_REST_SETTINGS.withCredentials === 'boolean') {
|
|
586
|
+
return this.BX_REST_SETTINGS.withCredentials;
|
|
587
|
+
}
|
|
588
|
+
return this.getKeyAuth() === 'OAuth2';
|
|
589
|
+
}
|
|
559
590
|
getSessid() {
|
|
560
591
|
const check = this.getSearchParam('sessid');
|
|
561
592
|
if (check) {
|
|
@@ -894,7 +925,7 @@ function serializeBitrixParams(params) {
|
|
|
894
925
|
|
|
895
926
|
class HttpBXServices extends HttpServices {
|
|
896
927
|
/**
|
|
897
|
-
*
|
|
928
|
+
* Не считайте этот метод образцом/финальным API.
|
|
898
929
|
* TODO: Удалить данный метод после реализации его в разделе Navvy
|
|
899
930
|
* @param param
|
|
900
931
|
*/
|
|
@@ -954,37 +985,70 @@ class HttpBXServices extends HttpServices {
|
|
|
954
985
|
return this.httpGet(this.getNameMethod(name), params);
|
|
955
986
|
}
|
|
956
987
|
httpPost(url, params = {}) {
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
988
|
+
// defer() откладывает всё содержимое (в том числе чтение BXRestSettings
|
|
989
|
+
// через this.session.*) до реальной подписки — иначе даже с "живым"
|
|
990
|
+
// геттером в SessionKeyServices настройки читались бы в момент вызова
|
|
991
|
+
// .res(), а не в момент subscribe()/firstValueFrom(), что и обещано
|
|
992
|
+
// в README как поведение "ленивого" REST-вызова.
|
|
993
|
+
return defer(() => {
|
|
994
|
+
const paramsClone = clone(params);
|
|
995
|
+
const key = this.session.getKeyAuth();
|
|
996
|
+
const auth = this.session.getAuthParams();
|
|
997
|
+
const checkIsOn = this.session.getCheckAuthParamsIsOn();
|
|
998
|
+
if (checkIsOn) {
|
|
999
|
+
if (!auth) {
|
|
1000
|
+
return throwError(() => this.session.getAuthError('post'));
|
|
1001
|
+
}
|
|
1002
|
+
if (key !== 'OAuth2') {
|
|
1003
|
+
paramsClone[key] = auth;
|
|
1004
|
+
}
|
|
972
1005
|
}
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
1006
|
+
return this.session.getBaseUrl().pipe(switchMap((baseUrl) => {
|
|
1007
|
+
if (!baseUrl) {
|
|
1008
|
+
return throwError(() => this.session.getBaseUrlError('post'));
|
|
1009
|
+
}
|
|
1010
|
+
const fullUrl = prepareBaseAddress(baseUrl) + url;
|
|
1011
|
+
if (key === 'sessid') {
|
|
1012
|
+
// Преобразуем параметры в формат x-www-form-urlencoded
|
|
1013
|
+
const bodyString = this.serializeBitrixParams(paramsClone);
|
|
1014
|
+
return from(this.axiosInstance.post(fullUrl, bodyString, {
|
|
1015
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
1016
|
+
}).then((response) => response.data));
|
|
1017
|
+
}
|
|
1018
|
+
return from(this.axiosInstance.post(fullUrl, paramsClone, {
|
|
1019
|
+
withCredentials: this.session.getWithCredentials(),
|
|
1020
|
+
headers: {
|
|
1021
|
+
'Content-Type': 'application/json',
|
|
1022
|
+
}
|
|
979
1023
|
}).then((response) => response.data));
|
|
1024
|
+
}));
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
httpGet(url, params = {}) {
|
|
1028
|
+
// Та же причина, что и у httpPost выше: откладываем чтение BXRestSettings
|
|
1029
|
+
// до подписки, чтобы `get()` вёл себя так же "лениво", как и `post()`
|
|
1030
|
+
// (симметрия, которой не было до этого — GET резолвил настройки в момент
|
|
1031
|
+
// вызова, а не в момент subscribe()).
|
|
1032
|
+
return defer(() => {
|
|
1033
|
+
const paramsClone = clone(params);
|
|
1034
|
+
const auth = this.session.getAuthParams();
|
|
1035
|
+
const checkIsOn = this.session.getCheckAuthParamsIsOn();
|
|
1036
|
+
if (checkIsOn) {
|
|
1037
|
+
if (!auth) {
|
|
1038
|
+
return throwError(() => this.session.getAuthError('get'));
|
|
1039
|
+
}
|
|
1040
|
+
paramsClone[this.session.getKeyAuth()] = auth;
|
|
980
1041
|
}
|
|
981
|
-
return
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
'Content-Type': 'application/json',
|
|
1042
|
+
return this.session.getBaseUrl().pipe(switchMap((baseUrl) => {
|
|
1043
|
+
if (!baseUrl) {
|
|
1044
|
+
return throwError(() => this.session.getBaseUrlError('get'));
|
|
985
1045
|
}
|
|
986
|
-
|
|
987
|
-
|
|
1046
|
+
const fullUrl = prepareBaseAddress(baseUrl) + url;
|
|
1047
|
+
const queryString = new URLSearchParams(paramsClone).toString();
|
|
1048
|
+
const finalUrl = `${fullUrl}?${queryString}`;
|
|
1049
|
+
return from(this.axiosInstance.get(finalUrl).then((response) => response.data));
|
|
1050
|
+
}));
|
|
1051
|
+
});
|
|
988
1052
|
}
|
|
989
1053
|
serializeBitrixParams(params) {
|
|
990
1054
|
return serializeBitrixParams(params);
|
|
@@ -9139,6 +9203,29 @@ class BXRestNavvyPull {
|
|
|
9139
9203
|
}
|
|
9140
9204
|
}
|
|
9141
9205
|
|
|
9206
|
+
/**
|
|
9207
|
+
* crm.deal.list, crm.lead.list, crm.contact.list и crm.company.list — в
|
|
9208
|
+
* отличие от остального REST API Bitrix24 — принимают значения `order` в
|
|
9209
|
+
* нижнем регистре (`'asc'`/`'desc'`), а не в верхнем (`'ASC'`/`'DESC'`, как
|
|
9210
|
+
* везде остальном, см. {@link iBXRestParamSort}). Публичный тип этих
|
|
9211
|
+
* четырёх методов унифицирован на `iBXRestParamSort` ради единообразия
|
|
9212
|
+
* во всей библиотеке — эта функция перед отправкой запроса приводит
|
|
9213
|
+
* значения обратно к регистру, которого реально ожидает конкретно этот
|
|
9214
|
+
* метод, так что на бэкенд уходит то же самое, что уходило бы и без
|
|
9215
|
+
* унификации типов.
|
|
9216
|
+
*
|
|
9217
|
+
* @hidden
|
|
9218
|
+
*/
|
|
9219
|
+
function lowerCaseOrder(order) {
|
|
9220
|
+
if (!order)
|
|
9221
|
+
return undefined;
|
|
9222
|
+
const result = {};
|
|
9223
|
+
for (const field of Object.keys(order)) {
|
|
9224
|
+
result[field] = order[field].toLowerCase();
|
|
9225
|
+
}
|
|
9226
|
+
return result;
|
|
9227
|
+
}
|
|
9228
|
+
|
|
9142
9229
|
class BXRestMapCrmLead {
|
|
9143
9230
|
/**
|
|
9144
9231
|
* Преобразует массив лидов из HTTP формата в локальный
|
|
@@ -9743,7 +9830,12 @@ class BXRestNavvyCrmLead {
|
|
|
9743
9830
|
* @param param
|
|
9744
9831
|
*/
|
|
9745
9832
|
list(param) {
|
|
9746
|
-
return this.Navvy.pagNav(this.url.list,
|
|
9833
|
+
return this.Navvy.pagNav(this.url.list,
|
|
9834
|
+
// crm.lead.list ждёт order в нижнем регистре ('asc'/'desc'), в отличие
|
|
9835
|
+
// от остального REST API — публичный тип унифицирован на iBXRestParamSort
|
|
9836
|
+
// ('ASC'/'DESC'), а тут приводим обратно к тому, что реально нужно
|
|
9837
|
+
// отправить на бэкенд. См. lowerCaseOrder.
|
|
9838
|
+
{ ...param, order: lowerCaseOrder(param.order) }, BXRestMapCrmLead.list);
|
|
9747
9839
|
}
|
|
9748
9840
|
/**
|
|
9749
9841
|
* Обновляет существующий лид
|
|
@@ -10015,7 +10107,12 @@ class BXRestNavvyCrmDeal {
|
|
|
10015
10107
|
* @param param
|
|
10016
10108
|
*/
|
|
10017
10109
|
list(param) {
|
|
10018
|
-
return this.Navvy.pagNav(this.url.list,
|
|
10110
|
+
return this.Navvy.pagNav(this.url.list,
|
|
10111
|
+
// crm.deal.list ждёт order в нижнем регистре ('asc'/'desc'), в отличие
|
|
10112
|
+
// от остального REST API — публичный тип унифицирован на iBXRestParamSort
|
|
10113
|
+
// ('ASC'/'DESC'), а тут приводим обратно к тому, что реально нужно
|
|
10114
|
+
// отправить на бэкенд. См. lowerCaseOrder.
|
|
10115
|
+
{ ...param, order: lowerCaseOrder(param.order) }, BXRestMapCrmDeal.list);
|
|
10019
10116
|
}
|
|
10020
10117
|
/**
|
|
10021
10118
|
* Обновляет существующую сделку
|
|
@@ -10227,7 +10324,12 @@ class BXRestNavvyCrmContact {
|
|
|
10227
10324
|
* @param param
|
|
10228
10325
|
*/
|
|
10229
10326
|
list(param) {
|
|
10230
|
-
return this.Navvy.pagNav(this.url.list,
|
|
10327
|
+
return this.Navvy.pagNav(this.url.list,
|
|
10328
|
+
// crm.contact.list ждёт order в нижнем регистре ('asc'/'desc'), в отличие
|
|
10329
|
+
// от остального REST API — публичный тип унифицирован на iBXRestParamSort
|
|
10330
|
+
// ('ASC'/'DESC'), а тут приводим обратно к тому, что реально нужно
|
|
10331
|
+
// отправить на бэкенд. См. lowerCaseOrder.
|
|
10332
|
+
{ ...param, order: lowerCaseOrder(param.order) }, BXRestMapCrmContact.list);
|
|
10231
10333
|
}
|
|
10232
10334
|
/**
|
|
10233
10335
|
* Обновляет существующий контакт
|
|
@@ -10439,7 +10541,12 @@ class BXRestNavvyCrmCompany {
|
|
|
10439
10541
|
* @param param
|
|
10440
10542
|
*/
|
|
10441
10543
|
list(param) {
|
|
10442
|
-
return this.Navvy.pagNav(this.url.list,
|
|
10544
|
+
return this.Navvy.pagNav(this.url.list,
|
|
10545
|
+
// crm.company.list ждёт order в нижнем регистре ('asc'/'desc'), в отличие
|
|
10546
|
+
// от остального REST API — публичный тип унифицирован на iBXRestParamSort
|
|
10547
|
+
// ('ASC'/'DESC'), а тут приводим обратно к тому, что реально нужно
|
|
10548
|
+
// отправить на бэкенд. См. lowerCaseOrder.
|
|
10549
|
+
{ ...param, order: lowerCaseOrder(param.order) }, BXRestMapCrmCompany.list);
|
|
10443
10550
|
}
|
|
10444
10551
|
/**
|
|
10445
10552
|
* Обновляет существующую компанию
|