@webitel/api-services 0.1.68 → 0.1.70

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 (96) hide show
  1. package/package.json +3 -1
  2. package/src/api/clients/_shared/types.ts +25 -0
  3. package/src/api/clients/caseServiceCatalogs/serviceCatalogs.ts +37 -71
  4. package/src/api/clients/caseServices/services.ts +43 -57
  5. package/src/api/clients/index.ts +9 -0
  6. package/src/api/clients/queues/__tests__/fieldsToSend.spec.ts +135 -0
  7. package/src/api/clients/queues/__tests__/queueLogs.spec.ts +132 -0
  8. package/src/api/clients/queues/__tests__/queueMembers.spec.ts +175 -0
  9. package/src/api/clients/queues/__tests__/queues.spec.ts +130 -0
  10. package/src/api/clients/queues/defaults/__tests__/queueTypeDefaults.spec.ts +143 -0
  11. package/src/api/clients/queues/defaults/amd.ts +17 -0
  12. package/src/api/clients/queues/defaults/defaultQueue.ts +9 -0
  13. package/src/api/clients/queues/defaults/processing.ts +8 -4
  14. package/src/api/clients/queues/defaults/queueTypeDefaults.ts +305 -0
  15. package/src/api/clients/queues/queueAgents.ts +48 -0
  16. package/src/api/clients/queues/queueBuckets.ts +187 -0
  17. package/src/api/clients/queues/queueHooks.ts +184 -0
  18. package/src/api/clients/queues/queueLogs.ts +80 -0
  19. package/src/api/clients/queues/queueMembers.ts +426 -0
  20. package/src/api/clients/queues/queueResGroups.ts +176 -0
  21. package/src/api/clients/queues/queueSkills.ts +183 -0
  22. package/src/api/clients/queues/queueState.ts +97 -0
  23. package/src/api/clients/queues/queues.ts +124 -94
  24. package/src/api/clients/queues/scripts/__tests__/mapResetMembersFilters.spec.ts +132 -0
  25. package/src/api/clients/queues/scripts/mapResetMembersFilters.ts +52 -0
  26. package/src/enums/CallReportingStatus/CallReportingStatus.ts +13 -0
  27. package/src/enums/MemberStopCause/MemberStopCause.ts +13 -0
  28. package/src/enums/QueueStrategy/QueueStrategy.ts +27 -0
  29. package/src/enums/QueueType/QueueType.ts +31 -0
  30. package/src/enums/TimeBaseScore/TimeBaseScore.ts +6 -0
  31. package/src/enums/TypesResourceStrategy/TypesResourceStrategy.ts +7 -0
  32. package/src/enums/index.ts +21 -1
  33. package/src/scripts/index.ts +19 -1
  34. package/src/scripts/normalizeDatetime/normalizeDatetime.ts +132 -0
  35. package/src/validations/_shared/isFilled.ts +15 -0
  36. package/src/validations/_shared/lookup.validations.ts +28 -0
  37. package/src/validations/_shared/variablePair.validations.ts +18 -0
  38. package/src/validations/caseService/caseService.validations.ts +15 -0
  39. package/src/validations/caseServiceCatalog/caseServiceCatalog.validations.ts +23 -0
  40. package/src/validations/index.ts +14 -0
  41. package/src/validations/queue/__tests__/queue.validations.spec.ts +159 -0
  42. package/src/validations/queue/queue.rules.ts +166 -0
  43. package/src/validations/queue/queue.validations.ts +105 -0
  44. package/src/validations/queue/queueAmd.validations.ts +22 -0
  45. package/src/validations/queue/queuePayload.validations.ts +71 -0
  46. package/src/validations/queue/taskProcessing.validations.ts +21 -0
  47. package/src/validations/queueBucket/queueBucket.validations.ts +10 -0
  48. package/src/validations/queueHook/queueHook.validations.ts +10 -0
  49. package/src/validations/queueMember/memberCommunication.validations.ts +25 -0
  50. package/src/validations/queueMember/queueMember.validations.ts +38 -0
  51. package/src/validations/queueResGroup/queueResGroup.validations.ts +15 -0
  52. package/src/validations/queueSkill/queueSkill.validations.ts +42 -0
  53. package/types/.tsbuildinfo +1 -1
  54. package/types/api/clients/_shared/types.d.ts +20 -0
  55. package/types/api/clients/caseServices/services.d.ts +4 -2
  56. package/types/api/clients/index.d.ts +9 -0
  57. package/types/api/clients/queues/defaults/amd.d.ts +17 -0
  58. package/types/api/clients/queues/defaults/defaultQueue.d.ts +9 -0
  59. package/types/api/clients/queues/defaults/processing.d.ts +7 -2
  60. package/types/api/clients/queues/defaults/queueTypeDefaults.d.ts +31 -0
  61. package/types/api/clients/queues/queueAgents.d.ts +7 -0
  62. package/types/api/clients/queues/queueBuckets.d.ts +12 -0
  63. package/types/api/clients/queues/queueHooks.d.ts +12 -0
  64. package/types/api/clients/queues/queueLogs.d.ts +7 -0
  65. package/types/api/clients/queues/queueMembers.d.ts +30 -0
  66. package/types/api/clients/queues/queueResGroups.d.ts +15 -0
  67. package/types/api/clients/queues/queueSkills.d.ts +12 -0
  68. package/types/api/clients/queues/queueState.d.ts +8 -0
  69. package/types/api/clients/queues/queues.d.ts +9 -1
  70. package/types/api/clients/queues/scripts/mapResetMembersFilters.d.ts +30 -0
  71. package/types/enums/CallReportingStatus/CallReportingStatus.d.ts +11 -0
  72. package/types/enums/MemberStopCause/MemberStopCause.d.ts +11 -0
  73. package/types/enums/QueueStrategy/QueueStrategy.d.ts +21 -0
  74. package/types/enums/QueueType/QueueType.d.ts +28 -0
  75. package/types/enums/TimeBaseScore/TimeBaseScore.d.ts +5 -0
  76. package/types/enums/TypesResourceStrategy/TypesResourceStrategy.d.ts +5 -0
  77. package/types/enums/index.d.ts +7 -1
  78. package/types/scripts/index.d.ts +3 -1
  79. package/types/scripts/normalizeDatetime/normalizeDatetime.d.ts +14 -0
  80. package/types/validations/_shared/isFilled.d.ts +9 -0
  81. package/types/validations/_shared/lookup.validations.d.ts +18 -0
  82. package/types/validations/_shared/variablePair.validations.d.ts +16 -0
  83. package/types/validations/caseService/caseService.validations.d.ts +20 -0
  84. package/types/validations/caseServiceCatalog/caseServiceCatalog.validations.d.ts +21 -0
  85. package/types/validations/index.d.ts +14 -0
  86. package/types/validations/queue/queue.rules.d.ts +21 -0
  87. package/types/validations/queue/queue.validations.d.ts +285 -0
  88. package/types/validations/queue/queueAmd.validations.d.ts +22 -0
  89. package/types/validations/queue/queuePayload.validations.d.ts +75 -0
  90. package/types/validations/queue/taskProcessing.validations.d.ts +22 -0
  91. package/types/validations/queueBucket/queueBucket.validations.d.ts +9 -0
  92. package/types/validations/queueHook/queueHook.validations.d.ts +10 -0
  93. package/types/validations/queueMember/memberCommunication.validations.d.ts +16 -0
  94. package/types/validations/queueMember/queueMember.validations.d.ts +48 -0
  95. package/types/validations/queueResGroup/queueResGroup.validations.d.ts +11 -0
  96. package/types/validations/queueSkill/queueSkill.validations.d.ts +34 -0
@@ -0,0 +1,305 @@
1
+ import {
2
+ QueueStrategy,
3
+ QueueType,
4
+ TimeBaseScore,
5
+ TypesResourceStrategy,
6
+ } from '../../../../enums';
7
+ import { amd } from './amd';
8
+ import { defaultQueue } from './defaultQueue';
9
+ import { processing } from './processing';
10
+
11
+ /**
12
+ * @description
13
+ * The default field set a queue of a given type is created with.
14
+ *
15
+ * These are NOT cosmetic. Regle builds its nested `$fields` from the *state*
16
+ * keys, not from the Zod schema shape — a field that is declared in
17
+ * `queueSchema` but missing from the draft has no validation entry at all, so
18
+ * its required marker and error text silently disappear from the form.
19
+ * Every key a queue type's UI can touch must therefore be seeded here, on
20
+ * create (via the card store) and on read (see `QueuesAPI.get`).
21
+ *
22
+ * Ported 1:1 from the admin app's legacy `store/_internals/queueSchema/*.js`.
23
+ * Keep the per-type key sets exactly as they are: `sanitize(fieldsToSend)` only
24
+ * filters top-level keys, so `payload` is sent whole and a stray cross-type
25
+ * field (e.g. `progressiveCount` on an inbound queue) would reach the backend.
26
+ */
27
+ export interface QueueDefaults {
28
+ [key: string]: unknown;
29
+ type: QueueType;
30
+ payload: Record<string, unknown>;
31
+ }
32
+
33
+ const offlineQueue = (): QueueDefaults => ({
34
+ ...defaultQueue(),
35
+ type: QueueType.OFFLINE_QUEUE,
36
+ team: {},
37
+ strategy: QueueStrategy.FIFO,
38
+ doSchema: {},
39
+ afterSchema: {},
40
+ grantee: {},
41
+ taskProcessing: processing(),
42
+ payload: {
43
+ maxAttempts: 3,
44
+ waitBetweenRetries: 30 * 60,
45
+ originateTimeout: 60,
46
+ recordings: false,
47
+ recordAll: false,
48
+ perNumbers: false,
49
+ minOnlineAgents: 0,
50
+ maxMemberLimit: 0,
51
+ },
52
+ });
53
+
54
+ const inboundQueue = (): QueueDefaults => ({
55
+ ...defaultQueue(),
56
+ type: QueueType.INBOUND_QUEUE,
57
+ team: {},
58
+ ringtone: {},
59
+ grantee: {},
60
+ stickyAgent: false,
61
+ taskProcessing: processing(),
62
+ payload: {
63
+ discardAbandonedAfter: 0,
64
+ timeBaseScore: TimeBaseScore.QUEUE,
65
+ maxWaitTime: 60 * 60,
66
+ allowGreetingAgent: false,
67
+ stickyIgnoreStatus: false,
68
+ ignoreCalendar: false,
69
+ stickyAgentSec: 5,
70
+ maxWaitingSize: 0,
71
+ autoAnswerTone: null,
72
+ minOnlineAgents: 0,
73
+ manualDistribution: false,
74
+ maxMemberLimit: 0,
75
+ },
76
+ });
77
+
78
+ /** NB: no `taskProcessing` — matches the legacy schema exactly. */
79
+ const outboundIVRQueue = (): QueueDefaults => ({
80
+ ...defaultQueue(),
81
+ type: QueueType.OUTBOUND_IVR_QUEUE,
82
+ strategy: QueueStrategy.FIFO,
83
+ schema: {},
84
+ doSchema: {},
85
+ afterSchema: {},
86
+ grantee: {},
87
+ payload: {
88
+ minDuration: 3,
89
+ maxAttempts: 3,
90
+ originateTimeout: 60,
91
+ waitBetweenRetries: 30 * 60,
92
+ waitBetweenRetriesDesc: false,
93
+ maxCalls: 10,
94
+ recordings: false,
95
+ recordAll: false,
96
+ amd: amd(),
97
+ strictCircuit: false,
98
+ perNumbers: false,
99
+ resourceStrategy: TypesResourceStrategy.EVEN_DISTRIBUTION,
100
+ maxMemberLimit: 0,
101
+ },
102
+ });
103
+
104
+ const previewDialer = (): QueueDefaults => ({
105
+ ...defaultQueue(),
106
+ type: QueueType.PREVIEW_DIALER,
107
+ team: {},
108
+ strategy: QueueStrategy.FIFO,
109
+ doSchema: {},
110
+ afterSchema: {},
111
+ grantee: {},
112
+ stickyAgent: false,
113
+ taskProcessing: processing(),
114
+ payload: {
115
+ maxAttempts: 3,
116
+ originateTimeout: 60,
117
+ waitBetweenRetries: 30 * 60,
118
+ waitBetweenRetriesDesc: false,
119
+ maxCalls: 10,
120
+ recordings: false,
121
+ recordAll: false,
122
+ allowGreetingAgent: false,
123
+ strictCircuit: false,
124
+ endless: false,
125
+ perNumbers: false,
126
+ minOnlineAgents: 0,
127
+ resourceStrategy: TypesResourceStrategy.EVEN_DISTRIBUTION,
128
+ maxMemberLimit: 0,
129
+ },
130
+ });
131
+
132
+ const progressiveDialer = (): QueueDefaults => ({
133
+ ...defaultQueue(),
134
+ type: QueueType.PROGRESSIVE_DIALER,
135
+ team: {},
136
+ strategy: QueueStrategy.FIFO,
137
+ doSchema: {},
138
+ afterSchema: {},
139
+ ringtone: {},
140
+ grantee: {},
141
+ stickyAgent: false,
142
+ taskProcessing: processing(),
143
+ payload: {
144
+ maxAttempts: 3,
145
+ originateTimeout: 60,
146
+ waitBetweenRetries: 30 * 60,
147
+ progressiveCount: 1,
148
+ waitBetweenRetriesDesc: false,
149
+ recordings: false,
150
+ recordAll: false,
151
+ allowGreetingAgent: false,
152
+ maxCalls: 10,
153
+ amd: amd(),
154
+ strictCircuit: false,
155
+ endless: false,
156
+ perNumbers: false,
157
+ autoAnswerTone: null,
158
+ minOnlineAgents: 0,
159
+ resourceStrategy: TypesResourceStrategy.EVEN_DISTRIBUTION,
160
+ maxMemberLimit: 0,
161
+ },
162
+ });
163
+
164
+ const predictiveDialer = (): QueueDefaults => ({
165
+ ...defaultQueue(),
166
+ type: QueueType.PREDICTIVE_DIALER,
167
+ strategy: QueueStrategy.FIFO,
168
+ team: {},
169
+ doSchema: {},
170
+ afterSchema: {},
171
+ ringtone: {},
172
+ grantee: {},
173
+ stickyAgent: false,
174
+ taskProcessing: processing(),
175
+ payload: {
176
+ maxWaitTime: 10,
177
+ maxAttempts: 3,
178
+ originateTimeout: 60,
179
+ waitBetweenRetries: 30 * 60,
180
+ progressiveCount: 1,
181
+ waitBetweenRetriesDesc: false,
182
+ retryAbandoned: false,
183
+ recordings: false,
184
+ recordAll: false,
185
+ allowGreetingAgent: false,
186
+ maxCalls: 10,
187
+ dialingRate: 5,
188
+ amd: amd(),
189
+ maxAgentLine: 5,
190
+ minAttempts: 3,
191
+ maxAbandonedRate: 5.0,
192
+ targetAbandonedRate: 3.0,
193
+ loadFactor: 10,
194
+ maxAgentLose: 1,
195
+ abandonRateAdjustment: 0,
196
+ playbackSilence: 0,
197
+ strictCircuit: false,
198
+ statisticTime: 60,
199
+ endless: false,
200
+ perNumbers: false,
201
+ stickyAgentSec: 5,
202
+ autoAnswerTone: null,
203
+ minOnlineAgents: 0,
204
+ resourceStrategy: TypesResourceStrategy.EVEN_DISTRIBUTION,
205
+ maxMemberLimit: 0,
206
+ },
207
+ });
208
+
209
+ const chatInboundQueue = (): QueueDefaults => ({
210
+ ...defaultQueue(),
211
+ type: QueueType.CHAT_INBOUND_QUEUE,
212
+ team: {},
213
+ strategy: QueueStrategy.FIFO,
214
+ formSchema: {},
215
+ stickyAgent: false,
216
+ taskProcessing: processing(),
217
+ payload: {
218
+ discardAbandonedAfter: 0,
219
+ timeBaseScore: TimeBaseScore.QUEUE,
220
+ maxWaitTime: 60 * 60,
221
+ stickyAgentSec: 5,
222
+ stickyIgnoreStatus: false,
223
+ ignoreCalendar: false,
224
+ maxIdleAgent: 60 * 60,
225
+ maxIdleClient: 60 * 60,
226
+ maxIdleDialog: 0,
227
+ maxWaitingSize: 0,
228
+ minOnlineAgents: 0,
229
+ manualDistribution: false,
230
+ lastMessageTimeout: false,
231
+ maxMemberLimit: 0,
232
+ },
233
+ });
234
+
235
+ /** Identical to CHAT_INBOUND_QUEUE apart from `type` — as in the legacy schema. */
236
+ const imChatQueue = (): QueueDefaults => ({
237
+ ...chatInboundQueue(),
238
+ type: QueueType.IM_CHAT_QUEUE,
239
+ });
240
+
241
+ const inboundJobQueue = (): QueueDefaults => ({
242
+ ...defaultQueue(),
243
+ type: QueueType.INBOUND_JOB_QUEUE,
244
+ team: {},
245
+ strategy: QueueStrategy.FIFO,
246
+ doSchema: {},
247
+ afterSchema: {},
248
+ stickyAgent: false,
249
+ taskProcessing: processing(),
250
+ payload: {
251
+ maxAttempts: 3,
252
+ waitBetweenRetries: 30 * 60,
253
+ maxCalls: 10,
254
+ waitBetweenRetriesDesc: false,
255
+ minOnlineAgents: 0,
256
+ maxMemberLimit: 0,
257
+ },
258
+ });
259
+
260
+ /** NB: no `taskProcessing` — matches the legacy schema exactly. */
261
+ const outboundJobQueue = (): QueueDefaults => ({
262
+ ...defaultQueue(),
263
+ type: QueueType.OUTBOUND_JOB_QUEUE,
264
+ strategy: QueueStrategy.FIFO,
265
+ schema: {},
266
+ doSchema: {},
267
+ afterSchema: {},
268
+ payload: {
269
+ maxAttempts: 3,
270
+ originateTimeout: 60,
271
+ waitBetweenRetries: 30 * 60,
272
+ waitBetweenRetriesDesc: false,
273
+ maxCalls: 10,
274
+ strictCircuit: false,
275
+ perNumbers: false,
276
+ maxMemberLimit: 0,
277
+ },
278
+ });
279
+
280
+ export const QueueTypeDefaults: Record<number, () => QueueDefaults> = {
281
+ [QueueType.OFFLINE_QUEUE]: offlineQueue,
282
+ [QueueType.INBOUND_QUEUE]: inboundQueue,
283
+ [QueueType.OUTBOUND_IVR_QUEUE]: outboundIVRQueue,
284
+ [QueueType.PREVIEW_DIALER]: previewDialer,
285
+ [QueueType.PROGRESSIVE_DIALER]: progressiveDialer,
286
+ [QueueType.PREDICTIVE_DIALER]: predictiveDialer,
287
+ [QueueType.CHAT_INBOUND_QUEUE]: chatInboundQueue,
288
+ [QueueType.IM_CHAT_QUEUE]: imChatQueue,
289
+ [QueueType.INBOUND_JOB_QUEUE]: inboundJobQueue,
290
+ [QueueType.OUTBOUND_JOB_QUEUE]: outboundJobQueue,
291
+ };
292
+
293
+ export const hasQueueTypeDefaults = (type: number | string | undefined) =>
294
+ Number(type) in QueueTypeDefaults;
295
+
296
+ /**
297
+ * @description
298
+ * A fresh defaults object for `type`. Always a new object — callers deepmerge
299
+ * into it, and the legacy code relied on factories for exactly this reason.
300
+ * Falls back to the type-agnostic base when `type` is unknown.
301
+ */
302
+ export const getQueueDefaults = (
303
+ type: number | string | undefined,
304
+ ): Partial<QueueDefaults> =>
305
+ QueueTypeDefaults[Number(type)]?.() ?? defaultQueue();
@@ -0,0 +1,48 @@
1
+ import { getAgentService } from '@webitel/api-services/gen';
2
+ import { getDefaultGetListResponse, getDefaultGetParams } from '../../defaults';
3
+ import {
4
+ applyTransform,
5
+ merge,
6
+ notify,
7
+ snakeToCamel,
8
+ } from '../../transformers';
9
+ import type { ApiParams } from '../_shared/types';
10
+
11
+ const getQueueAgentsList = async (params: ApiParams) => {
12
+ const { parentId, page, size, search, fields, sort } = applyTransform(
13
+ params,
14
+ [
15
+ merge(getDefaultGetParams()),
16
+ ],
17
+ );
18
+
19
+ try {
20
+ const response = await getAgentService().searchAgent({
21
+ page,
22
+ size,
23
+ // the generated param is `q`; `search` is what the datalist store sends
24
+ q: search,
25
+ sort,
26
+ fields,
27
+ queueId: [
28
+ Number(parentId),
29
+ ],
30
+ });
31
+ const { items, next } = applyTransform(response.data, [
32
+ snakeToCamel(),
33
+ merge(getDefaultGetListResponse()),
34
+ ]);
35
+ return {
36
+ items,
37
+ next,
38
+ };
39
+ } catch (err) {
40
+ throw applyTransform(err, [
41
+ notify,
42
+ ]);
43
+ }
44
+ };
45
+
46
+ export const QueueAgentsAPI = {
47
+ getList: getQueueAgentsList,
48
+ };
@@ -0,0 +1,187 @@
1
+ import { getQueueBucketService } from '@webitel/api-services/gen';
2
+ import { getShallowFieldsToSendFromZodSchema } from '@webitel/api-services/gen/utils';
3
+ import { queueBucketSchema } from '@webitel/api-services/validations';
4
+ import { getDefaultGetListResponse, getDefaultGetParams } from '../../defaults';
5
+ import {
6
+ applyTransform,
7
+ camelToSnake,
8
+ merge,
9
+ notify,
10
+ sanitize,
11
+ snakeToCamel,
12
+ starToSearch,
13
+ } from '../../transformers';
14
+ import type {
15
+ ApiId,
16
+ ApiParams,
17
+ NestedAddItemParams,
18
+ NestedDeleteItemParams,
19
+ NestedGetItemParams,
20
+ NestedPatchItemParams,
21
+ NestedUpdateItemParams,
22
+ } from '../_shared/types';
23
+
24
+ const fieldsToSend = [
25
+ ...getShallowFieldsToSendFromZodSchema(queueBucketSchema),
26
+ // injected by preRequestHandler; not part of the form, so not in the schema
27
+ 'queueId',
28
+ ];
29
+
30
+ const preRequestHandler = (parentId: ApiId) => (item: ApiParams) => ({
31
+ ...item,
32
+ queueId: parentId,
33
+ });
34
+
35
+ const getQueueBucketsList = async (params: ApiParams) => {
36
+ const { page, size, search, sort, fields, id, parentId } = applyTransform(
37
+ params,
38
+ [
39
+ merge(getDefaultGetParams()),
40
+ starToSearch('search'),
41
+ ],
42
+ );
43
+
44
+ try {
45
+ const response = await getQueueBucketService().searchQueueBucket(
46
+ String(parentId),
47
+ {
48
+ page,
49
+ size,
50
+ // the generated param is `q`; `search` is what the datalist store sends
51
+ q: search,
52
+ sort,
53
+ fields,
54
+ id,
55
+ },
56
+ );
57
+ const { items, next } = applyTransform(response.data, [
58
+ snakeToCamel(),
59
+ merge(getDefaultGetListResponse()),
60
+ ]);
61
+ return {
62
+ items,
63
+ next,
64
+ };
65
+ } catch (err) {
66
+ throw applyTransform(err, [
67
+ notify,
68
+ ]);
69
+ }
70
+ };
71
+
72
+ const getQueueBucket = async ({
73
+ parentId,
74
+ itemId: id,
75
+ }: NestedGetItemParams) => {
76
+ try {
77
+ const response = await getQueueBucketService().readQueueBucket(
78
+ String(parentId),
79
+ String(id),
80
+ );
81
+ return applyTransform(response.data, [
82
+ snakeToCamel(),
83
+ ]);
84
+ } catch (err) {
85
+ throw applyTransform(err, [
86
+ notify,
87
+ ]);
88
+ }
89
+ };
90
+
91
+ const addQueueBucket = async ({
92
+ parentId,
93
+ itemInstance,
94
+ }: NestedAddItemParams) => {
95
+ const item = applyTransform(itemInstance, [
96
+ preRequestHandler(parentId),
97
+ sanitize(fieldsToSend),
98
+ camelToSnake(),
99
+ ]);
100
+ try {
101
+ const response = await getQueueBucketService().createQueueBucket(
102
+ String(parentId),
103
+ item,
104
+ );
105
+ return applyTransform(response.data, [
106
+ snakeToCamel(),
107
+ ]);
108
+ } catch (err) {
109
+ throw applyTransform(err, [
110
+ notify,
111
+ ]);
112
+ }
113
+ };
114
+
115
+ const updateQueueBucket = async ({
116
+ itemInstance,
117
+ itemId: id,
118
+ parentId,
119
+ }: NestedUpdateItemParams) => {
120
+ const item = applyTransform(itemInstance, [
121
+ preRequestHandler(parentId),
122
+ sanitize(fieldsToSend),
123
+ camelToSnake(),
124
+ ]);
125
+ try {
126
+ const response = await getQueueBucketService().updateQueueBucket(
127
+ String(parentId),
128
+ String(id),
129
+ item,
130
+ );
131
+ return applyTransform(response.data, [
132
+ snakeToCamel(),
133
+ ]);
134
+ } catch (err) {
135
+ throw applyTransform(err, [
136
+ notify,
137
+ ]);
138
+ }
139
+ };
140
+
141
+ const patchQueueBucket = async ({
142
+ changes,
143
+ id,
144
+ parentId,
145
+ }: NestedPatchItemParams) => {
146
+ const body = applyTransform(changes, [
147
+ sanitize(fieldsToSend),
148
+ camelToSnake(),
149
+ ]);
150
+ try {
151
+ const response = await getQueueBucketService().patchQueueBucket(
152
+ String(parentId),
153
+ String(id),
154
+ body,
155
+ );
156
+ return applyTransform(response.data, [
157
+ snakeToCamel(),
158
+ ]);
159
+ } catch (err) {
160
+ throw applyTransform(err, [
161
+ notify,
162
+ ]);
163
+ }
164
+ };
165
+
166
+ const deleteQueueBucket = async ({ parentId, id }: NestedDeleteItemParams) => {
167
+ try {
168
+ const response = await getQueueBucketService().deleteQueueBucket(
169
+ String(parentId),
170
+ String(id),
171
+ );
172
+ return applyTransform(response.data, []);
173
+ } catch (err) {
174
+ throw applyTransform(err, [
175
+ notify,
176
+ ]);
177
+ }
178
+ };
179
+
180
+ export const QueueBucketsAPI = {
181
+ getList: getQueueBucketsList,
182
+ get: getQueueBucket,
183
+ add: addQueueBucket,
184
+ update: updateQueueBucket,
185
+ delete: deleteQueueBucket,
186
+ patch: patchQueueBucket,
187
+ };
@@ -0,0 +1,184 @@
1
+ import { getQueueHookService } from '@webitel/api-services/gen';
2
+ import { getShallowFieldsToSendFromZodSchema } from '@webitel/api-services/gen/utils';
3
+ import { queueHookSchema } from '@webitel/api-services/validations';
4
+ import { getDefaultGetListResponse, getDefaultGetParams } from '../../defaults';
5
+ import {
6
+ applyTransform,
7
+ camelToSnake,
8
+ merge,
9
+ notify,
10
+ sanitize,
11
+ snakeToCamel,
12
+ starToSearch,
13
+ } from '../../transformers';
14
+ import type {
15
+ ApiId,
16
+ ApiParams,
17
+ NestedAddItemParams,
18
+ NestedDeleteItemParams,
19
+ NestedGetItemParams,
20
+ NestedPatchItemParams,
21
+ NestedUpdateItemParams,
22
+ } from '../_shared/types';
23
+
24
+ const fieldsToSend = [
25
+ ...getShallowFieldsToSendFromZodSchema(queueHookSchema),
26
+ // injected by preRequestHandler; not part of the form, so not in the schema
27
+ 'queueId',
28
+ ];
29
+
30
+ const preRequestHandler = (parentId: ApiId) => (item: ApiParams) => ({
31
+ ...item,
32
+ queueId: parentId,
33
+ });
34
+
35
+ const getQueueHooksList = async (params: ApiParams) => {
36
+ const { page, size, search, sort, fields, id, parentId } = applyTransform(
37
+ params,
38
+ [
39
+ merge(getDefaultGetParams()),
40
+ starToSearch('search'),
41
+ ],
42
+ );
43
+
44
+ try {
45
+ const response = await getQueueHookService().searchQueueHook(
46
+ Number(parentId),
47
+ {
48
+ page,
49
+ size,
50
+ // the generated param is `q`; `search` is what the datalist store sends
51
+ q: search,
52
+ sort,
53
+ fields,
54
+ id,
55
+ },
56
+ );
57
+ const { items, next } = applyTransform(response.data, [
58
+ snakeToCamel(),
59
+ merge(getDefaultGetListResponse()),
60
+ ]);
61
+ return {
62
+ items,
63
+ next,
64
+ };
65
+ } catch (err) {
66
+ throw applyTransform(err, [
67
+ notify,
68
+ ]);
69
+ }
70
+ };
71
+
72
+ const getQueueHook = async ({ parentId, itemId: id }: NestedGetItemParams) => {
73
+ try {
74
+ const response = await getQueueHookService().readQueueHook(
75
+ Number(parentId),
76
+ Number(id),
77
+ );
78
+ return applyTransform(response.data, [
79
+ snakeToCamel(),
80
+ ]);
81
+ } catch (err) {
82
+ throw applyTransform(err, [
83
+ notify,
84
+ ]);
85
+ }
86
+ };
87
+
88
+ const addQueueHook = async ({
89
+ parentId,
90
+ itemInstance,
91
+ }: NestedAddItemParams) => {
92
+ const item = applyTransform(itemInstance, [
93
+ preRequestHandler(parentId),
94
+ sanitize(fieldsToSend),
95
+ camelToSnake(),
96
+ ]);
97
+ try {
98
+ const response = await getQueueHookService().createQueueHook(
99
+ Number(parentId),
100
+ item,
101
+ );
102
+ return applyTransform(response.data, [
103
+ snakeToCamel(),
104
+ ]);
105
+ } catch (err) {
106
+ throw applyTransform(err, [
107
+ notify,
108
+ ]);
109
+ }
110
+ };
111
+
112
+ const updateQueueHook = async ({
113
+ itemInstance,
114
+ itemId: id,
115
+ parentId,
116
+ }: NestedUpdateItemParams) => {
117
+ const item = applyTransform(itemInstance, [
118
+ preRequestHandler(parentId),
119
+ sanitize(fieldsToSend),
120
+ camelToSnake(),
121
+ ]);
122
+ try {
123
+ const response = await getQueueHookService().updateQueueHook(
124
+ Number(parentId),
125
+ Number(id),
126
+ item,
127
+ );
128
+ return applyTransform(response.data, [
129
+ snakeToCamel(),
130
+ ]);
131
+ } catch (err) {
132
+ throw applyTransform(err, [
133
+ notify,
134
+ ]);
135
+ }
136
+ };
137
+
138
+ const patchQueueHook = async ({
139
+ changes,
140
+ id,
141
+ parentId,
142
+ }: NestedPatchItemParams) => {
143
+ const body = applyTransform(changes, [
144
+ sanitize(fieldsToSend),
145
+ camelToSnake(),
146
+ ]);
147
+ try {
148
+ const response = await getQueueHookService().patchQueueHook(
149
+ Number(parentId),
150
+ Number(id),
151
+ body,
152
+ );
153
+ return applyTransform(response.data, [
154
+ snakeToCamel(),
155
+ ]);
156
+ } catch (err) {
157
+ throw applyTransform(err, [
158
+ notify,
159
+ ]);
160
+ }
161
+ };
162
+
163
+ const deleteQueueHook = async ({ parentId, id }: NestedDeleteItemParams) => {
164
+ try {
165
+ const response = await getQueueHookService().deleteQueueHook(
166
+ Number(parentId),
167
+ Number(id),
168
+ );
169
+ return applyTransform(response.data, []);
170
+ } catch (err) {
171
+ throw applyTransform(err, [
172
+ notify,
173
+ ]);
174
+ }
175
+ };
176
+
177
+ export const QueueHooksAPI = {
178
+ getList: getQueueHooksList,
179
+ get: getQueueHook,
180
+ add: addQueueHook,
181
+ patch: patchQueueHook,
182
+ update: updateQueueHook,
183
+ delete: deleteQueueHook,
184
+ };