@ikatec/digisac-api-sdk 4.10.0 → 4.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apis/categories/types.d.ts +1 -0
- package/dist/apis/categories/types.d.ts.map +1 -1
- package/dist/apis/contactBlockLists/ContactBlockListsApi.cjs +28 -0
- package/dist/apis/contactBlockLists/ContactBlockListsApi.cjs.map +1 -1
- package/dist/apis/contactBlockLists/ContactBlockListsApi.d.ts +24 -0
- package/dist/apis/contactBlockLists/ContactBlockListsApi.d.ts.map +1 -1
- package/dist/apis/contactBlockLists/ContactBlockListsApi.mjs +28 -0
- package/dist/apis/contactBlockLists/ContactBlockListsApi.mjs.map +1 -1
- package/dist/apis/contactBlockLists/types.d.ts +6 -1
- package/dist/apis/contactBlockLists/types.d.ts.map +1 -1
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.cjs +31 -1
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.cjs.map +1 -1
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.d.ts +28 -2
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.d.ts.map +1 -1
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.mjs +31 -1
- package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.mjs.map +1 -1
- package/dist/apis/contactBlockListsControls/types.d.ts +7 -0
- package/dist/apis/contactBlockListsControls/types.d.ts.map +1 -1
- package/dist/apis/distribution/DistributionApi.cjs +25 -0
- package/dist/apis/distribution/DistributionApi.cjs.map +1 -1
- package/dist/apis/distribution/DistributionApi.d.ts +20 -1
- package/dist/apis/distribution/DistributionApi.d.ts.map +1 -1
- package/dist/apis/distribution/DistributionApi.mjs +25 -0
- package/dist/apis/distribution/DistributionApi.mjs.map +1 -1
- package/dist/apis/distribution/types.d.ts +18 -1
- package/dist/apis/distribution/types.d.ts.map +1 -1
- package/dist/apis/integrations/IntegrationsApi.cjs +17 -0
- package/dist/apis/integrations/IntegrationsApi.cjs.map +1 -1
- package/dist/apis/integrations/IntegrationsApi.d.ts +15 -2
- package/dist/apis/integrations/IntegrationsApi.d.ts.map +1 -1
- package/dist/apis/integrations/IntegrationsApi.mjs +17 -0
- package/dist/apis/integrations/IntegrationsApi.mjs.map +1 -1
- package/dist/apis/integrations/types.d.ts +15 -6
- package/dist/apis/integrations/types.d.ts.map +1 -1
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.cjs +15 -0
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.cjs.map +1 -1
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.d.ts +13 -0
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.d.ts.map +1 -1
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.mjs +15 -0
- package/dist/apis/interactiveMessages/InteractiveMessagesApi.mjs.map +1 -1
- package/dist/apis/interactiveMessages/types.d.ts +8 -2
- package/dist/apis/interactiveMessages/types.d.ts.map +1 -1
- package/dist/apis/me/MeApi.cjs +36 -29
- package/dist/apis/me/MeApi.cjs.map +1 -1
- package/dist/apis/me/MeApi.d.ts +33 -22
- package/dist/apis/me/MeApi.d.ts.map +1 -1
- package/dist/apis/me/MeApi.mjs +36 -29
- package/dist/apis/me/MeApi.mjs.map +1 -1
- package/dist/apis/me/types.d.ts +67 -4
- package/dist/apis/me/types.d.ts.map +1 -1
- package/dist/apis/transcripts/TranscriptsApi.cjs +12 -2
- package/dist/apis/transcripts/TranscriptsApi.cjs.map +1 -1
- package/dist/apis/transcripts/TranscriptsApi.d.ts +11 -5
- package/dist/apis/transcripts/TranscriptsApi.d.ts.map +1 -1
- package/dist/apis/transcripts/TranscriptsApi.mjs +12 -2
- package/dist/apis/transcripts/TranscriptsApi.mjs.map +1 -1
- package/dist/apis/transcripts/types.d.ts +4 -0
- package/dist/apis/transcripts/types.d.ts.map +1 -1
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.cjs +52 -0
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.cjs.map +1 -1
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.d.ts +45 -2
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.d.ts.map +1 -1
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.mjs +52 -0
- package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.mjs.map +1 -1
- package/dist/apis/whatsappBusinessTemplates/types.d.ts +34 -1
- package/dist/apis/whatsappBusinessTemplates/types.d.ts.map +1 -1
- package/dist/core/BaseCrudApi.cjs +3 -1
- package/dist/core/BaseCrudApi.cjs.map +1 -1
- package/dist/core/BaseCrudApi.d.ts +6 -4
- package/dist/core/BaseCrudApi.d.ts.map +1 -1
- package/dist/core/BaseCrudApi.mjs +3 -1
- package/dist/core/BaseCrudApi.mjs.map +1 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/apis/categories/types.ts +1 -0
- package/src/apis/contactBlockLists/ContactBlockListsApi.test.ts +57 -0
- package/src/apis/contactBlockLists/ContactBlockListsApi.ts +44 -0
- package/src/apis/contactBlockLists/types.ts +6 -1
- package/src/apis/contactBlockListsControls/ContactBlockListsControlsApi.test.ts +48 -0
- package/src/apis/contactBlockListsControls/ContactBlockListsControlsApi.ts +49 -2
- package/src/apis/contactBlockListsControls/types.ts +7 -0
- package/src/apis/distribution/DistributionApi.test.ts +65 -0
- package/src/apis/distribution/DistributionApi.ts +39 -1
- package/src/apis/distribution/types.ts +17 -1
- package/src/apis/integrations/IntegrationsApi.test.ts +42 -0
- package/src/apis/integrations/IntegrationsApi.ts +35 -2
- package/src/apis/integrations/types.ts +25 -6
- package/src/apis/interactiveMessages/InteractiveMessagesApi.test.ts +59 -0
- package/src/apis/interactiveMessages/InteractiveMessagesApi.ts +26 -0
- package/src/apis/interactiveMessages/types.ts +8 -2
- package/src/apis/me/MeApi.test.ts +44 -0
- package/src/apis/me/MeApi.ts +83 -28
- package/src/apis/me/types.ts +75 -4
- package/src/apis/payloads.test-d.ts +94 -2
- package/src/apis/transcripts/TranscriptsApi.test.ts +14 -21
- package/src/apis/transcripts/TranscriptsApi.ts +15 -6
- package/src/apis/transcripts/types.ts +4 -0
- package/src/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.test.ts +86 -0
- package/src/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.ts +75 -1
- package/src/apis/whatsappBusinessTemplates/types.ts +38 -1
- package/src/core/BaseCrudApi.test-d.ts +11 -1
- package/src/core/BaseCrudApi.ts +15 -6
- package/src/core/types.ts +4 -2
|
@@ -5,7 +5,8 @@ export type WhatsappBusinessTemplateComponentType = 'HEADER' | 'BODY' | 'FOOTER'
|
|
|
5
5
|
export type WhatsappBusinessTemplateHeaderFormat = 'TEXT' | 'IMAGE' | 'VIDEO' | 'DOCUMENT';
|
|
6
6
|
export type WhatsappBusinessTemplateButton = {
|
|
7
7
|
type: string;
|
|
8
|
-
|
|
8
|
+
/** Overwritten by the backend on `REQUEST_CONTACT_INFO` buttons. */
|
|
9
|
+
text?: string;
|
|
9
10
|
url?: string;
|
|
10
11
|
params?: string[];
|
|
11
12
|
phone_number?: string;
|
|
@@ -37,17 +38,49 @@ export type WhatsappBusinessTemplate = {
|
|
|
37
38
|
createdAt: string;
|
|
38
39
|
updatedAt: string;
|
|
39
40
|
deletedAt: string | null;
|
|
41
|
+
/** Only the listing includes it by default; `getById` answers it with `include: ['fileExample']`. */
|
|
42
|
+
fileExample?: WhatsappBusinessTemplateFileExample | null;
|
|
43
|
+
service?: Record<string, unknown>;
|
|
44
|
+
account?: Record<string, unknown>;
|
|
45
|
+
};
|
|
46
|
+
/** The media example of a template with a media header. */
|
|
47
|
+
export type WhatsappBusinessTemplateFileExample = Record<string, unknown>;
|
|
48
|
+
/** The media example sent on create/update (`base64Url` as a data URL). */
|
|
49
|
+
export type WhatsappBusinessTemplateFileExampleInput = {
|
|
50
|
+
fileName: string;
|
|
51
|
+
base64Url: string;
|
|
52
|
+
mimetype: string;
|
|
53
|
+
};
|
|
54
|
+
export type WhatsappBusinessTemplateHsmLimit = {
|
|
55
|
+
hsmLimit: number;
|
|
56
|
+
hsmUsedLimit: number;
|
|
57
|
+
/** The balance left (a number), or `true` when the account has no limit. */
|
|
58
|
+
hasLimit: number | boolean;
|
|
40
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* Stored locally (nothing goes to Meta until `sendToReview`). `status` is `''` for a draft and `namespace` is `''`
|
|
62
|
+
* until Meta answers — both are required by the database (500 without them).
|
|
63
|
+
*/
|
|
41
64
|
export type CreateWhatsappBusinessTemplatePayload = {
|
|
42
65
|
name: string;
|
|
43
66
|
internalName: string;
|
|
67
|
+
status: string;
|
|
68
|
+
namespace: string;
|
|
69
|
+
fileExample?: WhatsappBusinessTemplateFileExampleInput;
|
|
44
70
|
components: WhatsappBusinessTemplateComponent[];
|
|
45
71
|
serviceId: string;
|
|
46
72
|
messageType: WhatsappBusinessTemplateMessageType;
|
|
47
73
|
language: WhatsappBusinessTemplateLanguage;
|
|
48
74
|
category: WhatsappBusinessTemplateCategory;
|
|
49
75
|
};
|
|
76
|
+
/**
|
|
77
|
+
* The backend validates the same 7 fields of the create on the update (`name`, `internalName`, `components`,
|
|
78
|
+
* `serviceId`, `messageType`, `language`, `category`), but ignores `name`.
|
|
79
|
+
*/
|
|
50
80
|
export type UpdateWhatsappBusinessTemplatePayload = {
|
|
81
|
+
status?: string;
|
|
82
|
+
namespace?: string;
|
|
83
|
+
fileExample?: WhatsappBusinessTemplateFileExampleInput;
|
|
51
84
|
name?: string;
|
|
52
85
|
internalName?: string;
|
|
53
86
|
components?: WhatsappBusinessTemplateComponent[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/whatsappBusinessTemplates/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mCAAmC,GAAG,WAAW,GAAG,aAAa,CAAA;AAE7E,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAA;AAEpE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAAA;AAEzF,MAAM,MAAM,qCAAqC,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE5F,MAAM,MAAM,oCAAoC,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAA;AAE1F,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/whatsappBusinessTemplates/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mCAAmC,GAAG,WAAW,GAAG,aAAa,CAAA;AAE7E,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAA;AAEpE,MAAM,MAAM,gCAAgC,GAAG,gBAAgB,GAAG,WAAW,GAAG,SAAS,CAAA;AAEzF,MAAM,MAAM,qCAAqC,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE5F,MAAM,MAAM,oCAAoC,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAA;AAE1F,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,qCAAqC,CAAA;IAC3C,MAAM,CAAC,EAAE,oCAAoC,CAAA;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,CAAC,EAAE,8BAA8B,EAAE,CAAA;IAC1C,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,iCAAiC,EAAE,CAAA;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qGAAqG;IACrG,WAAW,CAAC,EAAE,mCAAmC,GAAG,IAAI,CAAA;IAExD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAED,2DAA2D;AAC3D,MAAM,MAAM,mCAAmC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzE,2EAA2E;AAC3E,MAAM,MAAM,wCAAwC,GAAG;IACrD,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,wCAAwC,CAAA;IACtD,UAAU,EAAE,iCAAiC,EAAE,CAAA;IAC/C,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,mCAAmC,CAAA;IAChD,QAAQ,EAAE,gCAAgC,CAAA;IAC1C,QAAQ,EAAE,gCAAgC,CAAA;CAC3C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,wCAAwC,CAAA;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,iCAAiC,EAAE,CAAA;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,mCAAmC,CAAA;IACjD,QAAQ,CAAC,EAAE,gCAAgC,CAAA;IAC3C,QAAQ,CAAC,EAAE,gCAAgC,CAAA;CAC5C,CAAA"}
|
|
@@ -4,7 +4,9 @@ const require_core_BaseReadApi = require('./BaseReadApi.cjs');
|
|
|
4
4
|
//#region src/core/BaseCrudApi.ts
|
|
5
5
|
/**
|
|
6
6
|
* Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.
|
|
7
|
-
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`)
|
|
7
|
+
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`);
|
|
8
|
+
* `TCreateResponse` and `TUpdateResponse` are what `create` and `updateById` resolve to, for the routes
|
|
9
|
+
* that do not answer the resource (an empty body, `{}`, another model).
|
|
8
10
|
*/
|
|
9
11
|
var BaseCrudApi = class extends require_core_BaseReadApi.BaseReadApi {
|
|
10
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseCrudApi.cjs","names":["BaseReadApi"],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import { BaseReadApi } from './BaseReadApi'\nimport type { CrudApi, ListQuery } from './types'\nexport type {\n WhereClause,\n IncludeItem,\n ListQuery,\n GetByIdQuery,\n Paginated,\n HasGetMany,\n HasGetById,\n HasCreate,\n HasUpdateById,\n HasDeleteById,\n CrudApi,\n} from './types'\n\n/**\n * Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.\n * `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`).\n */\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n TDeleteResponse = TResponse,\n>\n extends BaseReadApi<TResponse, TQuery>\n implements
|
|
1
|
+
{"version":3,"file":"BaseCrudApi.cjs","names":["BaseReadApi"],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import { BaseReadApi } from './BaseReadApi'\nimport type { CrudApi, ListQuery } from './types'\nexport type {\n WhereClause,\n IncludeItem,\n ListQuery,\n GetByIdQuery,\n Paginated,\n HasGetMany,\n HasGetById,\n HasCreate,\n HasUpdateById,\n HasDeleteById,\n CrudApi,\n} from './types'\n\n/**\n * Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.\n * `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`);\n * `TCreateResponse` and `TUpdateResponse` are what `create` and `updateById` resolve to, for the routes\n * that do not answer the resource (an empty body, `{}`, another model).\n */\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n TDeleteResponse = TResponse,\n TCreateResponse = TResponse,\n TUpdateResponse = TResponse,\n>\n extends BaseReadApi<TResponse, TQuery>\n implements\n CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse, TCreateResponse, TUpdateResponse>\n{\n /**\n * Creates a new resource.\n * @permissions $resourceName.create\n */\n create(body: TCreate, headers?: Record<string, string>): Promise<TCreateResponse> {\n return this.client.post<TCreateResponse, TCreate>(this.basePath, body, headers)\n }\n\n /**\n * Updates an existing resource by ID.\n * @permissions $resourceName.update\n */\n updateById(\n id: string,\n body: TUpdate,\n headers?: Record<string, string>,\n ): Promise<TUpdateResponse> {\n return this.client.put<TUpdateResponse, TUpdate>(`${this.basePath}/${id}`, body, headers)\n }\n\n /**\n * Deletes a resource by ID.\n * @permissions $resourceName.destroy\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TDeleteResponse> {\n return this.client.delete<TDeleteResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAa,cAAb,cASUA,qCAGV;;;;;CAKE,OAAO,MAAe,SAA4D;AAChF,SAAO,KAAK,OAAO,KAA+B,KAAK,UAAU,MAAM,QAAQ;;;;;;CAOjF,WACE,IACA,MACA,SAC0B;AAC1B,SAAO,KAAK,OAAO,IAA8B,GAAG,KAAK,SAAS,GAAG,MAAM,MAAM,QAAQ;;;;;;CAO3F,WAAW,IAAY,SAA4D;AACjF,SAAO,KAAK,OAAO,OAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
|
|
@@ -3,19 +3,21 @@ import type { CrudApi, ListQuery } from './types';
|
|
|
3
3
|
export type { WhereClause, IncludeItem, ListQuery, GetByIdQuery, Paginated, HasGetMany, HasGetById, HasCreate, HasUpdateById, HasDeleteById, CrudApi, } from './types';
|
|
4
4
|
/**
|
|
5
5
|
* Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.
|
|
6
|
-
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`)
|
|
6
|
+
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`);
|
|
7
|
+
* `TCreateResponse` and `TUpdateResponse` are what `create` and `updateById` resolve to, for the routes
|
|
8
|
+
* that do not answer the resource (an empty body, `{}`, another model).
|
|
7
9
|
*/
|
|
8
|
-
export declare class BaseCrudApi<TResponse, TCreate, TUpdate = TCreate, TQuery extends ListQuery<TResponse> = ListQuery<TResponse>, TDeleteResponse = TResponse> extends BaseReadApi<TResponse, TQuery> implements CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse> {
|
|
10
|
+
export declare class BaseCrudApi<TResponse, TCreate, TUpdate = TCreate, TQuery extends ListQuery<TResponse> = ListQuery<TResponse>, TDeleteResponse = TResponse, TCreateResponse = TResponse, TUpdateResponse = TResponse> extends BaseReadApi<TResponse, TQuery> implements CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse, TCreateResponse, TUpdateResponse> {
|
|
9
11
|
/**
|
|
10
12
|
* Creates a new resource.
|
|
11
13
|
* @permissions $resourceName.create
|
|
12
14
|
*/
|
|
13
|
-
create(body: TCreate, headers?: Record<string, string>): Promise<
|
|
15
|
+
create(body: TCreate, headers?: Record<string, string>): Promise<TCreateResponse>;
|
|
14
16
|
/**
|
|
15
17
|
* Updates an existing resource by ID.
|
|
16
18
|
* @permissions $resourceName.update
|
|
17
19
|
*/
|
|
18
|
-
updateById(id: string, body: TUpdate, headers?: Record<string, string>): Promise<
|
|
20
|
+
updateById(id: string, body: TUpdate, headers?: Record<string, string>): Promise<TUpdateResponse>;
|
|
19
21
|
/**
|
|
20
22
|
* Deletes a resource by ID.
|
|
21
23
|
* @permissions $resourceName.destroy
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseCrudApi.d.ts","sourceRoot":"","sources":["../../src/core/BaseCrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,YAAY,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,OAAO,GACR,MAAM,SAAS,CAAA;AAEhB
|
|
1
|
+
{"version":3,"file":"BaseCrudApi.d.ts","sourceRoot":"","sources":["../../src/core/BaseCrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,YAAY,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,aAAa,EACb,OAAO,GACR,MAAM,SAAS,CAAA;AAEhB;;;;;GAKG;AACH,qBAAa,WAAW,CACtB,SAAS,EACT,OAAO,EACP,OAAO,GAAG,OAAO,EACjB,MAAM,SAAS,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,EAC1D,eAAe,GAAG,SAAS,EAC3B,eAAe,GAAG,SAAS,EAC3B,eAAe,GAAG,SAAS,CAE3B,SAAQ,WAAW,CAAC,SAAS,EAAE,MAAM,CACrC,YACE,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,CAAC;IAEjG;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjF;;;OAGG;IACH,UAAU,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAI3B;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAGnF"}
|
|
@@ -3,7 +3,9 @@ import { BaseReadApi } from "./BaseReadApi.mjs";
|
|
|
3
3
|
//#region src/core/BaseCrudApi.ts
|
|
4
4
|
/**
|
|
5
5
|
* Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.
|
|
6
|
-
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`)
|
|
6
|
+
* `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`);
|
|
7
|
+
* `TCreateResponse` and `TUpdateResponse` are what `create` and `updateById` resolve to, for the routes
|
|
8
|
+
* that do not answer the resource (an empty body, `{}`, another model).
|
|
7
9
|
*/
|
|
8
10
|
var BaseCrudApi = class extends BaseReadApi {
|
|
9
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseCrudApi.mjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import { BaseReadApi } from './BaseReadApi'\nimport type { CrudApi, ListQuery } from './types'\nexport type {\n WhereClause,\n IncludeItem,\n ListQuery,\n GetByIdQuery,\n Paginated,\n HasGetMany,\n HasGetById,\n HasCreate,\n HasUpdateById,\n HasDeleteById,\n CrudApi,\n} from './types'\n\n/**\n * Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.\n * `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`).\n */\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n TDeleteResponse = TResponse,\n>\n extends BaseReadApi<TResponse, TQuery>\n implements
|
|
1
|
+
{"version":3,"file":"BaseCrudApi.mjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import { BaseReadApi } from './BaseReadApi'\nimport type { CrudApi, ListQuery } from './types'\nexport type {\n WhereClause,\n IncludeItem,\n ListQuery,\n GetByIdQuery,\n Paginated,\n HasGetMany,\n HasGetById,\n HasCreate,\n HasUpdateById,\n HasDeleteById,\n CrudApi,\n} from './types'\n\n/**\n * Generic CRUD resource: the reads of `BaseReadApi` plus `create`, `updateById` and `deleteById`.\n * `TDeleteResponse` is what `deleteById` resolves to (most routes answer the text `'OK'`);\n * `TCreateResponse` and `TUpdateResponse` are what `create` and `updateById` resolve to, for the routes\n * that do not answer the resource (an empty body, `{}`, another model).\n */\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n TDeleteResponse = TResponse,\n TCreateResponse = TResponse,\n TUpdateResponse = TResponse,\n>\n extends BaseReadApi<TResponse, TQuery>\n implements\n CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse, TCreateResponse, TUpdateResponse>\n{\n /**\n * Creates a new resource.\n * @permissions $resourceName.create\n */\n create(body: TCreate, headers?: Record<string, string>): Promise<TCreateResponse> {\n return this.client.post<TCreateResponse, TCreate>(this.basePath, body, headers)\n }\n\n /**\n * Updates an existing resource by ID.\n * @permissions $resourceName.update\n */\n updateById(\n id: string,\n body: TUpdate,\n headers?: Record<string, string>,\n ): Promise<TUpdateResponse> {\n return this.client.put<TUpdateResponse, TUpdate>(`${this.basePath}/${id}`, body, headers)\n }\n\n /**\n * Deletes a resource by ID.\n * @permissions $resourceName.destroy\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TDeleteResponse> {\n return this.client.delete<TDeleteResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAa,cAAb,cASU,YAGV;;;;;CAKE,OAAO,MAAe,SAA4D;AAChF,SAAO,KAAK,OAAO,KAA+B,KAAK,UAAU,MAAM,QAAQ;;;;;;CAOjF,WACE,IACA,MACA,SAC0B;AAC1B,SAAO,KAAK,OAAO,IAA8B,GAAG,KAAK,SAAS,GAAG,MAAM,MAAM,QAAQ;;;;;;CAO3F,WAAW,IAAY,SAA4D;AACjF,SAAO,KAAK,OAAO,OAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -107,6 +107,6 @@ export interface HasUpdateById<TResponse, TUpdate> {
|
|
|
107
107
|
export interface HasDeleteById<TResponse> {
|
|
108
108
|
deleteById(id: string, headers?: Record<string, string>): Promise<TResponse>;
|
|
109
109
|
}
|
|
110
|
-
export type CrudApi<TResponse, TCreate, TUpdate = TCreate, TQuery extends ListQuery<TResponse> = ListQuery<TResponse>, TDeleteResponse = TResponse> = HasGetMany<TResponse, TQuery> & HasGetById<TResponse> & HasCreate<
|
|
110
|
+
export type CrudApi<TResponse, TCreate, TUpdate = TCreate, TQuery extends ListQuery<TResponse> = ListQuery<TResponse>, TDeleteResponse = TResponse, TCreateResponse = TResponse, TUpdateResponse = TResponse> = HasGetMany<TResponse, TQuery> & HasGetById<TResponse> & HasCreate<TCreateResponse, TCreate> & HasUpdateById<TUpdateResponse, TUpdate> & HasDeleteById<TDeleteResponse>;
|
|
111
111
|
export {};
|
|
112
112
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { ContactBlockListsApi } from './ContactBlockListsApi'
|
|
3
|
+
import type { ApiClient } from '../../core/ApiClient'
|
|
4
|
+
|
|
5
|
+
// ── Mock client factory ──────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
function createMockClient(): ApiClient {
|
|
8
|
+
return {
|
|
9
|
+
setAccessToken: vi.fn().mockReturnThis(),
|
|
10
|
+
request: vi.fn(),
|
|
11
|
+
get: vi.fn(),
|
|
12
|
+
post: vi.fn(),
|
|
13
|
+
put: vi.fn(),
|
|
14
|
+
patch: vi.fn(),
|
|
15
|
+
delete: vi.fn(),
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ── Tests ────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
describe('ContactBlockListsApi', () => {
|
|
22
|
+
let client: ReturnType<typeof createMockClient>
|
|
23
|
+
let api: ContactBlockListsApi
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
client = createMockClient()
|
|
27
|
+
api = new ContactBlockListsApi(client)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
describe('count', () => {
|
|
31
|
+
it('calls client.get with /contact-block-lists/count when no query is provided', async () => {
|
|
32
|
+
vi.mocked(client.get).mockResolvedValue({ count: 3 })
|
|
33
|
+
await expect(api.count()).resolves.toEqual({ count: 3 })
|
|
34
|
+
expect(client.get).toHaveBeenCalledWith('/contact-block-lists/count', undefined)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('serializes the query and forwards custom headers', async () => {
|
|
38
|
+
const headers = { 'X-Custom': 'value' }
|
|
39
|
+
vi.mocked(client.get).mockResolvedValue({ count: 1 })
|
|
40
|
+
await api.count({ where: { name: 'QA' } }, headers)
|
|
41
|
+
const [url, sent] = vi.mocked(client.get).mock.calls[0] ?? []
|
|
42
|
+
expect(url).toContain('/contact-block-lists/count?')
|
|
43
|
+
expect(url).toContain('where')
|
|
44
|
+
expect(sent).toBe(headers)
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('create posts the name and the file of the CSV', async () => {
|
|
49
|
+
vi.mocked(client.post).mockResolvedValue({ id: 'list-1', status: 'ready' })
|
|
50
|
+
await api.create({ name: 'QA', fileId: 'file-1', defaultDDI: '55' })
|
|
51
|
+
expect(client.post).toHaveBeenCalledWith(
|
|
52
|
+
'/contact-block-lists',
|
|
53
|
+
{ name: 'QA', fileId: 'file-1', defaultDDI: '55' },
|
|
54
|
+
undefined,
|
|
55
|
+
)
|
|
56
|
+
})
|
|
57
|
+
})
|
|
@@ -7,6 +7,10 @@ import type {
|
|
|
7
7
|
UpdateContactBlockListPayload,
|
|
8
8
|
} from './types'
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Lists of numbers to block. A list is processed in the background after it is created (`status`
|
|
12
|
+
* `ready` → `done` or `error`). `getById` answers `null` for an unknown id.
|
|
13
|
+
*/
|
|
10
14
|
export class ContactBlockListsApi extends BaseCrudApi<
|
|
11
15
|
ContactBlockList,
|
|
12
16
|
CreateContactBlockListPayload,
|
|
@@ -18,6 +22,46 @@ export class ContactBlockListsApi extends BaseCrudApi<
|
|
|
18
22
|
super(client, '/contact-block-lists')
|
|
19
23
|
}
|
|
20
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Counts the block lists matching the query.
|
|
27
|
+
* @permissions contacts.view OR contacts.block
|
|
28
|
+
*/
|
|
29
|
+
count(
|
|
30
|
+
query?: ListQuery<ContactBlockList>,
|
|
31
|
+
headers?: Record<string, string>,
|
|
32
|
+
): Promise<{ count: number }> {
|
|
33
|
+
return this.client.get<{ count: number }>(
|
|
34
|
+
`${this.basePath}/count${this.toQueryString(query)}`,
|
|
35
|
+
headers,
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a block list from a CSV uploaded with `FilesApi.createToUpload` (`attachedType:
|
|
41
|
+
* 'contact_block_list.file'` — with any other type the list is never processed). The CSV is
|
|
42
|
+
* comma-separated with the columns `ddi,number` (an empty DDI takes `defaultDDI`); invalid numbers are
|
|
43
|
+
* skipped. Resolves the list with `status: 'ready'`.
|
|
44
|
+
* @permissions contacts.view OR contacts.block
|
|
45
|
+
*/
|
|
46
|
+
override create(
|
|
47
|
+
body: CreateContactBlockListPayload,
|
|
48
|
+
headers?: Record<string, string>,
|
|
49
|
+
): Promise<ContactBlockList> {
|
|
50
|
+
return super.create(body, headers)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Updates a block list. `name` is required by the backend (400 without it). An unknown id answers 500.
|
|
55
|
+
* @permissions contacts.view OR contacts.update OR contacts.block
|
|
56
|
+
*/
|
|
57
|
+
override updateById(
|
|
58
|
+
id: string,
|
|
59
|
+
body: UpdateContactBlockListPayload,
|
|
60
|
+
headers?: Record<string, string>,
|
|
61
|
+
): Promise<ContactBlockList> {
|
|
62
|
+
return super.updateById(id, body, headers)
|
|
63
|
+
}
|
|
64
|
+
|
|
21
65
|
/**
|
|
22
66
|
* Deletes a block list and its numbers. Resolves the text `'OK'`; a list being processed (or with
|
|
23
67
|
* a block/unblock in progress) answers 500.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { File } from '../files/types'
|
|
1
2
|
import type { User } from '../users/types'
|
|
2
3
|
|
|
3
4
|
export type ContactBlockListStatus = 'ready' | 'processing' | 'done' | 'error'
|
|
@@ -17,9 +18,11 @@ export type ContactBlockList = {
|
|
|
17
18
|
deletedAt: string | null
|
|
18
19
|
// relationships
|
|
19
20
|
user?: User
|
|
21
|
+
/** The uploaded CSV (`include: ['importFile']`). */
|
|
22
|
+
importFile?: File
|
|
20
23
|
}
|
|
21
24
|
|
|
22
|
-
export type ContactBlockListRelationships = 'user'
|
|
25
|
+
export type ContactBlockListRelationships = 'user' | 'importFile'
|
|
23
26
|
|
|
24
27
|
export type CreateContactBlockListPayload = {
|
|
25
28
|
name: string
|
|
@@ -29,7 +32,9 @@ export type CreateContactBlockListPayload = {
|
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
export type UpdateContactBlockListPayload = {
|
|
35
|
+
/** Required by the backend (400 without it), even to change only `defaultDDI`. */
|
|
32
36
|
name?: string
|
|
37
|
+
/** @deprecated Ignored by the backend: the numbers come only from the CSV of the create. */
|
|
33
38
|
contacts?: string[]
|
|
34
39
|
defaultDDI?: string | null
|
|
35
40
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { ContactBlockListsControlsApi } from './ContactBlockListsControlsApi'
|
|
3
|
+
import type { ApiClient } from '../../core/ApiClient'
|
|
4
|
+
|
|
5
|
+
// ── Mock client factory ──────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
function createMockClient(): ApiClient {
|
|
8
|
+
return {
|
|
9
|
+
setAccessToken: vi.fn().mockReturnThis(),
|
|
10
|
+
request: vi.fn(),
|
|
11
|
+
get: vi.fn(),
|
|
12
|
+
post: vi.fn(),
|
|
13
|
+
put: vi.fn(),
|
|
14
|
+
patch: vi.fn(),
|
|
15
|
+
delete: vi.fn(),
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ── Tests ────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
describe('ContactBlockListsControlsApi', () => {
|
|
22
|
+
let client: ReturnType<typeof createMockClient>
|
|
23
|
+
let api: ContactBlockListsControlsApi
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
client = createMockClient()
|
|
27
|
+
api = new ContactBlockListsControlsApi(client)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('count calls client.get with /contact-block-lists-controls/count', async () => {
|
|
31
|
+
vi.mocked(client.get).mockResolvedValue({ count: 2 })
|
|
32
|
+
await expect(api.count()).resolves.toEqual({ count: 2 })
|
|
33
|
+
expect(client.get).toHaveBeenCalledWith('/contact-block-lists-controls/count', undefined)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('create posts the runs and resolves with no body', async () => {
|
|
37
|
+
vi.mocked(client.post).mockResolvedValue(undefined)
|
|
38
|
+
const body = {
|
|
39
|
+
reason: 'QA',
|
|
40
|
+
servicesIds: ['svc-1'],
|
|
41
|
+
contactBlockListsIds: ['list-1'],
|
|
42
|
+
action: 'block' as const,
|
|
43
|
+
revertExceptions: false,
|
|
44
|
+
}
|
|
45
|
+
await expect(api.create(body)).resolves.toBeUndefined()
|
|
46
|
+
expect(client.post).toHaveBeenCalledWith('/contact-block-lists-controls', body, undefined)
|
|
47
|
+
})
|
|
48
|
+
})
|
|
@@ -7,19 +7,66 @@ import type {
|
|
|
7
7
|
UpdateContactBlockListsControlPayload,
|
|
8
8
|
} from './types'
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Block/unblock runs of block lists over connections. A run blocks (or unblocks) the contacts of the
|
|
12
|
+
* connection whose numbers are in the list, in the background, and blocking closes their open tickets.
|
|
13
|
+
* `getById` answers `null` for an unknown id.
|
|
14
|
+
*/
|
|
10
15
|
export class ContactBlockListsControlsApi extends BaseCrudApi<
|
|
11
16
|
ContactBlockListsControl,
|
|
12
17
|
CreateContactBlockListsControlPayload,
|
|
13
18
|
UpdateContactBlockListsControlPayload,
|
|
14
19
|
ListQuery<ContactBlockListsControl>,
|
|
15
|
-
'OK'
|
|
20
|
+
'OK',
|
|
21
|
+
void
|
|
16
22
|
> {
|
|
17
23
|
constructor(client: ApiClient) {
|
|
18
24
|
super(client, '/contact-block-lists-controls')
|
|
19
25
|
}
|
|
20
26
|
|
|
21
27
|
/**
|
|
22
|
-
*
|
|
28
|
+
* Counts the runs matching the query.
|
|
29
|
+
* @permissions contacts.view OR contacts.block
|
|
30
|
+
*/
|
|
31
|
+
count(
|
|
32
|
+
query?: ListQuery<ContactBlockListsControl>,
|
|
33
|
+
headers?: Record<string, string>,
|
|
34
|
+
): Promise<{ count: number }> {
|
|
35
|
+
return this.client.get<{ count: number }>(
|
|
36
|
+
`${this.basePath}/count${this.toQueryString(query)}`,
|
|
37
|
+
headers,
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Starts the runs: one per connection × list of the body, all with the same `reason`. Resolves with no
|
|
43
|
+
* body — find the runs with `getMany` by `reason`.
|
|
44
|
+
* @permissions contacts.view OR contacts.block
|
|
45
|
+
*/
|
|
46
|
+
override create(
|
|
47
|
+
body: CreateContactBlockListsControlPayload,
|
|
48
|
+
headers?: Record<string, string>,
|
|
49
|
+
): Promise<void> {
|
|
50
|
+
return super.create(body, headers)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Updates a run. The backend requires `reason`, `servicesIds`, `contactBlockListsIds` and `action` (400
|
|
55
|
+
* without them), but ignores the ids, and a new `action` does not run anything again. An unknown id
|
|
56
|
+
* answers 500.
|
|
57
|
+
* @permissions contacts.view OR contacts.update OR contacts.block
|
|
58
|
+
*/
|
|
59
|
+
override updateById(
|
|
60
|
+
id: string,
|
|
61
|
+
body: UpdateContactBlockListsControlPayload,
|
|
62
|
+
headers?: Record<string, string>,
|
|
63
|
+
): Promise<ContactBlockListsControl> {
|
|
64
|
+
return super.updateById(id, body, headers)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Deletes a block/unblock run. Resolves the text `'OK'`; it does not undo the contacts already
|
|
69
|
+
* blocked or unblocked.
|
|
23
70
|
* @permissions contacts.view OR contacts.destroy OR contacts.block
|
|
24
71
|
*/
|
|
25
72
|
override deleteById(id: string, headers?: Record<string, string>): Promise<'OK'> {
|
|
@@ -31,12 +31,19 @@ export type ContactBlockListsControl = {
|
|
|
31
31
|
export type ContactBlockListsControlRelationships = 'contactBlockList' | 'user' | 'service'
|
|
32
32
|
|
|
33
33
|
export type CreateContactBlockListsControlPayload = {
|
|
34
|
+
/** Unique in the account (409 when another run already has it). */
|
|
34
35
|
reason: string
|
|
35
36
|
servicesIds: string[]
|
|
36
37
|
contactBlockListsIds: string[]
|
|
37
38
|
action: ContactBlockListsControlAction
|
|
39
|
+
/**
|
|
40
|
+
* Applies the opposite action to the contacts of the connection that are NOT in the list: with `block`, it
|
|
41
|
+
* unblocks them; with `unblock`, it blocks all of them.
|
|
42
|
+
*/
|
|
43
|
+
revertExceptions?: boolean
|
|
38
44
|
}
|
|
39
45
|
|
|
46
|
+
/** The backend requires the four fields (400 without them); the ids are ignored. */
|
|
40
47
|
export type UpdateContactBlockListsControlPayload = {
|
|
41
48
|
reason?: string
|
|
42
49
|
servicesIds?: string[]
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
2
|
+
import { DistributionApi } from './DistributionApi'
|
|
3
|
+
import type { ApiClient } from '../../core/ApiClient'
|
|
4
|
+
|
|
5
|
+
// ── Mock client factory ──────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
function createMockClient(): ApiClient {
|
|
8
|
+
return {
|
|
9
|
+
setAccessToken: vi.fn().mockReturnThis(),
|
|
10
|
+
request: vi.fn(),
|
|
11
|
+
get: vi.fn(),
|
|
12
|
+
post: vi.fn(),
|
|
13
|
+
put: vi.fn(),
|
|
14
|
+
patch: vi.fn(),
|
|
15
|
+
delete: vi.fn(),
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ── Tests ────────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
describe('DistributionApi', () => {
|
|
22
|
+
let client: ReturnType<typeof createMockClient>
|
|
23
|
+
let api: DistributionApi
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
client = createMockClient()
|
|
27
|
+
api = new DistributionApi(client)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
describe('create', () => {
|
|
31
|
+
it('posts the body, links included, to /distribution', async () => {
|
|
32
|
+
vi.mocked(client.post).mockResolvedValue(undefined)
|
|
33
|
+
const body = { name: 'QA', maxNum: 1, redistributeAll: false, departments: [{ id: 'dep-1' }] }
|
|
34
|
+
const result = await api.create(body)
|
|
35
|
+
expect(client.post).toHaveBeenCalledWith('/distribution', body, undefined)
|
|
36
|
+
expect(result).toBeUndefined()
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('updateById', () => {
|
|
41
|
+
it('sends the id in the body too, which is where the backend reads it', async () => {
|
|
42
|
+
vi.mocked(client.put).mockResolvedValue([])
|
|
43
|
+
await api.updateById('dist-1', { name: 'QA', roles: [{ id: 'role-1' }] })
|
|
44
|
+
expect(client.put).toHaveBeenCalledWith(
|
|
45
|
+
'/distribution/dist-1',
|
|
46
|
+
{ name: 'QA', roles: [{ id: 'role-1' }], id: 'dist-1' },
|
|
47
|
+
undefined,
|
|
48
|
+
)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('keeps the id of the URL over an id of the body and forwards custom headers', async () => {
|
|
52
|
+
const headers = { 'X-Custom': 'value' }
|
|
53
|
+
await api.updateById('dist-1', { id: 'other' } as never, headers)
|
|
54
|
+
expect(client.put).toHaveBeenCalledWith('/distribution/dist-1', { id: 'dist-1' }, headers)
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
describe('deleteById', () => {
|
|
59
|
+
it('calls client.delete with /distribution/:id', async () => {
|
|
60
|
+
vi.mocked(client.delete).mockResolvedValue(undefined)
|
|
61
|
+
await api.deleteById('dist-1')
|
|
62
|
+
expect(client.delete).toHaveBeenCalledWith('/distribution/dist-1', undefined)
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
})
|
|
@@ -1,19 +1,57 @@
|
|
|
1
1
|
import type { ApiClient } from '../../core/ApiClient'
|
|
2
2
|
import type { ListQuery } from '../../core/types'
|
|
3
3
|
import { BaseCrudApi } from '../../core/BaseCrudApi'
|
|
4
|
+
import type { Department } from '../departments/types'
|
|
4
5
|
import type { Distribution, CreateDistributionPayload, UpdateDistributionPayload } from './types'
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Ticket distribution rules. `getById` answers `null` for an unknown id and always includes `departments` and
|
|
9
|
+
* `roles` (the query is ignored).
|
|
10
|
+
*/
|
|
6
11
|
export class DistributionApi extends BaseCrudApi<
|
|
7
12
|
Distribution,
|
|
8
13
|
CreateDistributionPayload,
|
|
9
14
|
UpdateDistributionPayload,
|
|
10
15
|
ListQuery<Distribution>,
|
|
11
|
-
void
|
|
16
|
+
void,
|
|
17
|
+
Distribution | undefined,
|
|
18
|
+
Distribution | Department[]
|
|
12
19
|
> {
|
|
13
20
|
constructor(client: ApiClient) {
|
|
14
21
|
super(client, '/distribution')
|
|
15
22
|
}
|
|
16
23
|
|
|
24
|
+
/**
|
|
25
|
+
* Creates a distribution. Resolves the distribution (without `departments`/`roles`), or no body
|
|
26
|
+
* (`undefined`) when `departments` is sent — find it by name with `getMany` in that case.
|
|
27
|
+
* @permissions distribution.create
|
|
28
|
+
*/
|
|
29
|
+
override create(
|
|
30
|
+
body: CreateDistributionPayload,
|
|
31
|
+
headers?: Record<string, string>,
|
|
32
|
+
): Promise<Distribution | undefined> {
|
|
33
|
+
return super.create(body, headers)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Updates a distribution. The backend reads the id from the body, so it is sent there too. It replaces
|
|
38
|
+
* the links: omitting `roles` or `departments` clears them. Resolves the stored distribution (with
|
|
39
|
+
* `deletedAt`, without the links) or, when `departments` is sent, the updated departments. An unknown id
|
|
40
|
+
* answers 500.
|
|
41
|
+
* @permissions distribution.view OR distribution.update
|
|
42
|
+
*/
|
|
43
|
+
override updateById(
|
|
44
|
+
id: string,
|
|
45
|
+
body: UpdateDistributionPayload,
|
|
46
|
+
headers?: Record<string, string>,
|
|
47
|
+
): Promise<Distribution | Department[]> {
|
|
48
|
+
return this.client.put<Distribution | Department[], UpdateDistributionPayload & { id: string }>(
|
|
49
|
+
`${this.basePath}/${id}`,
|
|
50
|
+
{ ...body, id },
|
|
51
|
+
headers,
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
17
55
|
/**
|
|
18
56
|
* Deletes a distribution. Resolves with no body, also for an unknown id (200).
|
|
19
57
|
* @permissions distribution.view OR distribution.destroy
|