@webitel/api-services 0.1.69 → 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/index.ts +8 -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/index.ts +12 -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/index.d.ts +8 -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/index.d.ts +12 -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,426 @@
|
|
|
1
|
+
import { getMemberService } from '@webitel/api-services/gen';
|
|
2
|
+
import { getShallowFieldsToSendFromZodSchema } from '@webitel/api-services/gen/utils';
|
|
3
|
+
import { queueMemberSchema } from '@webitel/api-services/validations';
|
|
4
|
+
import deepCopy from 'deep-copy';
|
|
5
|
+
import { normalizeDatetimeRange } from '../../../scripts';
|
|
6
|
+
import { getDefaultGetListResponse, getDefaultGetParams } from '../../defaults';
|
|
7
|
+
import {
|
|
8
|
+
applyTransform,
|
|
9
|
+
camelToSnake,
|
|
10
|
+
merge,
|
|
11
|
+
notify,
|
|
12
|
+
sanitize,
|
|
13
|
+
snakeToCamel,
|
|
14
|
+
starToSearch,
|
|
15
|
+
} from '../../transformers';
|
|
16
|
+
import type {
|
|
17
|
+
ApiId,
|
|
18
|
+
ApiParams,
|
|
19
|
+
NestedAddItemParams,
|
|
20
|
+
NestedDeleteItemParams,
|
|
21
|
+
NestedGetItemParams,
|
|
22
|
+
NestedUpdateItemParams,
|
|
23
|
+
} from '../_shared/types';
|
|
24
|
+
import {
|
|
25
|
+
mapResetMembersFilters,
|
|
26
|
+
mapResetMembersQuantityFilters,
|
|
27
|
+
} from './scripts/mapResetMembersFilters';
|
|
28
|
+
|
|
29
|
+
/** `variables` is a user-keyed map; its keys must survive case conversion. */
|
|
30
|
+
const doNotConvertKeys = [
|
|
31
|
+
'variables',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const fieldsToSend = [
|
|
35
|
+
...getShallowFieldsToSendFromZodSchema(queueMemberSchema),
|
|
36
|
+
// injected by preRequestHandler; not part of the form, so not in the schema
|
|
37
|
+
'queueId',
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const defaultSingleObjectCommunication = {
|
|
41
|
+
destination: '',
|
|
42
|
+
display: '',
|
|
43
|
+
priority: 0,
|
|
44
|
+
type: {},
|
|
45
|
+
resource: {},
|
|
46
|
+
description: '',
|
|
47
|
+
dtmf: '',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const mapDefaultCommunications = (item: ApiParams) => {
|
|
51
|
+
const copy = deepCopy(item);
|
|
52
|
+
return copy.communications
|
|
53
|
+
? copy.communications.map((comm: ApiParams) => ({
|
|
54
|
+
...defaultSingleObjectCommunication,
|
|
55
|
+
...comm,
|
|
56
|
+
}))
|
|
57
|
+
: [];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* NB: communications are deliberately sent whole rather than through a
|
|
62
|
+
* field whitelist. The original code looked like it whitelisted them, but
|
|
63
|
+
* called the curried `sanitize` with two arguments, so it built a function and
|
|
64
|
+
* threw it away — communications have always gone out complete. Applying the
|
|
65
|
+
* whitelist now would strip each communication's `id`, which the backend needs
|
|
66
|
+
* to update rather than recreate them.
|
|
67
|
+
*/
|
|
68
|
+
const preRequestHandler = (item: ApiParams) => {
|
|
69
|
+
const copy = deepCopy(item);
|
|
70
|
+
const variables = (copy.variables ?? []).reduce(
|
|
71
|
+
(acc: ApiParams, variable: ApiParams) => {
|
|
72
|
+
if (!variable.key) return acc;
|
|
73
|
+
acc[variable.key] = variable.value;
|
|
74
|
+
return acc;
|
|
75
|
+
},
|
|
76
|
+
{},
|
|
77
|
+
);
|
|
78
|
+
return {
|
|
79
|
+
...copy,
|
|
80
|
+
variables,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const getMembersList = async (params: ApiParams) => {
|
|
85
|
+
const listHandler = (items: ApiParams[]) => {
|
|
86
|
+
const copy = deepCopy(items);
|
|
87
|
+
return copy.map((item: ApiParams) => ({
|
|
88
|
+
...item,
|
|
89
|
+
communications: applyTransform(item, [
|
|
90
|
+
mapDefaultCommunications,
|
|
91
|
+
]),
|
|
92
|
+
}));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const {
|
|
96
|
+
page,
|
|
97
|
+
size,
|
|
98
|
+
search,
|
|
99
|
+
sort,
|
|
100
|
+
fields,
|
|
101
|
+
id,
|
|
102
|
+
parentId,
|
|
103
|
+
createdAt,
|
|
104
|
+
offeringAt,
|
|
105
|
+
bucket,
|
|
106
|
+
memberPriority,
|
|
107
|
+
stopCause,
|
|
108
|
+
agent,
|
|
109
|
+
attempts,
|
|
110
|
+
name,
|
|
111
|
+
destination,
|
|
112
|
+
} = applyTransform(params, [
|
|
113
|
+
merge(getDefaultGetParams()),
|
|
114
|
+
({ createdAt, offeringAt, from, to, cause, stopCause, ...rest }) => ({
|
|
115
|
+
...rest,
|
|
116
|
+
createdAt: normalizeDatetimeRange(
|
|
117
|
+
createdAt ??
|
|
118
|
+
(from != null || to != null
|
|
119
|
+
? {
|
|
120
|
+
from,
|
|
121
|
+
to,
|
|
122
|
+
}
|
|
123
|
+
: undefined),
|
|
124
|
+
),
|
|
125
|
+
offeringAt: normalizeDatetimeRange(offeringAt),
|
|
126
|
+
stopCause: stopCause ?? cause,
|
|
127
|
+
}),
|
|
128
|
+
starToSearch('search'),
|
|
129
|
+
]);
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
const response = await getMemberService().searchMemberInQueue(
|
|
133
|
+
Number(parentId),
|
|
134
|
+
{
|
|
135
|
+
page,
|
|
136
|
+
size,
|
|
137
|
+
// the generated param is `q`; `search` is what the datalist store sends
|
|
138
|
+
q: search,
|
|
139
|
+
sort,
|
|
140
|
+
fields,
|
|
141
|
+
id,
|
|
142
|
+
bucketId: bucket,
|
|
143
|
+
stopCause,
|
|
144
|
+
agentId: agent,
|
|
145
|
+
'created_at.from': createdAt?.from,
|
|
146
|
+
'created_at.to': createdAt?.to,
|
|
147
|
+
'offering_at.from': offeringAt?.from,
|
|
148
|
+
'offering_at.to': offeringAt?.to,
|
|
149
|
+
'priority.from': memberPriority?.from,
|
|
150
|
+
'priority.to': memberPriority?.to,
|
|
151
|
+
'attempts.from': attempts?.from,
|
|
152
|
+
'attempts.to': attempts?.to,
|
|
153
|
+
name,
|
|
154
|
+
destination,
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
const { items, next } = applyTransform(response.data, [
|
|
158
|
+
snakeToCamel(doNotConvertKeys),
|
|
159
|
+
merge(getDefaultGetListResponse()),
|
|
160
|
+
]);
|
|
161
|
+
return {
|
|
162
|
+
items: applyTransform(items, [
|
|
163
|
+
listHandler,
|
|
164
|
+
]),
|
|
165
|
+
next,
|
|
166
|
+
};
|
|
167
|
+
} catch (err) {
|
|
168
|
+
throw applyTransform(err, [
|
|
169
|
+
notify,
|
|
170
|
+
]);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const getMember = async ({ parentId, itemId: id }: NestedGetItemParams) => {
|
|
175
|
+
const responseHandler = (response: ApiParams) => {
|
|
176
|
+
const copy = deepCopy(response);
|
|
177
|
+
let variables: ApiParams[] = [];
|
|
178
|
+
if (copy.variables) {
|
|
179
|
+
variables = Object.keys(copy.variables).map((key) => ({
|
|
180
|
+
key,
|
|
181
|
+
value: copy.variables[key],
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
const communications = mapDefaultCommunications(copy);
|
|
185
|
+
return {
|
|
186
|
+
...response,
|
|
187
|
+
variables,
|
|
188
|
+
communications,
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
try {
|
|
193
|
+
const response = await getMemberService().readMember(
|
|
194
|
+
String(parentId),
|
|
195
|
+
String(id),
|
|
196
|
+
);
|
|
197
|
+
return applyTransform(response.data, [
|
|
198
|
+
snakeToCamel(doNotConvertKeys),
|
|
199
|
+
responseHandler,
|
|
200
|
+
]);
|
|
201
|
+
} catch (err) {
|
|
202
|
+
throw applyTransform(err, [
|
|
203
|
+
notify,
|
|
204
|
+
]);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const addMember = async ({ parentId, itemInstance }: NestedAddItemParams) => {
|
|
209
|
+
const item = applyTransform(itemInstance, [
|
|
210
|
+
preRequestHandler,
|
|
211
|
+
sanitize(fieldsToSend),
|
|
212
|
+
camelToSnake(doNotConvertKeys),
|
|
213
|
+
]);
|
|
214
|
+
try {
|
|
215
|
+
const response = await getMemberService().createMember(
|
|
216
|
+
String(parentId),
|
|
217
|
+
item,
|
|
218
|
+
);
|
|
219
|
+
return applyTransform(response.data, [
|
|
220
|
+
snakeToCamel(doNotConvertKeys),
|
|
221
|
+
]);
|
|
222
|
+
} catch (err) {
|
|
223
|
+
throw applyTransform(err, [
|
|
224
|
+
notify,
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const updateMember = async ({
|
|
230
|
+
itemInstance,
|
|
231
|
+
itemId: id,
|
|
232
|
+
parentId,
|
|
233
|
+
}: NestedUpdateItemParams) => {
|
|
234
|
+
const body = applyTransform(itemInstance, [
|
|
235
|
+
preRequestHandler,
|
|
236
|
+
sanitize(fieldsToSend),
|
|
237
|
+
camelToSnake(doNotConvertKeys),
|
|
238
|
+
]);
|
|
239
|
+
try {
|
|
240
|
+
const response = await getMemberService().updateMember(
|
|
241
|
+
String(parentId),
|
|
242
|
+
String(id),
|
|
243
|
+
body,
|
|
244
|
+
);
|
|
245
|
+
return applyTransform(response.data, [
|
|
246
|
+
snakeToCamel(doNotConvertKeys),
|
|
247
|
+
]);
|
|
248
|
+
} catch (err) {
|
|
249
|
+
throw applyTransform(err, [
|
|
250
|
+
notify,
|
|
251
|
+
]);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
const deleteMember = async ({ parentId, id }: NestedDeleteItemParams) => {
|
|
256
|
+
try {
|
|
257
|
+
const response = await getMemberService().deleteMember(
|
|
258
|
+
String(parentId),
|
|
259
|
+
String(id),
|
|
260
|
+
);
|
|
261
|
+
return applyTransform(response.data, []);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
throw applyTransform(err, [
|
|
264
|
+
notify,
|
|
265
|
+
]);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* How many members the current filter set would reset. A GET, so the nested
|
|
271
|
+
* range messages go out as dotted query keys — see mapResetMembersQuantityFilters.
|
|
272
|
+
*/
|
|
273
|
+
const getMembersQuantity = async ({
|
|
274
|
+
parentId,
|
|
275
|
+
filters,
|
|
276
|
+
}: {
|
|
277
|
+
parentId: ApiId;
|
|
278
|
+
filters?: ApiParams;
|
|
279
|
+
}) => {
|
|
280
|
+
const params = applyTransform(filters, [
|
|
281
|
+
mapResetMembersQuantityFilters,
|
|
282
|
+
starToSearch('q'),
|
|
283
|
+
]);
|
|
284
|
+
|
|
285
|
+
try {
|
|
286
|
+
const response = await getMemberService().resetMembersCount(
|
|
287
|
+
String(parentId),
|
|
288
|
+
params,
|
|
289
|
+
);
|
|
290
|
+
// int64, so the service types it as a string
|
|
291
|
+
return Number(response?.data?.count ?? 0);
|
|
292
|
+
} catch (err) {
|
|
293
|
+
throw applyTransform(err, [
|
|
294
|
+
notify,
|
|
295
|
+
]);
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const resetMembers = async ({
|
|
300
|
+
parentId,
|
|
301
|
+
filters,
|
|
302
|
+
}: {
|
|
303
|
+
parentId: ApiId;
|
|
304
|
+
filters?: ApiParams;
|
|
305
|
+
}) => {
|
|
306
|
+
const body = applyTransform(filters, [
|
|
307
|
+
mapResetMembersFilters,
|
|
308
|
+
starToSearch('q'),
|
|
309
|
+
]);
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
const response = await getMemberService().resetMembers(
|
|
313
|
+
String(parentId),
|
|
314
|
+
body,
|
|
315
|
+
);
|
|
316
|
+
return applyTransform(response.data, [
|
|
317
|
+
snakeToCamel(doNotConvertKeys),
|
|
318
|
+
]);
|
|
319
|
+
} catch (err) {
|
|
320
|
+
throw applyTransform(err, [
|
|
321
|
+
notify,
|
|
322
|
+
]);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
const resetActiveAttempts = async (body: ApiParams) => {
|
|
327
|
+
try {
|
|
328
|
+
const response = await getMemberService().resetActiveAttempts(body);
|
|
329
|
+
return applyTransform(response.data, []);
|
|
330
|
+
} catch (err) {
|
|
331
|
+
throw applyTransform(err, [
|
|
332
|
+
notify,
|
|
333
|
+
]);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
/** CSV import. Not part of the ApiModule contract — called straight from the popup. */
|
|
338
|
+
const addMembersBulk = async ({
|
|
339
|
+
parentId,
|
|
340
|
+
fileName,
|
|
341
|
+
items,
|
|
342
|
+
}: {
|
|
343
|
+
parentId: ApiId;
|
|
344
|
+
fileName: string;
|
|
345
|
+
items: ApiParams[];
|
|
346
|
+
}) => {
|
|
347
|
+
const body = {
|
|
348
|
+
parentId,
|
|
349
|
+
fileName,
|
|
350
|
+
items,
|
|
351
|
+
};
|
|
352
|
+
try {
|
|
353
|
+
const response = await getMemberService().createMemberBulk(
|
|
354
|
+
String(parentId),
|
|
355
|
+
body,
|
|
356
|
+
);
|
|
357
|
+
return applyTransform(response.data, [
|
|
358
|
+
snakeToCamel(doNotConvertKeys),
|
|
359
|
+
notify(({ callback }: ApiParams) =>
|
|
360
|
+
callback({
|
|
361
|
+
type: 'success',
|
|
362
|
+
text: 'Successfully added',
|
|
363
|
+
}),
|
|
364
|
+
),
|
|
365
|
+
]);
|
|
366
|
+
} catch (err) {
|
|
367
|
+
throw applyTransform(err, [
|
|
368
|
+
notify,
|
|
369
|
+
]);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Deletes by explicit ids, or by the current filter set when `id` is omitted.
|
|
375
|
+
* `withoutMembers: true` is carried over from the original as-is.
|
|
376
|
+
*/
|
|
377
|
+
const deleteMembersBulk = async ({
|
|
378
|
+
parentId,
|
|
379
|
+
id,
|
|
380
|
+
filters = {},
|
|
381
|
+
}: {
|
|
382
|
+
parentId: ApiId;
|
|
383
|
+
id?: ApiId[];
|
|
384
|
+
filters?: ApiParams;
|
|
385
|
+
}) => {
|
|
386
|
+
const created = range(filters.createdAt, filters.from, filters.to);
|
|
387
|
+
|
|
388
|
+
let body: ApiParams = {
|
|
389
|
+
id,
|
|
390
|
+
q: filters.search,
|
|
391
|
+
createdAt: created.from || created.to ? created : undefined,
|
|
392
|
+
priority: filters.memberPriority ?? filters.priority,
|
|
393
|
+
stopCause: filters.stopCause ?? filters.cause,
|
|
394
|
+
bucketId: filters.bucket,
|
|
395
|
+
withoutMembers: true,
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
body = applyTransform(body, [
|
|
399
|
+
camelToSnake(),
|
|
400
|
+
]);
|
|
401
|
+
|
|
402
|
+
try {
|
|
403
|
+
const response = await getMemberService().deleteMembers(
|
|
404
|
+
String(parentId),
|
|
405
|
+
body,
|
|
406
|
+
);
|
|
407
|
+
return applyTransform(response.data, []);
|
|
408
|
+
} catch (err) {
|
|
409
|
+
throw applyTransform(err, [
|
|
410
|
+
notify,
|
|
411
|
+
]);
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
export const QueueMembersAPI = {
|
|
416
|
+
getList: getMembersList,
|
|
417
|
+
getQuantity: getMembersQuantity,
|
|
418
|
+
get: getMember,
|
|
419
|
+
add: addMember,
|
|
420
|
+
addBulk: addMembersBulk,
|
|
421
|
+
update: updateMember,
|
|
422
|
+
delete: deleteMember,
|
|
423
|
+
deleteBulk: deleteMembersBulk,
|
|
424
|
+
resetMembers,
|
|
425
|
+
resetActiveAttempts,
|
|
426
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { getQueueResourcesService } from '@webitel/api-services/gen';
|
|
2
|
+
import { getShallowFieldsToSendFromZodSchema } from '@webitel/api-services/gen/utils';
|
|
3
|
+
import { queueResGroupSchema } 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
|
+
NestedUpdateItemParams,
|
|
21
|
+
} from '../_shared/types';
|
|
22
|
+
|
|
23
|
+
/** No `patch` — the service exposes none, and the tab never offered one. */
|
|
24
|
+
const fieldsToSend = [
|
|
25
|
+
...getShallowFieldsToSendFromZodSchema(queueResGroupSchema),
|
|
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 getQueueResGroupsList = async (params: ApiParams) => {
|
|
36
|
+
const { parentId, page, size, search, sort, fields, id } = applyTransform(
|
|
37
|
+
params,
|
|
38
|
+
[
|
|
39
|
+
merge(getDefaultGetParams()),
|
|
40
|
+
starToSearch('search'),
|
|
41
|
+
],
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const response = await getQueueResourcesService().searchQueueResourceGroup(
|
|
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 getQueueResGroup = async ({
|
|
73
|
+
parentId,
|
|
74
|
+
itemId: id,
|
|
75
|
+
domainId,
|
|
76
|
+
}: NestedGetItemParams & {
|
|
77
|
+
domainId?: string;
|
|
78
|
+
}) => {
|
|
79
|
+
try {
|
|
80
|
+
const response = await getQueueResourcesService().readQueueResourceGroup(
|
|
81
|
+
String(parentId),
|
|
82
|
+
String(id),
|
|
83
|
+
{
|
|
84
|
+
domainId,
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
return applyTransform(response.data, [
|
|
88
|
+
snakeToCamel(),
|
|
89
|
+
]);
|
|
90
|
+
} catch (err) {
|
|
91
|
+
throw applyTransform(err, [
|
|
92
|
+
notify,
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const addQueueResGroup = async ({
|
|
98
|
+
parentId,
|
|
99
|
+
itemInstance,
|
|
100
|
+
}: NestedAddItemParams) => {
|
|
101
|
+
const item = applyTransform(itemInstance, [
|
|
102
|
+
preRequestHandler(parentId),
|
|
103
|
+
sanitize(fieldsToSend),
|
|
104
|
+
camelToSnake(),
|
|
105
|
+
]);
|
|
106
|
+
try {
|
|
107
|
+
const response = await getQueueResourcesService().createQueueResourceGroup(
|
|
108
|
+
String(parentId),
|
|
109
|
+
item,
|
|
110
|
+
);
|
|
111
|
+
return applyTransform(response.data, [
|
|
112
|
+
snakeToCamel(),
|
|
113
|
+
]);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
throw applyTransform(err, [
|
|
116
|
+
notify,
|
|
117
|
+
]);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const updateQueueResGroup = async ({
|
|
122
|
+
parentId,
|
|
123
|
+
itemInstance,
|
|
124
|
+
itemId: id,
|
|
125
|
+
}: NestedUpdateItemParams) => {
|
|
126
|
+
const item = applyTransform(itemInstance, [
|
|
127
|
+
preRequestHandler(parentId),
|
|
128
|
+
sanitize(fieldsToSend),
|
|
129
|
+
camelToSnake(),
|
|
130
|
+
]);
|
|
131
|
+
try {
|
|
132
|
+
const response = await getQueueResourcesService().updateQueueResourceGroup(
|
|
133
|
+
String(parentId),
|
|
134
|
+
String(id),
|
|
135
|
+
item,
|
|
136
|
+
);
|
|
137
|
+
return applyTransform(response.data, [
|
|
138
|
+
snakeToCamel(),
|
|
139
|
+
]);
|
|
140
|
+
} catch (err) {
|
|
141
|
+
throw applyTransform(err, [
|
|
142
|
+
notify,
|
|
143
|
+
]);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const deleteQueueResGroup = async ({
|
|
148
|
+
parentId,
|
|
149
|
+
id,
|
|
150
|
+
domainId,
|
|
151
|
+
}: NestedDeleteItemParams & {
|
|
152
|
+
domainId?: string;
|
|
153
|
+
}) => {
|
|
154
|
+
try {
|
|
155
|
+
const response = await getQueueResourcesService().deleteQueueResourceGroup(
|
|
156
|
+
String(parentId),
|
|
157
|
+
String(id),
|
|
158
|
+
{
|
|
159
|
+
domainId,
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
return applyTransform(response.data, []);
|
|
163
|
+
} catch (err) {
|
|
164
|
+
throw applyTransform(err, [
|
|
165
|
+
notify,
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export const QueueResGroupsAPI = {
|
|
171
|
+
getList: getQueueResGroupsList,
|
|
172
|
+
get: getQueueResGroup,
|
|
173
|
+
add: addQueueResGroup,
|
|
174
|
+
update: updateQueueResGroup,
|
|
175
|
+
delete: deleteQueueResGroup,
|
|
176
|
+
};
|