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.
Files changed (43) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.en.md +52 -4
  3. package/README.md +71 -14
  4. package/esm2022/functions/lowerCaseOrder.mjs +23 -0
  5. package/esm2022/request-navvy/crm/company.mjs +8 -2
  6. package/esm2022/request-navvy/crm/contact.mjs +8 -2
  7. package/esm2022/request-navvy/crm/deal.mjs +8 -2
  8. package/esm2022/request-navvy/crm/lead.mjs +8 -2
  9. package/esm2022/services/http/HttpBX.mjs +63 -30
  10. package/esm2022/services/http/sessionKey.mjs +21 -2
  11. package/esm2022/settings.mjs +15 -3
  12. package/esm2022/typification/rest/batch/batchRequestParam.mjs +1 -1
  13. package/esm2022/typification/rest/crm/company/list.mjs +1 -1
  14. package/esm2022/typification/rest/crm/contact/list.mjs +1 -1
  15. package/esm2022/typification/rest/crm/deal/list.mjs +1 -1
  16. package/esm2022/typification/rest/crm/lead/list.mjs +1 -1
  17. package/esm2022/typification/rest/support/param.mjs +1 -1
  18. package/esm2022/typification/rest/task/access/getaccess.mjs +1 -1
  19. package/esm2022/typification/rest/task/commentitem/commentitem.mjs +1 -1
  20. package/esm2022/typification/rest/tasks/task.mjs +1 -1
  21. package/esm2022/typification/settings.mjs +1 -1
  22. package/fesm2022/bx-rest.mjs +143 -36
  23. package/fesm2022/bx-rest.mjs.map +1 -1
  24. package/functions/lowerCaseOrder.d.ts +15 -0
  25. package/map/tasks/task.d.ts +1 -3
  26. package/package.json +2 -1
  27. package/request-navvy/crm/company.d.ts +6 -1
  28. package/request-navvy/crm/contact.d.ts +6 -1
  29. package/request-navvy/crm/deal.d.ts +6 -1
  30. package/request-navvy/crm/lead.d.ts +6 -1
  31. package/services/http/HttpBX.d.ts +2 -1
  32. package/services/http/sessionKey.d.ts +7 -1
  33. package/settings.d.ts +7 -0
  34. package/typification/rest/batch/batchRequestParam.d.ts +3 -9
  35. package/typification/rest/crm/company/list.d.ts +2 -1
  36. package/typification/rest/crm/contact/list.d.ts +2 -1
  37. package/typification/rest/crm/deal/list.d.ts +2 -1
  38. package/typification/rest/crm/lead/list.d.ts +2 -1
  39. package/typification/rest/support/param.d.ts +0 -2
  40. package/typification/rest/task/access/getaccess.d.ts +1 -3
  41. package/typification/rest/task/commentitem/commentitem.d.ts +1 -3
  42. package/typification/rest/tasks/task.d.ts +5 -9
  43. package/typification/settings.d.ts +9 -0
@@ -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
- date: {
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.date = { ...this.date, ...newSettings };
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
- const paramsClone = clone(params);
958
- const key = this.session.getKeyAuth();
959
- const auth = this.session.getAuthParams();
960
- const checkIsOn = this.session.getCheckAuthParamsIsOn();
961
- if (checkIsOn) {
962
- if (!auth) {
963
- return throwError(() => this.session.getAuthError('post'));
964
- }
965
- if (key !== 'OAuth2') {
966
- paramsClone[key] = auth;
967
- }
968
- }
969
- return this.session.getBaseUrl().pipe(switchMap((baseUrl) => {
970
- if (!baseUrl) {
971
- return throwError(() => this.session.getBaseUrlError('post'));
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
- const fullUrl = prepareBaseAddress(baseUrl) + url;
974
- if (key === 'sessid') {
975
- // Преобразуем параметры в формат x-www-form-urlencoded
976
- const bodyString = this.serializeBitrixParams(paramsClone);
977
- return from(this.axiosInstance.post(fullUrl, bodyString, {
978
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
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 from(this.axiosInstance.post(fullUrl, paramsClone, {
982
- withCredentials: key === 'OAuth2',
983
- headers: {
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
- }).then((response) => response.data));
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, param, BXRestMapCrmLead.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, param, BXRestMapCrmDeal.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, param, BXRestMapCrmContact.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, param, BXRestMapCrmCompany.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
  * Обновляет существующую компанию