@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.
Files changed (104) hide show
  1. package/dist/apis/categories/types.d.ts +1 -0
  2. package/dist/apis/categories/types.d.ts.map +1 -1
  3. package/dist/apis/contactBlockLists/ContactBlockListsApi.cjs +28 -0
  4. package/dist/apis/contactBlockLists/ContactBlockListsApi.cjs.map +1 -1
  5. package/dist/apis/contactBlockLists/ContactBlockListsApi.d.ts +24 -0
  6. package/dist/apis/contactBlockLists/ContactBlockListsApi.d.ts.map +1 -1
  7. package/dist/apis/contactBlockLists/ContactBlockListsApi.mjs +28 -0
  8. package/dist/apis/contactBlockLists/ContactBlockListsApi.mjs.map +1 -1
  9. package/dist/apis/contactBlockLists/types.d.ts +6 -1
  10. package/dist/apis/contactBlockLists/types.d.ts.map +1 -1
  11. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.cjs +31 -1
  12. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.cjs.map +1 -1
  13. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.d.ts +28 -2
  14. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.d.ts.map +1 -1
  15. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.mjs +31 -1
  16. package/dist/apis/contactBlockListsControls/ContactBlockListsControlsApi.mjs.map +1 -1
  17. package/dist/apis/contactBlockListsControls/types.d.ts +7 -0
  18. package/dist/apis/contactBlockListsControls/types.d.ts.map +1 -1
  19. package/dist/apis/distribution/DistributionApi.cjs +25 -0
  20. package/dist/apis/distribution/DistributionApi.cjs.map +1 -1
  21. package/dist/apis/distribution/DistributionApi.d.ts +20 -1
  22. package/dist/apis/distribution/DistributionApi.d.ts.map +1 -1
  23. package/dist/apis/distribution/DistributionApi.mjs +25 -0
  24. package/dist/apis/distribution/DistributionApi.mjs.map +1 -1
  25. package/dist/apis/distribution/types.d.ts +18 -1
  26. package/dist/apis/distribution/types.d.ts.map +1 -1
  27. package/dist/apis/integrations/IntegrationsApi.cjs +17 -0
  28. package/dist/apis/integrations/IntegrationsApi.cjs.map +1 -1
  29. package/dist/apis/integrations/IntegrationsApi.d.ts +15 -2
  30. package/dist/apis/integrations/IntegrationsApi.d.ts.map +1 -1
  31. package/dist/apis/integrations/IntegrationsApi.mjs +17 -0
  32. package/dist/apis/integrations/IntegrationsApi.mjs.map +1 -1
  33. package/dist/apis/integrations/types.d.ts +15 -6
  34. package/dist/apis/integrations/types.d.ts.map +1 -1
  35. package/dist/apis/interactiveMessages/InteractiveMessagesApi.cjs +15 -0
  36. package/dist/apis/interactiveMessages/InteractiveMessagesApi.cjs.map +1 -1
  37. package/dist/apis/interactiveMessages/InteractiveMessagesApi.d.ts +13 -0
  38. package/dist/apis/interactiveMessages/InteractiveMessagesApi.d.ts.map +1 -1
  39. package/dist/apis/interactiveMessages/InteractiveMessagesApi.mjs +15 -0
  40. package/dist/apis/interactiveMessages/InteractiveMessagesApi.mjs.map +1 -1
  41. package/dist/apis/interactiveMessages/types.d.ts +8 -2
  42. package/dist/apis/interactiveMessages/types.d.ts.map +1 -1
  43. package/dist/apis/me/MeApi.cjs +36 -29
  44. package/dist/apis/me/MeApi.cjs.map +1 -1
  45. package/dist/apis/me/MeApi.d.ts +33 -22
  46. package/dist/apis/me/MeApi.d.ts.map +1 -1
  47. package/dist/apis/me/MeApi.mjs +36 -29
  48. package/dist/apis/me/MeApi.mjs.map +1 -1
  49. package/dist/apis/me/types.d.ts +67 -4
  50. package/dist/apis/me/types.d.ts.map +1 -1
  51. package/dist/apis/transcripts/TranscriptsApi.cjs +12 -2
  52. package/dist/apis/transcripts/TranscriptsApi.cjs.map +1 -1
  53. package/dist/apis/transcripts/TranscriptsApi.d.ts +11 -5
  54. package/dist/apis/transcripts/TranscriptsApi.d.ts.map +1 -1
  55. package/dist/apis/transcripts/TranscriptsApi.mjs +12 -2
  56. package/dist/apis/transcripts/TranscriptsApi.mjs.map +1 -1
  57. package/dist/apis/transcripts/types.d.ts +4 -0
  58. package/dist/apis/transcripts/types.d.ts.map +1 -1
  59. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.cjs +52 -0
  60. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.cjs.map +1 -1
  61. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.d.ts +45 -2
  62. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.d.ts.map +1 -1
  63. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.mjs +52 -0
  64. package/dist/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.mjs.map +1 -1
  65. package/dist/apis/whatsappBusinessTemplates/types.d.ts +34 -1
  66. package/dist/apis/whatsappBusinessTemplates/types.d.ts.map +1 -1
  67. package/dist/core/BaseCrudApi.cjs +3 -1
  68. package/dist/core/BaseCrudApi.cjs.map +1 -1
  69. package/dist/core/BaseCrudApi.d.ts +6 -4
  70. package/dist/core/BaseCrudApi.d.ts.map +1 -1
  71. package/dist/core/BaseCrudApi.mjs +3 -1
  72. package/dist/core/BaseCrudApi.mjs.map +1 -1
  73. package/dist/core/types.d.ts +1 -1
  74. package/dist/core/types.d.ts.map +1 -1
  75. package/package.json +1 -1
  76. package/src/apis/categories/types.ts +1 -0
  77. package/src/apis/contactBlockLists/ContactBlockListsApi.test.ts +57 -0
  78. package/src/apis/contactBlockLists/ContactBlockListsApi.ts +44 -0
  79. package/src/apis/contactBlockLists/types.ts +6 -1
  80. package/src/apis/contactBlockListsControls/ContactBlockListsControlsApi.test.ts +48 -0
  81. package/src/apis/contactBlockListsControls/ContactBlockListsControlsApi.ts +49 -2
  82. package/src/apis/contactBlockListsControls/types.ts +7 -0
  83. package/src/apis/distribution/DistributionApi.test.ts +65 -0
  84. package/src/apis/distribution/DistributionApi.ts +39 -1
  85. package/src/apis/distribution/types.ts +17 -1
  86. package/src/apis/integrations/IntegrationsApi.test.ts +42 -0
  87. package/src/apis/integrations/IntegrationsApi.ts +35 -2
  88. package/src/apis/integrations/types.ts +25 -6
  89. package/src/apis/interactiveMessages/InteractiveMessagesApi.test.ts +59 -0
  90. package/src/apis/interactiveMessages/InteractiveMessagesApi.ts +26 -0
  91. package/src/apis/interactiveMessages/types.ts +8 -2
  92. package/src/apis/me/MeApi.test.ts +44 -0
  93. package/src/apis/me/MeApi.ts +83 -28
  94. package/src/apis/me/types.ts +75 -4
  95. package/src/apis/payloads.test-d.ts +94 -2
  96. package/src/apis/transcripts/TranscriptsApi.test.ts +14 -21
  97. package/src/apis/transcripts/TranscriptsApi.ts +15 -6
  98. package/src/apis/transcripts/types.ts +4 -0
  99. package/src/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.test.ts +86 -0
  100. package/src/apis/whatsappBusinessTemplates/WhatsappBusinessTemplatesApi.ts +75 -1
  101. package/src/apis/whatsappBusinessTemplates/types.ts +38 -1
  102. package/src/core/BaseCrudApi.test-d.ts +11 -1
  103. package/src/core/BaseCrudApi.ts +15 -6
  104. 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
- text: string;
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;IACZ,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;CACzB,CAAA;AAED,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,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,MAAM,MAAM,qCAAqC,GAAG;IAClD,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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/whatsappBusinessTemplates/types.ts"],"names":[],"mappings":"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"}
@@ -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 CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse>\n{\n /**\n * Creates a new resource.\n * @permissions $resourceName.create\n */\n create(body: TCreate, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.post<TResponse, TCreate>(this.basePath, body, headers)\n }\n\n /**\n * Updates an existing resource by ID.\n * @permissions $resourceName.update\n */\n updateById(id: string, body: TUpdate, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.put<TResponse, 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":";;;;;;;;AAoBA,IAAa,cAAb,cAOUA,qCAEV;;;;;CAKE,OAAO,MAAe,SAAsD;AAC1E,SAAO,KAAK,OAAO,KAAyB,KAAK,UAAU,MAAM,QAAQ;;;;;;CAO3E,WAAW,IAAY,MAAe,SAAsD;AAC1F,SAAO,KAAK,OAAO,IAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,MAAM,QAAQ;;;;;;CAOrF,WAAW,IAAY,SAA4D;AACjF,SAAO,KAAK,OAAO,OAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
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<TResponse>;
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<TResponse>;
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;;;GAGG;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,CAE3B,SAAQ,WAAW,CAAC,SAAS,EAAE,MAAM,CACrC,YAAW,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC;IAExE;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAI3E;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAI3F;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAGnF"}
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 CrudApi<TResponse, TCreate, TUpdate, TQuery, TDeleteResponse>\n{\n /**\n * Creates a new resource.\n * @permissions $resourceName.create\n */\n create(body: TCreate, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.post<TResponse, TCreate>(this.basePath, body, headers)\n }\n\n /**\n * Updates an existing resource by ID.\n * @permissions $resourceName.update\n */\n updateById(id: string, body: TUpdate, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.put<TResponse, 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":";;;;;;;AAoBA,IAAa,cAAb,cAOU,YAEV;;;;;CAKE,OAAO,MAAe,SAAsD;AAC1E,SAAO,KAAK,OAAO,KAAyB,KAAK,UAAU,MAAM,QAAQ;;;;;;CAO3E,WAAW,IAAY,MAAe,SAAsD;AAC1F,SAAO,KAAK,OAAO,IAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,MAAM,QAAQ;;;;;;CAOrF,WAAW,IAAY,SAA4D;AACjF,SAAO,KAAK,OAAO,OAAwB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
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"}
@@ -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<TResponse, TCreate> & HasUpdateById<TResponse, TUpdate> & HasDeleteById<TDeleteResponse>;
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikatec/digisac-api-sdk",
3
- "version": "4.10.0",
3
+ "version": "4.12.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -11,6 +11,7 @@ export type CreateCategoryPayload = {
11
11
  title: string
12
12
  }
13
13
 
14
+ /** The backend requires `title` on the update too (400 without it). */
14
15
  export type UpdateCategoryPayload = {
15
16
  title?: string
16
17
  }
@@ -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
- * Deletes a block/unblock run. Resolves the text `'OK'`.
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