@webitel/api-services 0.0.23 → 0.0.25

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 (205) hide show
  1. package/package.json +14 -10
  2. package/src/api/axios/generateInstance.ts +30 -0
  3. package/src/api/axios/index.ts +2 -0
  4. package/src/api/clients/_shared/generatePermissionsApi.ts +97 -0
  5. package/src/api/clients/agents/agentChats.ts +74 -0
  6. package/src/api/clients/agents/agents.ts +265 -0
  7. package/src/api/clients/buckets/buckets.ts +112 -0
  8. package/src/api/clients/calendars/calendars.ts +214 -0
  9. package/src/api/clients/caseCloseReasonGroups/caseCloseReasonGroups.ts +128 -0
  10. package/src/api/clients/caseCloseReasons/caseCloseReasons.ts +128 -0
  11. package/src/api/clients/casePriorities/casePriorities.ts +139 -0
  12. package/src/api/clients/caseServiceCatalogs/serviceCatalogs.ts +198 -0
  13. package/src/api/clients/caseServices/services.ts +181 -0
  14. package/src/api/clients/caseSources/caseSources.ts +121 -0
  15. package/src/api/clients/caseStatusConditions/caseStatusConditions.ts +165 -0
  16. package/src/api/clients/caseStatuses/caseStatuses.ts +119 -0
  17. package/src/api/clients/catalog/catalog.ts +44 -0
  18. package/src/api/clients/chatGateways/chatGateways.ts +302 -0
  19. package/src/api/clients/chatGateways/defaults/defaultChatGateway.ts +18 -0
  20. package/src/api/clients/chatGateways/defaults/webChatGateway.ts +72 -0
  21. package/src/api/clients/chatGateways/enums/WebchatAlternativeChannel.enum.ts +14 -0
  22. package/src/api/clients/chatGateways/scripts/generateUri.ts +9 -0
  23. package/src/api/clients/communications/communications.ts +141 -0
  24. package/src/api/clients/configurations/configurations.ts +144 -0
  25. package/src/api/clients/contactGroups/contactGroups.ts +187 -0
  26. package/src/api/clients/flows/flow.ts +225 -0
  27. package/src/api/clients/gateways/defaults/defaultGateway.ts +9 -0
  28. package/src/api/clients/gateways/defaults/registerGateway.ts +12 -0
  29. package/src/api/clients/gateways/defaults/trunkingGateway.ts +16 -0
  30. package/src/api/clients/gateways/gateways.ts +175 -0
  31. package/src/api/clients/index.ts +68 -0
  32. package/src/api/clients/labels/labels.ts +56 -0
  33. package/src/api/clients/lists/blacklists.ts +118 -0
  34. package/src/api/clients/media/media.ts +120 -0
  35. package/src/api/clients/object/object.ts +114 -0
  36. package/src/api/clients/queues/defaults/processing.ts +14 -0
  37. package/src/api/clients/queues/queues.ts +238 -0
  38. package/src/api/clients/quickReplies/quickReplies.ts +117 -0
  39. package/src/api/clients/roles/roles.ts +202 -0
  40. package/src/api/clients/skills/skills.ts +112 -0
  41. package/src/api/clients/slaConditions/slaConditions.ts +165 -0
  42. package/src/api/clients/slas/slas.ts +118 -0
  43. package/src/api/clients/teams/teams.ts +144 -0
  44. package/src/api/clients/users/__tests__/users.spec.ts +265 -0
  45. package/src/api/clients/users/users.ts +230 -0
  46. package/src/api/clients/wtTypes/_shared/utils/sortDynamicFields.ts +21 -0
  47. package/src/api/clients/wtTypes/sysTypes/sysTypes.ts +64 -0
  48. package/src/api/clients/wtTypes/typeExtensions/typeExtensions.ts +122 -0
  49. package/src/api/clients//321/201ontacts/contactChatMessagesHistory.ts +98 -0
  50. package/src/api/clients//321/201ontacts/contacts.ts +339 -0
  51. package/src/api/clients//321/201ontacts/enums/ContactsSearchMode.ts +9 -0
  52. package/src/api/clients//321/201ontacts/index.ts +5 -0
  53. package/src/api/defaults/getDefaultGetListResponse/getDefaultGetListResponse.ts +6 -0
  54. package/src/api/defaults/getDefaultGetParams/getDefaultGetParams.ts +6 -0
  55. package/src/api/defaults/getDefaultInstance/getDefaultInstance.ts +21 -0
  56. package/src/api/defaults/getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.ts +10 -0
  57. package/src/api/defaults/index.ts +11 -0
  58. package/src/api/index.ts +6 -0
  59. package/src/api/interceptors/index.ts +3 -0
  60. package/src/api/interceptors/request/index.ts +2 -0
  61. package/src/api/interceptors/request/updateToken.interceptor.ts +10 -0
  62. package/src/api/interceptors/response/handleUnauthorized.interceptor.ts +12 -0
  63. package/src/api/interceptors/response/index.ts +2 -0
  64. package/src/api/transformers/addQueryParamsToUrl/addQueryParamsToUrl.transformer.ts +19 -0
  65. package/src/api/transformers/applyTransform.ts +17 -0
  66. package/src/api/transformers/camelToSnake/camelToSnake.transformer.ts +5 -0
  67. package/src/api/transformers/generateUrl/generateUrl.transformer.ts +13 -0
  68. package/src/api/transformers/index.ts +28 -0
  69. package/src/api/transformers/log/log.transformer.ts +6 -0
  70. package/src/api/transformers/merge/merge.transformer.ts +8 -0
  71. package/src/api/transformers/mergeEach/mergeEach.transformer.ts +8 -0
  72. package/src/api/transformers/notify/notify.transformer.ts +39 -0
  73. package/src/api/transformers/sanitize/sanitize.transformer.ts +12 -0
  74. package/src/api/transformers/skipIf/skipIf.ts +11 -0
  75. package/src/api/transformers/snakeToCamel/snakeToCamel.transformer.ts +5 -0
  76. package/src/api/transformers/starToSearch/starToSearch.transformer.ts +15 -0
  77. package/src/gen/_docs/html/assets/navigation.js +1 -1
  78. package/src/gen/_docs/html/assets/search.js +1 -1
  79. package/src/gen/_docs/html/interfaces/_models_webitelCasesInputSource.WebitelCasesInputSource.html +0 -1
  80. package/src/gen/_docs/html/interfaces/_models_webitelCasesSource.WebitelCasesSource.html +5 -6
  81. package/src/gen/_docs/html/modules/index.html +1 -1
  82. package/src/gen/_docs/html/modules/sources_sources.zod.gen.html +7 -7
  83. package/src/gen/_docs/html/types/_models_createCaseParams.CreateCaseParams.html +9 -3
  84. package/src/gen/_docs/html/types/_models_updateCase2Params.UpdateCase2Params.html +8 -3
  85. package/src/gen/_docs/html/types/_models_updateCaseParams.UpdateCaseParams.html +8 -3
  86. package/src/gen/_docs/html/variables/cases_cases.zod.gen.createCaseQueryParams.html +1 -1
  87. package/src/gen/_docs/html/variables/cases_cases.zod.gen.updateCase2QueryParams.html +1 -1
  88. package/src/gen/_docs/html/variables/cases_cases.zod.gen.updateCaseQueryParams.html +1 -1
  89. package/src/gen/_models/createCaseParams.ts +8 -0
  90. package/src/gen/_models/updateCase2Params.ts +8 -0
  91. package/src/gen/_models/updateCaseParams.ts +8 -0
  92. package/src/gen/_models/webitelCasesInputSource.ts +0 -1
  93. package/src/gen/_models/webitelCasesSource.ts +5 -6
  94. package/src/gen/cases/cases.zod.gen.ts +18 -0
  95. package/src/gen/sources/sources.msw.api.gen.ts +6 -6
  96. package/src/gen/sources/sources.zod.gen.ts +0 -27
  97. package/types/api/axios/generateInstance.d.ts +2 -0
  98. package/types/api/axios/index.d.ts +1 -0
  99. package/types/api/clients/_shared/generatePermissionsApi.d.ts +13 -0
  100. package/types/api/clients/agents/agentChats.d.ts +8 -0
  101. package/types/api/clients/agents/agents.d.ts +44 -0
  102. package/types/api/clients/buckets/buckets.d.ts +24 -0
  103. package/types/api/clients/calendars/calendars.d.ts +28 -0
  104. package/types/api/clients/caseCloseReasonGroups/caseCloseReasonGroups.d.ts +24 -0
  105. package/types/api/clients/caseCloseReasons/caseCloseReasons.d.ts +30 -0
  106. package/types/api/clients/casePriorities/casePriorities.d.ts +24 -0
  107. package/types/api/clients/caseServiceCatalogs/serviceCatalogs.d.ts +24 -0
  108. package/types/api/clients/caseServices/services.d.ts +35 -0
  109. package/types/api/clients/caseSources/caseSources.d.ts +24 -0
  110. package/types/api/clients/caseStatusConditions/caseStatusConditions.d.ts +36 -0
  111. package/types/api/clients/caseStatuses/caseStatuses.d.ts +24 -0
  112. package/types/api/clients/catalog/catalog.d.ts +9 -0
  113. package/types/api/clients/chatGateways/chatGateways.d.ts +28 -0
  114. package/types/api/clients/chatGateways/defaults/defaultChatGateway.d.ts +15 -0
  115. package/types/api/clients/chatGateways/defaults/webChatGateway.d.ts +64 -0
  116. package/types/api/clients/chatGateways/enums/WebchatAlternativeChannel.enum.d.ts +8 -0
  117. package/types/api/clients/chatGateways/scripts/generateUri.d.ts +2 -0
  118. package/types/api/clients/communications/communications.d.ts +28 -0
  119. package/types/api/clients/configurations/configurations.d.ts +28 -0
  120. package/types/api/clients/contactGroups/contactGroups.d.ts +47 -0
  121. package/types/api/clients/flows/flow.d.ts +28 -0
  122. package/types/api/clients/gateways/defaults/defaultGateway.d.ts +8 -0
  123. package/types/api/clients/gateways/defaults/registerGateway.d.ts +13 -0
  124. package/types/api/clients/gateways/defaults/trunkingGateway.d.ts +11 -0
  125. package/types/api/clients/gateways/gateways.d.ts +28 -0
  126. package/types/api/clients/index.d.ts +33 -0
  127. package/types/api/clients/labels/labels.d.ts +11 -0
  128. package/types/api/clients/lists/blacklists.d.ts +24 -0
  129. package/types/api/clients/media/media.d.ts +19 -0
  130. package/types/api/clients/object/object.d.ts +11 -0
  131. package/types/api/clients/queues/defaults/processing.d.ts +7 -0
  132. package/types/api/clients/queues/queues.d.ts +32 -0
  133. package/types/api/clients/quickReplies/quickReplies.d.ts +24 -0
  134. package/types/api/clients/roles/roles.d.ts +32 -0
  135. package/types/api/clients/skills/skills.d.ts +24 -0
  136. package/types/api/clients/slaConditions/slaConditions.d.ts +30 -0
  137. package/types/api/clients/slas/slas.d.ts +24 -0
  138. package/types/api/clients/teams/teams.d.ts +24 -0
  139. package/types/api/clients/users/users.d.ts +46 -0
  140. package/types/api/clients/wtTypes/_shared/utils/sortDynamicFields.d.ts +2 -0
  141. package/types/api/clients/wtTypes/sysTypes/sysTypes.d.ts +30 -0
  142. package/types/api/clients/wtTypes/typeExtensions/typeExtensions.d.ts +32 -0
  143. package/types/api/clients//321/201ontacts/contactChatMessagesHistory.d.ts +14 -0
  144. package/types/api/clients//321/201ontacts/contacts.d.ts +23 -0
  145. package/types/api/clients//321/201ontacts/enums/ContactsSearchMode.d.ts +8 -0
  146. package/types/api/clients//321/201ontacts/index.d.ts +4 -0
  147. package/types/api/defaults/getDefaultGetListResponse/getDefaultGetListResponse.d.ts +5 -0
  148. package/types/api/defaults/getDefaultGetParams/getDefaultGetParams.d.ts +8 -0
  149. package/types/api/defaults/getDefaultInstance/getDefaultInstance.d.ts +3 -0
  150. package/types/api/defaults/getDefaultOpenAPIConfig/getDefaultOpenAPIConfig.d.ts +3 -0
  151. package/types/api/defaults/index.d.ts +5 -0
  152. package/types/api/index.d.ts +5 -0
  153. package/types/api/interceptors/index.d.ts +2 -0
  154. package/types/api/interceptors/request/index.d.ts +1 -0
  155. package/types/api/interceptors/request/updateToken.interceptor.d.ts +2 -0
  156. package/types/api/interceptors/response/handleUnauthorized.interceptor.d.ts +2 -0
  157. package/types/api/interceptors/response/index.d.ts +1 -0
  158. package/types/api/transformers/addQueryParamsToUrl/addQueryParamsToUrl.transformer.d.ts +2 -0
  159. package/types/api/transformers/applyTransform.d.ts +5 -0
  160. package/types/api/transformers/camelToSnake/camelToSnake.transformer.d.ts +2 -0
  161. package/types/api/transformers/generateUrl/generateUrl.transformer.d.ts +2 -0
  162. package/types/api/transformers/index.d.ts +14 -0
  163. package/types/api/transformers/log/log.transformer.d.ts +2 -0
  164. package/types/api/transformers/merge/merge.transformer.d.ts +2 -0
  165. package/types/api/transformers/mergeEach/mergeEach.transformer.d.ts +2 -0
  166. package/types/api/transformers/notify/notify.transformer.d.ts +2 -0
  167. package/types/api/transformers/sanitize/sanitize.transformer.d.ts +2 -0
  168. package/types/api/transformers/skipIf/skipIf.d.ts +1 -0
  169. package/types/api/transformers/snakeToCamel/snakeToCamel.transformer.d.ts +2 -0
  170. package/types/api/transformers/starToSearch/starToSearch.transformer.d.ts +2 -0
  171. package/types/gen/_models/configServicePatchConfigBody.d.ts +15 -0
  172. package/types/gen/_models/configServiceUpdateConfigBody.d.ts +14 -0
  173. package/types/gen/_models/engineTriggerObjectType.d.ts +0 -1
  174. package/types/gen/_models/fileServiceSearchFilesChannelItem.d.ts +0 -2
  175. package/types/gen/_models/googlerpcStatus.d.ts +4 -4
  176. package/types/gen/_models/groupsAddContactsToGroupParams.d.ts +12 -0
  177. package/types/gen/_models/loggerDeleteConfigBulkRequest.d.ts +9 -0
  178. package/types/gen/_models/loggerDeleteConfigLogsRequest.d.ts +10 -0
  179. package/types/gen/_models/loggerDeleteConfigLogsResponse.d.ts +9 -0
  180. package/types/gen/_models/readSystemObjectsParams.d.ts +9 -0
  181. package/types/gen/_models/searchConfigObjectItem.d.ts +25 -0
  182. package/types/gen/_models/searchConfigParams.d.ts +18 -0
  183. package/types/gen/_models/searchLogByConfigIdActionItem.d.ts +14 -0
  184. package/types/gen/_models/searchLogByConfigIdParams.d.ts +19 -0
  185. package/types/gen/_models/searchLogByRecordIdActionItem.d.ts +14 -0
  186. package/types/gen/_models/searchLogByRecordIdParams.d.ts +22 -0
  187. package/types/gen/_models/searchLogByUserIdActionItem.d.ts +14 -0
  188. package/types/gen/_models/searchLogByUserIdParams.d.ts +25 -0
  189. package/types/gen/_models/storageUploadFileChannel.d.ts +0 -2
  190. package/types/gen/_models/webitelcasesStatus.d.ts +2 -2
  191. package/types/gen/file-policies-service/file-policies-service.zod.gen.d.ts +0 -18
  192. package/types/gen/file-service/file-service.api.gen.d.ts +1 -3
  193. package/types/gen/file-service/file-service.msw.api.gen.d.ts +1 -3
  194. package/types/gen/file-service/file-service.zod.gen.d.ts +0 -18
  195. package/types/gen/trigger-service/trigger-service.zod.gen.d.ts +0 -9
  196. package/src/defaults/index.ts +0 -2
  197. package/src/gen/_docs/html/variables/sources_sources.zod.gen.createSourceBodyNameRegExp.html +0 -1
  198. package/src/gen/_docs/html/variables/sources_sources.zod.gen.createSourceResponseNameRegExp.html +0 -1
  199. package/src/gen/_docs/html/variables/sources_sources.zod.gen.deleteSourceResponseNameRegExp.html +0 -1
  200. package/src/gen/_docs/html/variables/sources_sources.zod.gen.listSourcesResponseItemsItemNameRegExp.html +0 -1
  201. package/src/gen/_docs/html/variables/sources_sources.zod.gen.locateSourceResponseSourceNameRegExp.html +0 -1
  202. package/src/gen/_docs/html/variables/sources_sources.zod.gen.updateSource2BodyNameRegExp.html +0 -1
  203. package/src/gen/_docs/html/variables/sources_sources.zod.gen.updateSource2ResponseNameRegExp.html +0 -1
  204. package/src/gen/_docs/html/variables/sources_sources.zod.gen.updateSourceBodyNameRegExp.html +0 -1
  205. package/src/gen/_docs/html/variables/sources_sources.zod.gen.updateSourceResponseNameRegExp.html +0 -1
@@ -0,0 +1,339 @@
1
+ import deepCopy from 'deep-copy';
2
+ import { ContactsApiFactory } from 'webitel-sdk';
3
+
4
+ import {
5
+ getDefaultGetListResponse,
6
+ getDefaultGetParams,
7
+ getDefaultInstance,
8
+ getDefaultOpenAPIConfig,
9
+ } from '../../defaults/index';
10
+ import applyTransform, {
11
+ camelToSnake,
12
+ merge,
13
+ notify,
14
+ sanitize,
15
+ snakeToCamel,
16
+ } from '../../transformers/index';
17
+ import ContactsSearchMode from './enums/ContactsSearchMode';
18
+
19
+ const instance = getDefaultInstance();
20
+ const configuration = getDefaultOpenAPIConfig();
21
+
22
+ const contactService = new ContactsApiFactory(configuration, '', instance);
23
+
24
+ const formatAccessMode = (item) => ({
25
+ ...item,
26
+ access: {
27
+ edit: item.mode.includes('w'),
28
+ delete: item.mode.includes('d'),
29
+ },
30
+ });
31
+
32
+ const getList = async (params) => {
33
+ const fieldsToSend = [
34
+ 'page',
35
+ 'size',
36
+ 'q',
37
+ 'sort',
38
+ 'fields',
39
+ 'id',
40
+ 'qin',
41
+ 'notIdGroup',
42
+ 'group',
43
+ 'owner',
44
+ 'label',
45
+ 'user',
46
+ ];
47
+
48
+ if (!params.fields) {
49
+ params.fields = [
50
+ 'id',
51
+ 'etag',
52
+ 'name',
53
+ 'managers',
54
+ 'labels',
55
+ 'about',
56
+ 'variables',
57
+ 'timezones',
58
+ 'phones',
59
+ 'emails',
60
+ 'imclients',
61
+ ];
62
+ }
63
+
64
+ const listResponseHandler = (items) =>
65
+ items?.map((item) => ({
66
+ ...item,
67
+ name: item.name.commonName,
68
+ managers: item.managers ? [...item.managers.data] : [],
69
+ labels: item.labels ? [...item.labels.data] : [],
70
+ groups: getGroupsFromResponse(item),
71
+ variables: item.variables ? [...item.variables.data] : [],
72
+ timezones: item.timezones ? [...item.timezones.data] : [],
73
+ phones: item.phones ? [...item.phones.data] : [],
74
+ emails: item.emails ? [...item.emails.data] : [],
75
+ }));
76
+
77
+ let changedParams;
78
+
79
+ if (params?.search) {
80
+ changedParams = { ...params, q: params.search };
81
+ } else if (params?.q && params?.qin) {
82
+ changedParams = { ...params };
83
+ } else {
84
+ let searchValue = '';
85
+ let searchKey = '';
86
+
87
+ if (params[ContactsSearchMode.NAME]) {
88
+ searchValue = params[ContactsSearchMode.NAME];
89
+ searchKey = ContactsSearchMode.NAME;
90
+ } else if (params[ContactsSearchMode.LABELS]) {
91
+ searchValue = params[ContactsSearchMode.LABELS];
92
+ searchKey = ContactsSearchMode.LABELS;
93
+ } else if (params[ContactsSearchMode.ABOUT]) {
94
+ searchValue = params[ContactsSearchMode.ABOUT];
95
+ searchKey = ContactsSearchMode.ABOUT;
96
+ } else if (params[ContactsSearchMode.VARIABLES]) {
97
+ searchValue = params[ContactsSearchMode.VARIABLES];
98
+ searchKey = ContactsSearchMode.VARIABLES;
99
+ } else if (params[ContactsSearchMode.DESTINATION]) {
100
+ searchValue = params[ContactsSearchMode.DESTINATION];
101
+ searchKey = 'emails,phones,imclients{user{name}}';
102
+ }
103
+
104
+ // This code needed for adding starToSearch method to applyTransform while searchKey !== SearchMode.VARIABLES because '*' in variables search mode brokes backend logic.
105
+ // if (searchKey !== ContactsSearchMode.VARIABLES) {
106
+ // transformations.push(starToSearch('q')); WTEL-4265
107
+ // }
108
+
109
+ changedParams = {
110
+ ...params,
111
+ q: searchValue || '',
112
+ qin: searchKey || '',
113
+ };
114
+
115
+ if (params.hasUser != null) {
116
+ changedParams.user = params.hasUser;
117
+ }
118
+
119
+ if (params.contactGroup) {
120
+ changedParams.group = [...params.contactGroup.list];
121
+ }
122
+ if (params.contactLabel) {
123
+ changedParams.label = params.contactLabel.map((item) => item.label);
124
+ }
125
+ if (params.contactOwner) {
126
+ changedParams.owner = params.contactOwner;
127
+ }
128
+ }
129
+
130
+ if (params.parentId) {
131
+ changedParams.group = [params.parentId];
132
+ }
133
+
134
+ const transformations = [
135
+ sanitize(fieldsToSend),
136
+ merge(getDefaultGetParams()),
137
+ camelToSnake(),
138
+ ];
139
+
140
+ const {
141
+ page,
142
+ size,
143
+ q,
144
+ sort,
145
+ fields,
146
+ id,
147
+ qin,
148
+ mode,
149
+ group_id,
150
+ group,
151
+ not_id_group,
152
+ owner,
153
+ label,
154
+ user,
155
+ } = applyTransform(changedParams, transformations);
156
+
157
+ try {
158
+ const response = await contactService.searchContacts(
159
+ page,
160
+ size,
161
+ q,
162
+ sort || '+name',
163
+ ['mode', ...fields],
164
+ id,
165
+ qin,
166
+ mode,
167
+ not_id_group,
168
+ group,
169
+ owner,
170
+ label,
171
+ user,
172
+ );
173
+
174
+ const { items, next } = applyTransform(
175
+ { ...response.data, items: response.data.data || [] },
176
+ [snakeToCamel(['custom']), merge(getDefaultGetListResponse())],
177
+ );
178
+
179
+ return {
180
+ items: applyTransform(items, [
181
+ (items) => items?.map((item) => formatAccessMode(item)),
182
+ listResponseHandler,
183
+ ]),
184
+ next,
185
+ };
186
+ } catch (err) {
187
+ throw applyTransform(err, [notify]);
188
+ }
189
+ };
190
+
191
+ const get = async ({ itemId: id }) => {
192
+ const fields = [
193
+ 'name',
194
+ 'about',
195
+ 'labels',
196
+ 'groups',
197
+ 'etag',
198
+ 'mode',
199
+ 'managers',
200
+ 'timezones',
201
+ 'variables',
202
+ 'phones',
203
+ 'emails',
204
+ 'imclients',
205
+ 'user',
206
+ 'custom',
207
+ ];
208
+
209
+ const defaultObject = {};
210
+ const itemResponseHandler = (item) => {
211
+ return {
212
+ ...item,
213
+ name: item.name.commonName,
214
+ labels: item.labels ? [...item.labels.data] : [],
215
+ groups: getGroupsFromResponse(item),
216
+ managers: item.managers ? [...item.managers.data] : [],
217
+ timezones: item.timezones ? [...item.timezones.data] : [],
218
+ variables: item.variables ? [...item.variables.data] : [],
219
+ phones: item.phones ? [...item.phones.data] : [],
220
+ emails: item.emails ? [...item.emails.data] : [],
221
+ };
222
+ };
223
+ try {
224
+ const response = await contactService.locateContact(id, fields);
225
+ return applyTransform(response.data, [
226
+ snakeToCamel(['custom']),
227
+ merge(defaultObject),
228
+ itemResponseHandler,
229
+ formatAccessMode,
230
+ ]);
231
+ } catch (err) {
232
+ throw applyTransform(err, [notify]);
233
+ }
234
+ };
235
+
236
+ const fieldsToSend = [
237
+ 'name',
238
+ 'labels',
239
+ 'about',
240
+ 'managers',
241
+ 'timezones',
242
+ 'groups',
243
+ 'custom',
244
+ ];
245
+
246
+ const sanitizeManagers = (itemInstance) => {
247
+ // handle many managers and even no managers field cases
248
+ const managers = (itemInstance.managers || []).filter(
249
+ ({ user } = {}) => user.id,
250
+ );
251
+ return { ...itemInstance, managers };
252
+ };
253
+
254
+ const sanitizeTimezones = (itemInstance) => {
255
+ // handle many timezones and even no timezones field cases
256
+ const timezones = (itemInstance.timezones || []).filter(
257
+ ({ timezone } = {}) => timezone.id,
258
+ );
259
+ return { ...itemInstance, timezones };
260
+ };
261
+
262
+ const sanitizeGroups = (itemInstance) => {
263
+ // handle many groups and even no groups field cases
264
+ const groups = (itemInstance.groups || []).map((item) => ({ group: item }));
265
+ return { ...itemInstance, groups };
266
+ };
267
+
268
+ const preRequestHandler = (item) => {
269
+ const copy = deepCopy(item);
270
+ copy.name = {
271
+ commonName: copy.name,
272
+ };
273
+ return copy;
274
+ };
275
+
276
+ const getGroupsFromResponse = (item) => {
277
+ return item.groups ? [...item.groups.data.map((el) => el.group)] : [];
278
+ };
279
+
280
+ const add = async ({ itemInstance }) => {
281
+ const item = applyTransform(itemInstance, [
282
+ preRequestHandler,
283
+ sanitizeManagers,
284
+ sanitizeTimezones,
285
+ sanitizeGroups,
286
+ sanitize(fieldsToSend),
287
+ camelToSnake(['custom']),
288
+ ]);
289
+ try {
290
+ const response = await contactService.createContact(item);
291
+ return applyTransform(response.data, [snakeToCamel(['custom'])]);
292
+ } catch (err) {
293
+ throw applyTransform(err, [notify]);
294
+ }
295
+ };
296
+
297
+ const update = async ({ itemInstance }) => {
298
+ const { etag } = itemInstance;
299
+ const item = applyTransform(itemInstance, [
300
+ preRequestHandler,
301
+ sanitizeManagers,
302
+ sanitizeTimezones,
303
+ sanitizeGroups,
304
+ sanitize(fieldsToSend),
305
+ camelToSnake(['custom']),
306
+ ]);
307
+ try {
308
+ const response = await contactService.updateContact(etag, item);
309
+ return applyTransform(response.data, [snakeToCamel(['custom'])]);
310
+ } catch (err) {
311
+ throw applyTransform(err, [notify]);
312
+ }
313
+ };
314
+
315
+ const deleteContact = async ({ id }) => {
316
+ try {
317
+ const response = await contactService.deleteContact(id);
318
+ return applyTransform(response.data, []);
319
+ } catch (err) {
320
+ throw applyTransform(err, [notify]);
321
+ }
322
+ };
323
+
324
+ const getContactsLookup = (params) =>
325
+ getList({
326
+ ...params,
327
+ fields: params.fields || ['id', 'name'],
328
+ });
329
+
330
+ const ContactsAPI = {
331
+ getList,
332
+ get,
333
+ add,
334
+ update,
335
+ delete: deleteContact,
336
+ getLookup: getContactsLookup,
337
+ };
338
+
339
+ export default ContactsAPI;
@@ -0,0 +1,9 @@
1
+ const ContactsSearchMode = Object.freeze({
2
+ NAME: 'name',
3
+ LABELS: 'labels',
4
+ ABOUT: 'about',
5
+ VARIABLES: 'variables',
6
+ DESTINATION: 'destination',
7
+ });
8
+
9
+ export default ContactsSearchMode;
@@ -0,0 +1,5 @@
1
+ import contactChatMessagesHistory from './contactChatMessagesHistory';
2
+ import contacts from './contacts';
3
+ import ContactsSearchMode from './enums/ContactsSearchMode';
4
+
5
+ export { contactChatMessagesHistory, contacts, ContactsSearchMode };
@@ -0,0 +1,6 @@
1
+ const getDefaultGetListResponse = ({} = {}) => ({
2
+ items: [],
3
+ next: false,
4
+ });
5
+
6
+ export default getDefaultGetListResponse;
@@ -0,0 +1,6 @@
1
+ const getDefaultGetParams = ({ page = 1, size = 10 } = {}) => ({
2
+ page,
3
+ size,
4
+ });
5
+
6
+ export default getDefaultGetParams;
@@ -0,0 +1,21 @@
1
+ import qs from 'qs';
2
+ import generateInstance from '../../axios/generateInstance';
3
+ import updateTokenInterceptor from '../../interceptors/request/updateToken.interceptor';
4
+ import handleUnauthorizedInterceptor from '../../interceptors/response/handleUnauthorized.interceptor';
5
+
6
+ const getDefaultInstance = () => {
7
+ return generateInstance({
8
+ interceptors: {
9
+ request: [updateTokenInterceptor],
10
+ response: [handleUnauthorizedInterceptor],
11
+ },
12
+ baseURL: import.meta.env.VITE_API_URL,
13
+ paramsSerializer: (params) => {
14
+ return qs.stringify(params);
15
+ },
16
+ });
17
+ };
18
+
19
+ export { getDefaultInstance };
20
+
21
+ export default getDefaultInstance;
@@ -0,0 +1,10 @@
1
+ import { Configuration } from 'webitel-sdk';
2
+
3
+ const getDefaultOpenAPIConfig = () =>
4
+ new Configuration({
5
+ basePath: import.meta.env.VITE_API_URL,
6
+ apiKey: localStorage.getItem('access-key') || '',
7
+ accessToken: localStorage.getItem('access-key') || '',
8
+ });
9
+
10
+ export default getDefaultOpenAPIConfig;
@@ -0,0 +1,11 @@
1
+ import getDefaultGetListResponse from './getDefaultGetListResponse/getDefaultGetListResponse';
2
+ import getDefaultGetParams from './getDefaultGetParams/getDefaultGetParams';
3
+ import getDefaultInstance from './getDefaultInstance/getDefaultInstance';
4
+ import getDefaultOpenAPIConfig from './getDefaultOpenAPIConfig/getDefaultOpenAPIConfig';
5
+
6
+ export {
7
+ getDefaultGetListResponse,
8
+ getDefaultGetParams,
9
+ getDefaultInstance,
10
+ getDefaultOpenAPIConfig,
11
+ };
@@ -0,0 +1,6 @@
1
+ // Export all nested directories' contents
2
+ export * from './axios';
3
+ export * from './clients';
4
+ export * from './defaults';
5
+ export * from './interceptors';
6
+ export * from './transformers';
@@ -0,0 +1,3 @@
1
+ // Export interceptors
2
+ export * from './request';
3
+ export * from './response';
@@ -0,0 +1,2 @@
1
+ // Export request interceptors
2
+ export { default as updateTokenInterceptor } from './updateToken.interceptor';
@@ -0,0 +1,10 @@
1
+ const updateTokenInterceptor = [
2
+ (config) => {
3
+ config.headers['X-Webitel-Access'] =
4
+ localStorage.getItem('access-token') || '';
5
+ return config;
6
+ },
7
+ (error) => Promise.reject(error),
8
+ ];
9
+
10
+ export default updateTokenInterceptor;
@@ -0,0 +1,12 @@
1
+ const handleUnauthorizedInterceptor = [
2
+ (response) => response,
3
+ (error) => {
4
+ if (error.response && error.response.status === 401) {
5
+ console.warn('intercepted 401');
6
+ localStorage.removeItem('access-token');
7
+ }
8
+ return Promise.reject(error);
9
+ },
10
+ ];
11
+
12
+ export default handleUnauthorizedInterceptor;
@@ -0,0 +1,2 @@
1
+ // Export response interceptors
2
+ export { default as handleUnauthorizedInterceptor } from './handleUnauthorized.interceptor';
@@ -0,0 +1,19 @@
1
+ // @author @stanislav-kozak
2
+ // This function adds query parameters to a given URL.
3
+ // Where queryArray is an array of query parameters in the format 'key=value'.
4
+ const addQueryParamsToUrl = (queryArray) => (url) => {
5
+ let modifyUrl = url;
6
+
7
+ if (queryArray && queryArray.length > 0) {
8
+ if (modifyUrl.includes('?')) {
9
+ modifyUrl += '&' + queryArray.join('&');
10
+
11
+ return modifyUrl;
12
+ }
13
+
14
+ modifyUrl += '?' + queryArray.join('&');
15
+ }
16
+
17
+ return modifyUrl;
18
+ };
19
+ export default addQueryParamsToUrl;
@@ -0,0 +1,17 @@
1
+ const applyTransform = (
2
+ target,
3
+ transformers,
4
+ { debug = false, withContext = null } = {},
5
+ ) => {
6
+ return transformers.reduce((result, transformer, index) => {
7
+ if (debug) console.info(`applyTransform debug on step ${index}`, result);
8
+
9
+ if (withContext) {
10
+ return transformer(result, withContext);
11
+ }
12
+
13
+ return transformer(result);
14
+ }, target);
15
+ };
16
+
17
+ export default applyTransform;
@@ -0,0 +1,5 @@
1
+ import { objCamelToSnake } from '../../../scripts/caseConverters';
2
+
3
+ const camelToSnakeTransformer = (skipKeys) => (obj) =>
4
+ objCamelToSnake(obj, skipKeys);
5
+ export default camelToSnakeTransformer;
@@ -0,0 +1,13 @@
1
+ import qs from 'query-string';
2
+
3
+ const generateUrlTransformer = (baseUrl) => (params) => {
4
+ const stringifyOptions = {
5
+ skipEmptyString: true,
6
+ skipNull: true,
7
+ };
8
+
9
+ const url = `${baseUrl}?${qs.stringify(params, stringifyOptions)}`;
10
+ return url;
11
+ };
12
+
13
+ export default generateUrlTransformer;
@@ -0,0 +1,28 @@
1
+ import addQueryParamsToUrl from './addQueryParamsToUrl/addQueryParamsToUrl.transformer';
2
+ import applyTransform from './applyTransform';
3
+ import camelToSnake from './camelToSnake/camelToSnake.transformer';
4
+ import generateUrl from './generateUrl/generateUrl.transformer';
5
+ import log from './log/log.transformer';
6
+ import merge from './merge/merge.transformer';
7
+ import mergeEach from './mergeEach/mergeEach.transformer';
8
+ import notify from './notify/notify.transformer';
9
+ import sanitize from './sanitize/sanitize.transformer';
10
+ import { skipIf } from './skipIf/skipIf';
11
+ import snakeToCamel from './snakeToCamel/snakeToCamel.transformer';
12
+ import starToSearch from './starToSearch/starToSearch.transformer';
13
+
14
+ export {
15
+ addQueryParamsToUrl,
16
+ camelToSnake,
17
+ generateUrl,
18
+ log,
19
+ merge,
20
+ mergeEach,
21
+ notify,
22
+ sanitize,
23
+ skipIf,
24
+ snakeToCamel,
25
+ starToSearch,
26
+ };
27
+
28
+ export default applyTransform;
@@ -0,0 +1,6 @@
1
+ const logTransformer = (arg) => {
2
+ console.log(arg);
3
+ return arg;
4
+ };
5
+
6
+ export default logTransformer;
@@ -0,0 +1,8 @@
1
+ import merge from 'deepmerge';
2
+
3
+ const mergeTransformer =
4
+ (...args) =>
5
+ (main) =>
6
+ merge.all([...args, main]);
7
+
8
+ export default mergeTransformer;
@@ -0,0 +1,8 @@
1
+ import merge from 'deepmerge';
2
+
3
+ const mergeEachTransformer =
4
+ (...args) =>
5
+ (main) =>
6
+ main.map((item) => merge.all([...args, item]));
7
+
8
+ export default mergeEachTransformer;
@@ -0,0 +1,39 @@
1
+ import eventBus from '../../../scripts/eventBus';
2
+
3
+ const notifyTransformer = (notificationObject) => {
4
+ /*
5
+ if passed arg is function, then this notification - static content,
6
+ predefined before actual transformer is called in applyTransform flow
7
+ */
8
+ if (typeof notificationObject === 'function') {
9
+ /*
10
+ so, create a callback which will send notification with params, passed to it
11
+ */
12
+ const callback = ({ type, text }) =>
13
+ eventBus.$emit('notification', {
14
+ type,
15
+ text,
16
+ });
17
+
18
+ /*
19
+ and, then, return a function, which will be called in main applyTransform flow,
20
+ calling passed arg function with callback, and returning actual notify payload
21
+ */
22
+ return (payload) => {
23
+ notificationObject({ callback });
24
+ return payload;
25
+ };
26
+ }
27
+ if (notificationObject instanceof Error) {
28
+ eventBus.$emit('notification', {
29
+ type: 'error',
30
+ text:
31
+ notificationObject.response?.data?.detail ||
32
+ notificationObject.response?.data?.message ||
33
+ notificationObject,
34
+ });
35
+ }
36
+ return notificationObject;
37
+ };
38
+
39
+ export default notifyTransformer;
@@ -0,0 +1,12 @@
1
+ const sanitizeTransformer = (fieldsToSend) => (item) => {
2
+ return Object.keys(item).reduce((sanitizedItem, key) => {
3
+ if (fieldsToSend.indexOf(key) === -1) return sanitizedItem;
4
+
5
+ return {
6
+ ...sanitizedItem,
7
+ [key]: item[key],
8
+ };
9
+ }, {});
10
+ };
11
+
12
+ export default sanitizeTransformer;
@@ -0,0 +1,11 @@
1
+ export const skipIf =
2
+ (
3
+ transformer: (...payload: unknown[]) => unknown,
4
+ ifFn: boolean | ((...payload: unknown[]) => boolean),
5
+ ) =>
6
+ (payload: unknown) => {
7
+ if (typeof ifFn === 'function' ? ifFn(payload) : ifFn) {
8
+ return payload;
9
+ }
10
+ return transformer(payload);
11
+ };
@@ -0,0 +1,5 @@
1
+ import { objSnakeToCamel } from '../../../scripts/caseConverters';
2
+
3
+ const snakeToCamelTransformer = (skipKeys) => (obj) =>
4
+ objSnakeToCamel(obj, skipKeys);
5
+ export default snakeToCamelTransformer;
@@ -0,0 +1,15 @@
1
+ import deepcopy from 'deep-copy';
2
+ import get from 'lodash/get';
3
+
4
+ import updateObject from '../../../scripts/updateObject';
5
+
6
+ const starToSearchTransformer =
7
+ (path = 'search') =>
8
+ (params) => {
9
+ const copy = deepcopy(params);
10
+ const value = get(copy, path);
11
+ if (!value || value.slice(-1) === '*') return copy;
12
+ return updateObject({ obj: copy, path, value: `${value}*` });
13
+ };
14
+
15
+ export default starToSearchTransformer;