@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.
- package/package.json +3 -1
- package/src/api/clients/_shared/types.ts +25 -0
- package/src/api/clients/caseServiceCatalogs/serviceCatalogs.ts +37 -71
- package/src/api/clients/caseServices/services.ts +43 -57
- package/src/api/clients/index.ts +9 -0
- package/src/api/clients/queues/__tests__/fieldsToSend.spec.ts +135 -0
- package/src/api/clients/queues/__tests__/queueLogs.spec.ts +132 -0
- package/src/api/clients/queues/__tests__/queueMembers.spec.ts +175 -0
- package/src/api/clients/queues/__tests__/queues.spec.ts +130 -0
- package/src/api/clients/queues/defaults/__tests__/queueTypeDefaults.spec.ts +143 -0
- package/src/api/clients/queues/defaults/amd.ts +17 -0
- package/src/api/clients/queues/defaults/defaultQueue.ts +9 -0
- package/src/api/clients/queues/defaults/processing.ts +8 -4
- package/src/api/clients/queues/defaults/queueTypeDefaults.ts +305 -0
- package/src/api/clients/queues/queueAgents.ts +48 -0
- package/src/api/clients/queues/queueBuckets.ts +187 -0
- package/src/api/clients/queues/queueHooks.ts +184 -0
- package/src/api/clients/queues/queueLogs.ts +80 -0
- package/src/api/clients/queues/queueMembers.ts +426 -0
- package/src/api/clients/queues/queueResGroups.ts +176 -0
- package/src/api/clients/queues/queueSkills.ts +183 -0
- package/src/api/clients/queues/queueState.ts +97 -0
- package/src/api/clients/queues/queues.ts +124 -94
- package/src/api/clients/queues/scripts/__tests__/mapResetMembersFilters.spec.ts +132 -0
- package/src/api/clients/queues/scripts/mapResetMembersFilters.ts +52 -0
- package/src/enums/CallReportingStatus/CallReportingStatus.ts +13 -0
- package/src/enums/MemberStopCause/MemberStopCause.ts +13 -0
- package/src/enums/QueueStrategy/QueueStrategy.ts +27 -0
- package/src/enums/QueueType/QueueType.ts +31 -0
- package/src/enums/TimeBaseScore/TimeBaseScore.ts +6 -0
- package/src/enums/TypesResourceStrategy/TypesResourceStrategy.ts +7 -0
- package/src/enums/index.ts +21 -1
- package/src/scripts/index.ts +19 -1
- package/src/scripts/normalizeDatetime/normalizeDatetime.ts +132 -0
- package/src/validations/_shared/isFilled.ts +15 -0
- package/src/validations/_shared/lookup.validations.ts +28 -0
- package/src/validations/_shared/variablePair.validations.ts +18 -0
- package/src/validations/caseService/caseService.validations.ts +15 -0
- package/src/validations/caseServiceCatalog/caseServiceCatalog.validations.ts +23 -0
- package/src/validations/index.ts +14 -0
- package/src/validations/queue/__tests__/queue.validations.spec.ts +159 -0
- package/src/validations/queue/queue.rules.ts +166 -0
- package/src/validations/queue/queue.validations.ts +105 -0
- package/src/validations/queue/queueAmd.validations.ts +22 -0
- package/src/validations/queue/queuePayload.validations.ts +71 -0
- package/src/validations/queue/taskProcessing.validations.ts +21 -0
- package/src/validations/queueBucket/queueBucket.validations.ts +10 -0
- package/src/validations/queueHook/queueHook.validations.ts +10 -0
- package/src/validations/queueMember/memberCommunication.validations.ts +25 -0
- package/src/validations/queueMember/queueMember.validations.ts +38 -0
- package/src/validations/queueResGroup/queueResGroup.validations.ts +15 -0
- package/src/validations/queueSkill/queueSkill.validations.ts +42 -0
- package/types/.tsbuildinfo +1 -1
- package/types/api/clients/_shared/types.d.ts +20 -0
- package/types/api/clients/caseServices/services.d.ts +4 -2
- package/types/api/clients/index.d.ts +9 -0
- package/types/api/clients/queues/defaults/amd.d.ts +17 -0
- package/types/api/clients/queues/defaults/defaultQueue.d.ts +9 -0
- package/types/api/clients/queues/defaults/processing.d.ts +7 -2
- package/types/api/clients/queues/defaults/queueTypeDefaults.d.ts +31 -0
- package/types/api/clients/queues/queueAgents.d.ts +7 -0
- package/types/api/clients/queues/queueBuckets.d.ts +12 -0
- package/types/api/clients/queues/queueHooks.d.ts +12 -0
- package/types/api/clients/queues/queueLogs.d.ts +7 -0
- package/types/api/clients/queues/queueMembers.d.ts +30 -0
- package/types/api/clients/queues/queueResGroups.d.ts +15 -0
- package/types/api/clients/queues/queueSkills.d.ts +12 -0
- package/types/api/clients/queues/queueState.d.ts +8 -0
- package/types/api/clients/queues/queues.d.ts +9 -1
- package/types/api/clients/queues/scripts/mapResetMembersFilters.d.ts +30 -0
- package/types/enums/CallReportingStatus/CallReportingStatus.d.ts +11 -0
- package/types/enums/MemberStopCause/MemberStopCause.d.ts +11 -0
- package/types/enums/QueueStrategy/QueueStrategy.d.ts +21 -0
- package/types/enums/QueueType/QueueType.d.ts +28 -0
- package/types/enums/TimeBaseScore/TimeBaseScore.d.ts +5 -0
- package/types/enums/TypesResourceStrategy/TypesResourceStrategy.d.ts +5 -0
- package/types/enums/index.d.ts +7 -1
- package/types/scripts/index.d.ts +3 -1
- package/types/scripts/normalizeDatetime/normalizeDatetime.d.ts +14 -0
- package/types/validations/_shared/isFilled.d.ts +9 -0
- package/types/validations/_shared/lookup.validations.d.ts +18 -0
- package/types/validations/_shared/variablePair.validations.d.ts +16 -0
- package/types/validations/caseService/caseService.validations.d.ts +20 -0
- package/types/validations/caseServiceCatalog/caseServiceCatalog.validations.d.ts +21 -0
- package/types/validations/index.d.ts +14 -0
- package/types/validations/queue/queue.rules.d.ts +21 -0
- package/types/validations/queue/queue.validations.d.ts +285 -0
- package/types/validations/queue/queueAmd.validations.d.ts +22 -0
- package/types/validations/queue/queuePayload.validations.d.ts +75 -0
- package/types/validations/queue/taskProcessing.validations.d.ts +22 -0
- package/types/validations/queueBucket/queueBucket.validations.d.ts +9 -0
- package/types/validations/queueHook/queueHook.validations.d.ts +10 -0
- package/types/validations/queueMember/memberCommunication.validations.d.ts +16 -0
- package/types/validations/queueMember/queueMember.validations.d.ts +48 -0
- package/types/validations/queueResGroup/queueResGroup.validations.d.ts +11 -0
- 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
|
+
};
|