@ikatec/digisac-api-sdk 2.1.3 → 2.2.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 (93) hide show
  1. package/dist/apis/contactBlockLists/types.d.ts +2 -1
  2. package/dist/apis/contactBlockLists/types.d.ts.map +1 -1
  3. package/dist/apis/contacts/ContactsApi.cjs +8 -0
  4. package/dist/apis/contacts/ContactsApi.cjs.map +1 -1
  5. package/dist/apis/contacts/ContactsApi.d.ts +7 -1
  6. package/dist/apis/contacts/ContactsApi.d.ts.map +1 -1
  7. package/dist/apis/contacts/ContactsApi.mjs +8 -0
  8. package/dist/apis/contacts/ContactsApi.mjs.map +1 -1
  9. package/dist/apis/contacts/types.d.ts +16 -0
  10. package/dist/apis/contacts/types.d.ts.map +1 -1
  11. package/dist/apis/departments/DepartmentsApi.cjs +2 -2
  12. package/dist/apis/departments/DepartmentsApi.cjs.map +1 -1
  13. package/dist/apis/departments/DepartmentsApi.d.ts +2 -2
  14. package/dist/apis/departments/DepartmentsApi.d.ts.map +1 -1
  15. package/dist/apis/departments/DepartmentsApi.mjs +2 -2
  16. package/dist/apis/departments/DepartmentsApi.mjs.map +1 -1
  17. package/dist/apis/departments/types.d.ts +1 -0
  18. package/dist/apis/departments/types.d.ts.map +1 -1
  19. package/dist/apis/kanbanBoards/types.d.ts +2 -0
  20. package/dist/apis/kanbanBoards/types.d.ts.map +1 -1
  21. package/dist/apis/services/ServicesApi.cjs +2 -2
  22. package/dist/apis/services/ServicesApi.cjs.map +1 -1
  23. package/dist/apis/services/ServicesApi.d.ts +2 -2
  24. package/dist/apis/services/ServicesApi.d.ts.map +1 -1
  25. package/dist/apis/services/ServicesApi.mjs +2 -2
  26. package/dist/apis/services/ServicesApi.mjs.map +1 -1
  27. package/dist/apis/services/types.d.ts +1 -0
  28. package/dist/apis/services/types.d.ts.map +1 -1
  29. package/dist/apis/tags/types.d.ts +2 -0
  30. package/dist/apis/tags/types.d.ts.map +1 -1
  31. package/dist/apis/ticketTopics/TicketTopicsApi.cjs +17 -0
  32. package/dist/apis/ticketTopics/TicketTopicsApi.cjs.map +1 -1
  33. package/dist/apis/ticketTopics/TicketTopicsApi.d.ts +11 -0
  34. package/dist/apis/ticketTopics/TicketTopicsApi.d.ts.map +1 -1
  35. package/dist/apis/ticketTopics/TicketTopicsApi.mjs +17 -0
  36. package/dist/apis/ticketTopics/TicketTopicsApi.mjs.map +1 -1
  37. package/dist/apis/tickets/TicketsApi.cjs +11 -0
  38. package/dist/apis/tickets/TicketsApi.cjs.map +1 -1
  39. package/dist/apis/tickets/TicketsApi.d.ts +10 -1
  40. package/dist/apis/tickets/TicketsApi.d.ts.map +1 -1
  41. package/dist/apis/tickets/TicketsApi.mjs +11 -0
  42. package/dist/apis/tickets/TicketsApi.mjs.map +1 -1
  43. package/dist/apis/tickets/types.d.ts +18 -0
  44. package/dist/apis/tickets/types.d.ts.map +1 -1
  45. package/dist/apis/users/UsersApi.cjs +2 -2
  46. package/dist/apis/users/UsersApi.cjs.map +1 -1
  47. package/dist/apis/users/UsersApi.d.ts +2 -2
  48. package/dist/apis/users/UsersApi.d.ts.map +1 -1
  49. package/dist/apis/users/UsersApi.mjs +2 -2
  50. package/dist/apis/users/UsersApi.mjs.map +1 -1
  51. package/dist/apis/users/types.d.ts +1 -0
  52. package/dist/apis/users/types.d.ts.map +1 -1
  53. package/dist/core/ArchivableCrudApi.cjs +39 -0
  54. package/dist/core/ArchivableCrudApi.cjs.map +1 -0
  55. package/dist/core/ArchivableCrudApi.d.ts +31 -0
  56. package/dist/core/ArchivableCrudApi.d.ts.map +1 -0
  57. package/dist/core/ArchivableCrudApi.mjs +38 -0
  58. package/dist/core/ArchivableCrudApi.mjs.map +1 -0
  59. package/dist/core/BaseCrudApi.cjs +13 -0
  60. package/dist/core/BaseCrudApi.cjs.map +1 -1
  61. package/dist/core/BaseCrudApi.d.ts +6 -0
  62. package/dist/core/BaseCrudApi.d.ts.map +1 -1
  63. package/dist/core/BaseCrudApi.mjs +13 -0
  64. package/dist/core/BaseCrudApi.mjs.map +1 -1
  65. package/dist/core/index.cjs +2 -0
  66. package/dist/core/index.d.ts +1 -0
  67. package/dist/core/index.d.ts.map +1 -1
  68. package/dist/core/index.mjs +2 -1
  69. package/dist/index.cjs +2 -0
  70. package/dist/index.mjs +2 -1
  71. package/package.json +1 -1
  72. package/src/apis/contactBlockLists/types.ts +2 -1
  73. package/src/apis/contacts/ContactsApi.test.ts +24 -0
  74. package/src/apis/contacts/ContactsApi.ts +18 -0
  75. package/src/apis/contacts/types.ts +17 -0
  76. package/src/apis/departments/DepartmentsApi.ts +2 -2
  77. package/src/apis/departments/types.ts +1 -0
  78. package/src/apis/kanbanBoards/types.ts +2 -0
  79. package/src/apis/services/ServicesApi.ts +6 -2
  80. package/src/apis/services/types.ts +1 -0
  81. package/src/apis/tags/types.ts +2 -0
  82. package/src/apis/ticketTopics/TicketTopicsApi.test.ts +58 -0
  83. package/src/apis/ticketTopics/TicketTopicsApi.ts +27 -0
  84. package/src/apis/tickets/TicketsApi.test.ts +64 -0
  85. package/src/apis/tickets/TicketsApi.ts +22 -1
  86. package/src/apis/tickets/types.ts +12 -0
  87. package/src/apis/users/UsersApi.ts +2 -2
  88. package/src/apis/users/types.ts +1 -0
  89. package/src/core/ArchivableCrudApi.test.ts +84 -0
  90. package/src/core/ArchivableCrudApi.ts +42 -0
  91. package/src/core/BaseCrudApi.test.ts +31 -0
  92. package/src/core/BaseCrudApi.ts +14 -0
  93. package/src/core/index.ts +1 -0
@@ -60,4 +60,22 @@ export type UpdateTicketPayload = {
60
60
  comments?: string | null;
61
61
  isOpen?: boolean;
62
62
  };
63
+ /**
64
+ * Body for `PUT /tickets/close-many`.
65
+ *
66
+ * Either close an explicit list of tickets by id, or close every open ticket
67
+ * matching a query. For the query variant the outer `query` is an object whose
68
+ * `query` field is a JSON-stringified list query (e.g. `JSON.stringify({ where: {} })`);
69
+ * the backend always forces `where.isOpen = true`.
70
+ */
71
+ export type CloseManyTicketsPayload = {
72
+ ids: string[];
73
+ ticketTopicIds?: string[] | string;
74
+ comments?: string;
75
+ } | {
76
+ allContactsSelected: true;
77
+ query: {
78
+ query: string;
79
+ };
80
+ };
63
81
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/tickets/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE5D,MAAM,MAAM,aAAa,GAAG;IAC1B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yCAAyC;IACzC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,OAAO,EAAE,aAAa,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAA;AAE/E,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/tickets/types.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_core_BaseCrudApi = require('../../core/BaseCrudApi.cjs');
2
+ const require_core_ArchivableCrudApi = require('../../core/ArchivableCrudApi.cjs');
3
3
 
4
4
  //#region src/apis/users/UsersApi.ts
5
- var UsersApi = class extends require_core_BaseCrudApi.BaseCrudApi {
5
+ var UsersApi = class extends require_core_ArchivableCrudApi.ArchivableCrudApi {
6
6
  constructor(client) {
7
7
  super(client, "/users");
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UsersApi.cjs","names":["BaseCrudApi"],"sources":["../../../src/apis/users/UsersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { User, CreateUserPayload, UpdateUserPayload } from './types'\n\nexport class UsersApi extends BaseCrudApi<User, CreateUserPayload, UpdateUserPayload> {\n constructor(client: ApiClient) {\n super(client, '/users')\n }\n}\n"],"mappings":";;;;AAIA,IAAa,WAAb,cAA8BA,qCAAwD;CACpF,YAAY,QAAmB;AAC7B,QAAM,QAAQ,SAAS"}
1
+ {"version":3,"file":"UsersApi.cjs","names":["ArchivableCrudApi"],"sources":["../../../src/apis/users/UsersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { ArchivableCrudApi } from '../../core/ArchivableCrudApi'\nimport type { User, CreateUserPayload, UpdateUserPayload } from './types'\n\nexport class UsersApi extends ArchivableCrudApi<User, CreateUserPayload, UpdateUserPayload> {\n constructor(client: ApiClient) {\n super(client, '/users')\n }\n}\n"],"mappings":";;;;AAIA,IAAa,WAAb,cAA8BA,iDAA8D;CAC1F,YAAY,QAAmB;AAC7B,QAAM,QAAQ,SAAS"}
@@ -1,7 +1,7 @@
1
1
  import type { ApiClient } from '../../core/ApiClient';
2
- import { BaseCrudApi } from '../../core/BaseCrudApi';
2
+ import { ArchivableCrudApi } from '../../core/ArchivableCrudApi';
3
3
  import type { User, CreateUserPayload, UpdateUserPayload } from './types';
4
- export declare class UsersApi extends BaseCrudApi<User, CreateUserPayload, UpdateUserPayload> {
4
+ export declare class UsersApi extends ArchivableCrudApi<User, CreateUserPayload, UpdateUserPayload> {
5
5
  constructor(client: ApiClient);
6
6
  }
7
7
  //# sourceMappingURL=UsersApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UsersApi.d.ts","sourceRoot":"","sources":["../../../src/apis/users/UsersApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEzE,qBAAa,QAAS,SAAQ,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;gBACvE,MAAM,EAAE,SAAS;CAG9B"}
1
+ {"version":3,"file":"UsersApi.d.ts","sourceRoot":"","sources":["../../../src/apis/users/UsersApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEzE,qBAAa,QAAS,SAAQ,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,CAAC;gBAC7E,MAAM,EAAE,SAAS;CAG9B"}
@@ -1,7 +1,7 @@
1
- import { BaseCrudApi } from "../../core/BaseCrudApi.mjs";
1
+ import { ArchivableCrudApi } from "../../core/ArchivableCrudApi.mjs";
2
2
 
3
3
  //#region src/apis/users/UsersApi.ts
4
- var UsersApi = class extends BaseCrudApi {
4
+ var UsersApi = class extends ArchivableCrudApi {
5
5
  constructor(client) {
6
6
  super(client, "/users");
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"UsersApi.mjs","names":[],"sources":["../../../src/apis/users/UsersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { BaseCrudApi } from '../../core/BaseCrudApi'\nimport type { User, CreateUserPayload, UpdateUserPayload } from './types'\n\nexport class UsersApi extends BaseCrudApi<User, CreateUserPayload, UpdateUserPayload> {\n constructor(client: ApiClient) {\n super(client, '/users')\n }\n}\n"],"mappings":";;;AAIA,IAAa,WAAb,cAA8B,YAAwD;CACpF,YAAY,QAAmB;AAC7B,QAAM,QAAQ,SAAS"}
1
+ {"version":3,"file":"UsersApi.mjs","names":[],"sources":["../../../src/apis/users/UsersApi.ts"],"sourcesContent":["import type { ApiClient } from '../../core/ApiClient'\nimport { ArchivableCrudApi } from '../../core/ArchivableCrudApi'\nimport type { User, CreateUserPayload, UpdateUserPayload } from './types'\n\nexport class UsersApi extends ArchivableCrudApi<User, CreateUserPayload, UpdateUserPayload> {\n constructor(client: ApiClient) {\n super(client, '/users')\n }\n}\n"],"mappings":";;;AAIA,IAAa,WAAb,cAA8B,kBAA8D;CAC1F,YAAY,QAAmB;AAC7B,QAAM,QAAQ,SAAS"}
@@ -60,5 +60,6 @@ export type UpdateUserPayload = {
60
60
  timetableId?: string | null;
61
61
  preferences?: UserPreferences;
62
62
  language?: string;
63
+ archivedAt?: string | null;
63
64
  };
64
65
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/users/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/apis/users/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_core_BaseCrudApi = require('./BaseCrudApi.cjs');
3
+
4
+ //#region src/core/ArchivableCrudApi.ts
5
+ /**
6
+ * CRUD base for resources that support soft-delete via an `archivedAt` timestamp
7
+ * (PUT `${basePath}/${id}` with `{ archivedAt }`). Adds `archive`/`unarchive` on
8
+ * top of {@link BaseCrudApi}.
9
+ *
10
+ * Only extend this for resources whose archive write mechanism is `archivedAt`.
11
+ * Resources that archive through a different field (e.g. cards use `isArchived`)
12
+ * or a dedicated endpoint (e.g. ticket-topics POST `/archive`) must NOT use this
13
+ * base and should implement `archive`/`unarchive` themselves.
14
+ */
15
+ var ArchivableCrudApi = class extends require_core_BaseCrudApi.BaseCrudApi {
16
+ constructor(client, basePath) {
17
+ super(client, basePath);
18
+ this.archive = this.archive.bind(this);
19
+ this.unarchive = this.unarchive.bind(this);
20
+ }
21
+ /**
22
+ * Archives a resource (soft-delete) by setting `archivedAt` to the current time.
23
+ * @permissions $resourceName.update
24
+ */
25
+ archive(id, headers) {
26
+ return this.updateById(id, { archivedAt: (/* @__PURE__ */ new Date()).toISOString() }, headers);
27
+ }
28
+ /**
29
+ * Restores a previously archived resource by clearing `archivedAt`.
30
+ * @permissions $resourceName.update
31
+ */
32
+ unarchive(id, headers) {
33
+ return this.updateById(id, { archivedAt: null }, headers);
34
+ }
35
+ };
36
+
37
+ //#endregion
38
+ exports.ArchivableCrudApi = ArchivableCrudApi;
39
+ //# sourceMappingURL=ArchivableCrudApi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchivableCrudApi.cjs","names":["BaseCrudApi"],"sources":["../../src/core/ArchivableCrudApi.ts"],"sourcesContent":["import type { ApiClient } from './ApiClient'\nimport { BaseCrudApi } from './BaseCrudApi'\nimport type { ListQuery } from './types'\n\n/**\n * CRUD base for resources that support soft-delete via an `archivedAt` timestamp\n * (PUT `${basePath}/${id}` with `{ archivedAt }`). Adds `archive`/`unarchive` on\n * top of {@link BaseCrudApi}.\n *\n * Only extend this for resources whose archive write mechanism is `archivedAt`.\n * Resources that archive through a different field (e.g. cards use `isArchived`)\n * or a dedicated endpoint (e.g. ticket-topics POST `/archive`) must NOT use this\n * base and should implement `archive`/`unarchive` themselves.\n */\nexport class ArchivableCrudApi<\n TResponse,\n TCreate,\n TUpdate extends { archivedAt?: string | null } = TCreate & { archivedAt?: string | null },\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> extends BaseCrudApi<TResponse, TCreate, TUpdate, TQuery> {\n constructor(client: ApiClient, basePath: string) {\n super(client, basePath)\n this.archive = this.archive.bind(this)\n this.unarchive = this.unarchive.bind(this)\n }\n\n /**\n * Archives a resource (soft-delete) by setting `archivedAt` to the current time.\n * @permissions $resourceName.update\n */\n archive(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.updateById(id, { archivedAt: new Date().toISOString() } as TUpdate, headers)\n }\n\n /**\n * Restores a previously archived resource by clearing `archivedAt`.\n * @permissions $resourceName.update\n */\n unarchive(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.updateById(id, { archivedAt: null } as TUpdate, headers)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,IAAa,oBAAb,cAKUA,qCAAiD;CACzD,YAAY,QAAmB,UAAkB;AAC/C,QAAM,QAAQ,SAAS;AACvB,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,YAAY,KAAK,UAAU,KAAK,KAAK;;;;;;CAO5C,QAAQ,IAAY,SAAsD;AACxE,SAAO,KAAK,WAAW,IAAI,EAAE,6BAAY,IAAI,MAAM,EAAC,aAAa,EAAE,EAAa,QAAQ;;;;;;CAO1F,UAAU,IAAY,SAAsD;AAC1E,SAAO,KAAK,WAAW,IAAI,EAAE,YAAY,MAAM,EAAa,QAAQ"}
@@ -0,0 +1,31 @@
1
+ import type { ApiClient } from './ApiClient';
2
+ import { BaseCrudApi } from './BaseCrudApi';
3
+ import type { ListQuery } from './types';
4
+ /**
5
+ * CRUD base for resources that support soft-delete via an `archivedAt` timestamp
6
+ * (PUT `${basePath}/${id}` with `{ archivedAt }`). Adds `archive`/`unarchive` on
7
+ * top of {@link BaseCrudApi}.
8
+ *
9
+ * Only extend this for resources whose archive write mechanism is `archivedAt`.
10
+ * Resources that archive through a different field (e.g. cards use `isArchived`)
11
+ * or a dedicated endpoint (e.g. ticket-topics POST `/archive`) must NOT use this
12
+ * base and should implement `archive`/`unarchive` themselves.
13
+ */
14
+ export declare class ArchivableCrudApi<TResponse, TCreate, TUpdate extends {
15
+ archivedAt?: string | null;
16
+ } = TCreate & {
17
+ archivedAt?: string | null;
18
+ }, TQuery extends ListQuery<TResponse> = ListQuery<TResponse>> extends BaseCrudApi<TResponse, TCreate, TUpdate, TQuery> {
19
+ constructor(client: ApiClient, basePath: string);
20
+ /**
21
+ * Archives a resource (soft-delete) by setting `archivedAt` to the current time.
22
+ * @permissions $resourceName.update
23
+ */
24
+ archive(id: string, headers?: Record<string, string>): Promise<TResponse>;
25
+ /**
26
+ * Restores a previously archived resource by clearing `archivedAt`.
27
+ * @permissions $resourceName.update
28
+ */
29
+ unarchive(id: string, headers?: Record<string, string>): Promise<TResponse>;
30
+ }
31
+ //# sourceMappingURL=ArchivableCrudApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchivableCrudApi.d.ts","sourceRoot":"","sources":["../../src/core/ArchivableCrudApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC;;;;;;;;;GASG;AACH,qBAAa,iBAAiB,CAC5B,SAAS,EACT,OAAO,EACP,OAAO,SAAS;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACzF,MAAM,SAAS,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAC1D,SAAQ,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;gBAC5C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;IAM/C;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAIzE;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;CAG5E"}
@@ -0,0 +1,38 @@
1
+ import { BaseCrudApi } from "./BaseCrudApi.mjs";
2
+
3
+ //#region src/core/ArchivableCrudApi.ts
4
+ /**
5
+ * CRUD base for resources that support soft-delete via an `archivedAt` timestamp
6
+ * (PUT `${basePath}/${id}` with `{ archivedAt }`). Adds `archive`/`unarchive` on
7
+ * top of {@link BaseCrudApi}.
8
+ *
9
+ * Only extend this for resources whose archive write mechanism is `archivedAt`.
10
+ * Resources that archive through a different field (e.g. cards use `isArchived`)
11
+ * or a dedicated endpoint (e.g. ticket-topics POST `/archive`) must NOT use this
12
+ * base and should implement `archive`/`unarchive` themselves.
13
+ */
14
+ var ArchivableCrudApi = class extends BaseCrudApi {
15
+ constructor(client, basePath) {
16
+ super(client, basePath);
17
+ this.archive = this.archive.bind(this);
18
+ this.unarchive = this.unarchive.bind(this);
19
+ }
20
+ /**
21
+ * Archives a resource (soft-delete) by setting `archivedAt` to the current time.
22
+ * @permissions $resourceName.update
23
+ */
24
+ archive(id, headers) {
25
+ return this.updateById(id, { archivedAt: (/* @__PURE__ */ new Date()).toISOString() }, headers);
26
+ }
27
+ /**
28
+ * Restores a previously archived resource by clearing `archivedAt`.
29
+ * @permissions $resourceName.update
30
+ */
31
+ unarchive(id, headers) {
32
+ return this.updateById(id, { archivedAt: null }, headers);
33
+ }
34
+ };
35
+
36
+ //#endregion
37
+ export { ArchivableCrudApi };
38
+ //# sourceMappingURL=ArchivableCrudApi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchivableCrudApi.mjs","names":[],"sources":["../../src/core/ArchivableCrudApi.ts"],"sourcesContent":["import type { ApiClient } from './ApiClient'\nimport { BaseCrudApi } from './BaseCrudApi'\nimport type { ListQuery } from './types'\n\n/**\n * CRUD base for resources that support soft-delete via an `archivedAt` timestamp\n * (PUT `${basePath}/${id}` with `{ archivedAt }`). Adds `archive`/`unarchive` on\n * top of {@link BaseCrudApi}.\n *\n * Only extend this for resources whose archive write mechanism is `archivedAt`.\n * Resources that archive through a different field (e.g. cards use `isArchived`)\n * or a dedicated endpoint (e.g. ticket-topics POST `/archive`) must NOT use this\n * base and should implement `archive`/`unarchive` themselves.\n */\nexport class ArchivableCrudApi<\n TResponse,\n TCreate,\n TUpdate extends { archivedAt?: string | null } = TCreate & { archivedAt?: string | null },\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> extends BaseCrudApi<TResponse, TCreate, TUpdate, TQuery> {\n constructor(client: ApiClient, basePath: string) {\n super(client, basePath)\n this.archive = this.archive.bind(this)\n this.unarchive = this.unarchive.bind(this)\n }\n\n /**\n * Archives a resource (soft-delete) by setting `archivedAt` to the current time.\n * @permissions $resourceName.update\n */\n archive(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.updateById(id, { archivedAt: new Date().toISOString() } as TUpdate, headers)\n }\n\n /**\n * Restores a previously archived resource by clearing `archivedAt`.\n * @permissions $resourceName.update\n */\n unarchive(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.updateById(id, { archivedAt: null } as TUpdate, headers)\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,IAAa,oBAAb,cAKU,YAAiD;CACzD,YAAY,QAAmB,UAAkB;AAC/C,QAAM,QAAQ,SAAS;AACvB,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,YAAY,KAAK,UAAU,KAAK,KAAK;;;;;;CAO5C,QAAQ,IAAY,SAAsD;AACxE,SAAO,KAAK,WAAW,IAAI,EAAE,6BAAY,IAAI,MAAM,EAAC,aAAa,EAAE,EAAa,QAAQ;;;;;;CAO1F,UAAU,IAAY,SAAsD;AAC1E,SAAO,KAAK,WAAW,IAAI,EAAE,YAAY,MAAM,EAAa,QAAQ"}
@@ -11,6 +11,7 @@ var BaseCrudApi = class {
11
11
  this.client = client;
12
12
  this.basePath = basePath.replace(/\/$/, "");
13
13
  this.getMany = this.getMany.bind(this);
14
+ this.getOne = this.getOne.bind(this);
14
15
  this.getById = this.getById.bind(this);
15
16
  this.create = this.create.bind(this);
16
17
  this.updateById = this.updateById.bind(this);
@@ -21,6 +22,18 @@ var BaseCrudApi = class {
21
22
  return this.client.get(`${this.basePath}${queryString}`, headers);
22
23
  }
23
24
  /**
25
+ * Returns the first resource matching the query, or `null` when none match.
26
+ * Convenience over `getMany` with `limit: 1`.
27
+ * @permissions $resourceName.view
28
+ */
29
+ async getOne(query, headers) {
30
+ return (await this.getMany({
31
+ ...query,
32
+ limit: 1,
33
+ paginate: false
34
+ }, headers))[0] ?? null;
35
+ }
36
+ /**
24
37
  * Returns a single resource by ID.
25
38
  * @permissions $resourceName.view
26
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCrudApi.cjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import qs from 'qs'\nimport type { ApiClient } from './ApiClient'\nimport type { CrudApi, GetByIdQuery, ListQuery, Paginated } 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\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> implements CrudApi<TResponse, TCreate, TUpdate, TQuery> {\n public readonly client: ApiClient\n public readonly basePath: string\n\n constructor(client: ApiClient, basePath: string) {\n this.client = client\n this.basePath = basePath.replace(/\\/$/, '')\n this.getMany = this.getMany.bind(this)\n this.getById = this.getById.bind(this)\n this.create = this.create.bind(this)\n this.updateById = this.updateById.bind(this)\n this.deleteById = this.deleteById.bind(this)\n }\n\n getMany(\n query: TQuery & { paginate: false },\n headers?: Record<string, string>,\n ): Promise<TResponse[]>\n getMany(\n query?: TQuery & { paginate?: true },\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse>>\n getMany(\n query?: TQuery,\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse> | TResponse[]> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<Paginated<TResponse> | TResponse[]>(\n `${this.basePath}${queryString}`,\n headers,\n )\n }\n\n /**\n * Returns a single resource by ID.\n * @permissions $resourceName.view\n */\n getById(\n id: string,\n query?: GetByIdQuery<TResponse>,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<TResponse>(`${this.basePath}/${id}${queryString}`, headers)\n }\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.delete\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.delete<TResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;;;;AAiBA,IAAa,cAAb,MAK0D;CACxD,AAAgB;CAChB,AAAgB;CAEhB,YAAY,QAAmB,UAAkB;AAC/C,OAAK,SAAS;AACd,OAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC3C,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;AAC5C,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;;CAW9C,QACE,OACA,SAC6C;EAC7C,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,WAAW,eACnB,QACD;;;;;;CAOH,QACE,IACA,OACA,SACoB;EACpB,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IAAe,GAAG,KAAK,SAAS,GAAG,KAAK,eAAe,QAAQ;;;;;;CAOpF,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,SAAsD;AAC3E,SAAO,KAAK,OAAO,OAAkB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
1
+ {"version":3,"file":"BaseCrudApi.cjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import qs from 'qs'\nimport type { ApiClient } from './ApiClient'\nimport type { CrudApi, GetByIdQuery, ListQuery, Paginated } 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\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> implements CrudApi<TResponse, TCreate, TUpdate, TQuery> {\n public readonly client: ApiClient\n public readonly basePath: string\n\n constructor(client: ApiClient, basePath: string) {\n this.client = client\n this.basePath = basePath.replace(/\\/$/, '')\n this.getMany = this.getMany.bind(this)\n this.getOne = this.getOne.bind(this)\n this.getById = this.getById.bind(this)\n this.create = this.create.bind(this)\n this.updateById = this.updateById.bind(this)\n this.deleteById = this.deleteById.bind(this)\n }\n\n getMany(\n query: TQuery & { paginate: false },\n headers?: Record<string, string>,\n ): Promise<TResponse[]>\n getMany(\n query?: TQuery & { paginate?: true },\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse>>\n getMany(\n query?: TQuery,\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse> | TResponse[]> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<Paginated<TResponse> | TResponse[]>(\n `${this.basePath}${queryString}`,\n headers,\n )\n }\n\n /**\n * Returns the first resource matching the query, or `null` when none match.\n * Convenience over `getMany` with `limit: 1`.\n * @permissions $resourceName.view\n */\n async getOne(query?: TQuery, headers?: Record<string, string>): Promise<TResponse | null> {\n const results = await this.getMany(\n { ...query, limit: 1, paginate: false } as TQuery & { paginate: false },\n headers,\n )\n return results[0] ?? null\n }\n\n /**\n * Returns a single resource by ID.\n * @permissions $resourceName.view\n */\n getById(\n id: string,\n query?: GetByIdQuery<TResponse>,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<TResponse>(`${this.basePath}/${id}${queryString}`, headers)\n }\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.delete\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.delete<TResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;;;;AAiBA,IAAa,cAAb,MAK0D;CACxD,AAAgB;CAChB,AAAgB;CAEhB,YAAY,QAAmB,UAAkB;AAC/C,OAAK,SAAS;AACd,OAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC3C,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;AAC5C,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;;CAW9C,QACE,OACA,SAC6C;EAC7C,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,WAAW,eACnB,QACD;;;;;;;CAQH,MAAM,OAAO,OAAgB,SAA6D;AAKxF,UAJgB,MAAM,KAAK,QACzB;GAAE,GAAG;GAAO,OAAO;GAAG,UAAU;GAAO,EACvC,QACD,EACc,MAAM;;;;;;CAOvB,QACE,IACA,OACA,SACoB;EACpB,MAAM,cAAc,QAAQ,IAAI,WAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IAAe,GAAG,KAAK,SAAS,GAAG,KAAK,eAAe,QAAQ;;;;;;CAOpF,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,SAAsD;AAC3E,SAAO,KAAK,OAAO,OAAkB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
@@ -11,6 +11,12 @@ export declare class BaseCrudApi<TResponse, TCreate, TUpdate = TCreate, TQuery e
11
11
  getMany(query?: TQuery & {
12
12
  paginate?: true;
13
13
  }, headers?: Record<string, string>): Promise<Paginated<TResponse>>;
14
+ /**
15
+ * Returns the first resource matching the query, or `null` when none match.
16
+ * Convenience over `getMany` with `limit: 1`.
17
+ * @permissions $resourceName.view
18
+ */
19
+ getOne(query?: TQuery, headers?: Record<string, string>): Promise<TResponse | null>;
14
20
  /**
15
21
  * Returns a single resource by ID.
16
22
  * @permissions $resourceName.view
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCrudApi.d.ts","sourceRoot":"","sources":["../../src/core/BaseCrudApi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC1E,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,qBAAa,WAAW,CACtB,SAAS,EACT,OAAO,EACP,OAAO,GAAG,OAAO,EACjB,MAAM,SAAS,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAC1D,YAAW,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IACvD,SAAgB,MAAM,EAAE,SAAS,CAAA;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAA;gBAEpB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;IAU/C,OAAO,CACL,KAAK,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,EACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;IACvB,OAAO,CACL,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,EAAE,IAAI,CAAA;KAAE,EACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAYhC;;;OAGG;IACH,OAAO,CACL,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,EAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC;IAKrB;;;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,SAAS,CAAC;CAG7E"}
1
+ {"version":3,"file":"BaseCrudApi.d.ts","sourceRoot":"","sources":["../../src/core/BaseCrudApi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC1E,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,qBAAa,WAAW,CACtB,SAAS,EACT,OAAO,EACP,OAAO,GAAG,OAAO,EACjB,MAAM,SAAS,SAAS,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAC1D,YAAW,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IACvD,SAAgB,MAAM,EAAE,SAAS,CAAA;IACjC,SAAgB,QAAQ,EAAE,MAAM,CAAA;gBAEpB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;IAW/C,OAAO,CACL,KAAK,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,EACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;IACvB,OAAO,CACL,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,EAAE,IAAI,CAAA;KAAE,EACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAYhC;;;;OAIG;IACG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAQzF;;;OAGG;IACH,OAAO,CACL,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,EAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC;IAKrB;;;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,SAAS,CAAC;CAG7E"}
@@ -8,6 +8,7 @@ var BaseCrudApi = class {
8
8
  this.client = client;
9
9
  this.basePath = basePath.replace(/\/$/, "");
10
10
  this.getMany = this.getMany.bind(this);
11
+ this.getOne = this.getOne.bind(this);
11
12
  this.getById = this.getById.bind(this);
12
13
  this.create = this.create.bind(this);
13
14
  this.updateById = this.updateById.bind(this);
@@ -18,6 +19,18 @@ var BaseCrudApi = class {
18
19
  return this.client.get(`${this.basePath}${queryString}`, headers);
19
20
  }
20
21
  /**
22
+ * Returns the first resource matching the query, or `null` when none match.
23
+ * Convenience over `getMany` with `limit: 1`.
24
+ * @permissions $resourceName.view
25
+ */
26
+ async getOne(query, headers) {
27
+ return (await this.getMany({
28
+ ...query,
29
+ limit: 1,
30
+ paginate: false
31
+ }, headers))[0] ?? null;
32
+ }
33
+ /**
21
34
  * Returns a single resource by ID.
22
35
  * @permissions $resourceName.view
23
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCrudApi.mjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import qs from 'qs'\nimport type { ApiClient } from './ApiClient'\nimport type { CrudApi, GetByIdQuery, ListQuery, Paginated } 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\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> implements CrudApi<TResponse, TCreate, TUpdate, TQuery> {\n public readonly client: ApiClient\n public readonly basePath: string\n\n constructor(client: ApiClient, basePath: string) {\n this.client = client\n this.basePath = basePath.replace(/\\/$/, '')\n this.getMany = this.getMany.bind(this)\n this.getById = this.getById.bind(this)\n this.create = this.create.bind(this)\n this.updateById = this.updateById.bind(this)\n this.deleteById = this.deleteById.bind(this)\n }\n\n getMany(\n query: TQuery & { paginate: false },\n headers?: Record<string, string>,\n ): Promise<TResponse[]>\n getMany(\n query?: TQuery & { paginate?: true },\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse>>\n getMany(\n query?: TQuery,\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse> | TResponse[]> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<Paginated<TResponse> | TResponse[]>(\n `${this.basePath}${queryString}`,\n headers,\n )\n }\n\n /**\n * Returns a single resource by ID.\n * @permissions $resourceName.view\n */\n getById(\n id: string,\n query?: GetByIdQuery<TResponse>,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<TResponse>(`${this.basePath}/${id}${queryString}`, headers)\n }\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.delete\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.delete<TResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;AAiBA,IAAa,cAAb,MAK0D;CACxD,AAAgB;CAChB,AAAgB;CAEhB,YAAY,QAAmB,UAAkB;AAC/C,OAAK,SAAS;AACd,OAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC3C,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;AAC5C,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;;CAW9C,QACE,OACA,SAC6C;EAC7C,MAAM,cAAc,QAAQ,IAAI,GAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,WAAW,eACnB,QACD;;;;;;CAOH,QACE,IACA,OACA,SACoB;EACpB,MAAM,cAAc,QAAQ,IAAI,GAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IAAe,GAAG,KAAK,SAAS,GAAG,KAAK,eAAe,QAAQ;;;;;;CAOpF,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,SAAsD;AAC3E,SAAO,KAAK,OAAO,OAAkB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
1
+ {"version":3,"file":"BaseCrudApi.mjs","names":[],"sources":["../../src/core/BaseCrudApi.ts"],"sourcesContent":["import qs from 'qs'\nimport type { ApiClient } from './ApiClient'\nimport type { CrudApi, GetByIdQuery, ListQuery, Paginated } 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\nexport class BaseCrudApi<\n TResponse,\n TCreate,\n TUpdate = TCreate,\n TQuery extends ListQuery<TResponse> = ListQuery<TResponse>,\n> implements CrudApi<TResponse, TCreate, TUpdate, TQuery> {\n public readonly client: ApiClient\n public readonly basePath: string\n\n constructor(client: ApiClient, basePath: string) {\n this.client = client\n this.basePath = basePath.replace(/\\/$/, '')\n this.getMany = this.getMany.bind(this)\n this.getOne = this.getOne.bind(this)\n this.getById = this.getById.bind(this)\n this.create = this.create.bind(this)\n this.updateById = this.updateById.bind(this)\n this.deleteById = this.deleteById.bind(this)\n }\n\n getMany(\n query: TQuery & { paginate: false },\n headers?: Record<string, string>,\n ): Promise<TResponse[]>\n getMany(\n query?: TQuery & { paginate?: true },\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse>>\n getMany(\n query?: TQuery,\n headers?: Record<string, string>,\n ): Promise<Paginated<TResponse> | TResponse[]> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<Paginated<TResponse> | TResponse[]>(\n `${this.basePath}${queryString}`,\n headers,\n )\n }\n\n /**\n * Returns the first resource matching the query, or `null` when none match.\n * Convenience over `getMany` with `limit: 1`.\n * @permissions $resourceName.view\n */\n async getOne(query?: TQuery, headers?: Record<string, string>): Promise<TResponse | null> {\n const results = await this.getMany(\n { ...query, limit: 1, paginate: false } as TQuery & { paginate: false },\n headers,\n )\n return results[0] ?? null\n }\n\n /**\n * Returns a single resource by ID.\n * @permissions $resourceName.view\n */\n getById(\n id: string,\n query?: GetByIdQuery<TResponse>,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const queryString = query ? `?${qs.stringify(query)}` : ''\n return this.client.get<TResponse>(`${this.basePath}/${id}${queryString}`, headers)\n }\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.delete\n */\n deleteById(id: string, headers?: Record<string, string>): Promise<TResponse> {\n return this.client.delete<TResponse>(`${this.basePath}/${id}`, headers)\n }\n}\n"],"mappings":";;;AAiBA,IAAa,cAAb,MAK0D;CACxD,AAAgB;CAChB,AAAgB;CAEhB,YAAY,QAAmB,UAAkB;AAC/C,OAAK,SAAS;AACd,OAAK,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC3C,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,UAAU,KAAK,QAAQ,KAAK,KAAK;AACtC,OAAK,SAAS,KAAK,OAAO,KAAK,KAAK;AACpC,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;AAC5C,OAAK,aAAa,KAAK,WAAW,KAAK,KAAK;;CAW9C,QACE,OACA,SAC6C;EAC7C,MAAM,cAAc,QAAQ,IAAI,GAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IACjB,GAAG,KAAK,WAAW,eACnB,QACD;;;;;;;CAQH,MAAM,OAAO,OAAgB,SAA6D;AAKxF,UAJgB,MAAM,KAAK,QACzB;GAAE,GAAG;GAAO,OAAO;GAAG,UAAU;GAAO,EACvC,QACD,EACc,MAAM;;;;;;CAOvB,QACE,IACA,OACA,SACoB;EACpB,MAAM,cAAc,QAAQ,IAAI,GAAG,UAAU,MAAM,KAAK;AACxD,SAAO,KAAK,OAAO,IAAe,GAAG,KAAK,SAAS,GAAG,KAAK,eAAe,QAAQ;;;;;;CAOpF,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,SAAsD;AAC3E,SAAO,KAAK,OAAO,OAAkB,GAAG,KAAK,SAAS,GAAG,MAAM,QAAQ"}
@@ -1,7 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_core_BaseApiClient = require('./BaseApiClient.cjs');
3
3
  const require_core_BaseCrudApi = require('./BaseCrudApi.cjs');
4
+ const require_core_ArchivableCrudApi = require('./ArchivableCrudApi.cjs');
4
5
 
5
6
  exports.ApiError = require_core_BaseApiClient.ApiError;
7
+ exports.ArchivableCrudApi = require_core_ArchivableCrudApi.ArchivableCrudApi;
6
8
  exports.BaseApiClient = require_core_BaseApiClient.BaseApiClient;
7
9
  exports.BaseCrudApi = require_core_BaseCrudApi.BaseCrudApi;
@@ -2,5 +2,6 @@ export type { ApiClient, HttpMethod } from './ApiClient';
2
2
  export { BaseApiClient, ApiError } from './BaseApiClient';
3
3
  export type { ValidationError } from './BaseApiClient';
4
4
  export { BaseCrudApi } from './BaseCrudApi';
5
+ export { ArchivableCrudApi } from './ArchivableCrudApi';
5
6
  export type { WhereClause, IncludeItem, ListQuery, GetByIdQuery, Paginated } from './types';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { ApiError, BaseApiClient } from "./BaseApiClient.mjs";
2
2
  import { BaseCrudApi } from "./BaseCrudApi.mjs";
3
+ import { ArchivableCrudApi } from "./ArchivableCrudApi.mjs";
3
4
 
4
- export { ApiError, BaseApiClient, BaseCrudApi };
5
+ export { ApiError, ArchivableCrudApi, BaseApiClient, BaseCrudApi };
package/dist/index.cjs CHANGED
@@ -1,8 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_core_BaseApiClient = require('./core/BaseApiClient.cjs');
3
3
  const require_core_BaseCrudApi = require('./core/BaseCrudApi.cjs');
4
+ const require_core_ArchivableCrudApi = require('./core/ArchivableCrudApi.cjs');
4
5
  require('./core/index.cjs');
5
6
 
6
7
  exports.ApiError = require_core_BaseApiClient.ApiError;
8
+ exports.ArchivableCrudApi = require_core_ArchivableCrudApi.ArchivableCrudApi;
7
9
  exports.BaseApiClient = require_core_BaseApiClient.BaseApiClient;
8
10
  exports.BaseCrudApi = require_core_BaseCrudApi.BaseCrudApi;
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ApiError, BaseApiClient } from "./core/BaseApiClient.mjs";
2
2
  import { BaseCrudApi } from "./core/BaseCrudApi.mjs";
3
+ import { ArchivableCrudApi } from "./core/ArchivableCrudApi.mjs";
3
4
  import "./core/index.mjs";
4
5
 
5
- export { ApiError, BaseApiClient, BaseCrudApi };
6
+ export { ApiError, ArchivableCrudApi, BaseApiClient, BaseCrudApi };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikatec/digisac-api-sdk",
3
- "version": "2.1.3",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -23,7 +23,8 @@ export type ContactBlockListRelationships = 'user'
23
23
 
24
24
  export type CreateContactBlockListPayload = {
25
25
  name: string
26
- contacts: string[]
26
+ /** ID of an uploaded CSV file (POST /files/create-to-upload, attachedType 'contact_block_list.file'). */
27
+ fileId: string
27
28
  defaultDDI?: string
28
29
  }
29
30
 
@@ -341,6 +341,30 @@ describe('ContactsApi', () => {
341
341
  })
342
342
  })
343
343
 
344
+ describe('transferTicket', () => {
345
+ it('calls client.post with /contacts/:id/ticket/transfer and payload', async () => {
346
+ vi.mocked(client.post).mockResolvedValue({ ok: true })
347
+ const result = await api.transferTicket('c1', { departmentId: 'd1' })
348
+ expect(client.post).toHaveBeenCalledWith(
349
+ '/contacts/c1/ticket/transfer',
350
+ { departmentId: 'd1' },
351
+ undefined,
352
+ )
353
+ expect(result).toEqual({ ok: true })
354
+ })
355
+
356
+ it('includes optional userId and forwards custom headers', async () => {
357
+ vi.mocked(client.post).mockResolvedValue({ ok: true })
358
+ const headers = { 'X-Custom': 'h' }
359
+ await api.transferTicket('c1', { departmentId: 'd1', userId: 'u1' }, headers)
360
+ expect(client.post).toHaveBeenCalledWith(
361
+ '/contacts/c1/ticket/transfer',
362
+ { departmentId: 'd1', userId: 'u1' },
363
+ headers,
364
+ )
365
+ })
366
+ })
367
+
344
368
  // ── Error propagation ────────────────────────────────────────────
345
369
 
346
370
  describe('error propagation', () => {
@@ -9,6 +9,7 @@ import type {
9
9
  CreateContactPayload,
10
10
  ExistsContactsParams,
11
11
  ExportTemplatePayload,
12
+ TransferTicketPayload,
12
13
  UpdateContactPayload,
13
14
  } from './types'
14
15
 
@@ -102,4 +103,21 @@ export class ContactsApi extends BaseCrudApi<Contact, CreateContactPayload, Upda
102
103
  headers,
103
104
  )
104
105
  }
106
+
107
+ /**
108
+ * Opens (or transfers) the contact's ticket to a department, and optionally a user.
109
+ * This is the real ticket-open flow used by the UI — there is no `POST /tickets`.
110
+ * @permissions tickets.transfer.all OR tickets.transfer.me
111
+ */
112
+ transferTicket(
113
+ contactId: string,
114
+ payload: TransferTicketPayload,
115
+ headers?: Record<string, string>,
116
+ ): Promise<unknown> {
117
+ return this.client.post<unknown, TransferTicketPayload>(
118
+ `${this.basePath}/${contactId}/ticket/transfer`,
119
+ payload,
120
+ headers,
121
+ )
122
+ }
105
123
  }
@@ -153,6 +153,8 @@ export type CreateContactPayload = {
153
153
  name?: string
154
154
  serviceId: string
155
155
  idFromService?: string
156
+ /** Top-level convenience input; the backend copies it into `data.number`. */
157
+ number?: string
156
158
  defaultDepartmentId?: string
157
159
  defaultUserId?: string
158
160
  data?: ContactData
@@ -170,6 +172,8 @@ export type UpdateContactPayload = {
170
172
  note?: string | null
171
173
  isSilenced?: boolean
172
174
  block?: boolean
175
+ /** Tag IDs to associate with the contact. */
176
+ tagIds?: string[]
173
177
  }
174
178
 
175
179
  export type ExportTemplatePayload = {
@@ -187,3 +191,16 @@ export type ExistsContactsParams = {
187
191
  }
188
192
 
189
193
  export type CountMediaResult = Record<string, number>
194
+
195
+ /**
196
+ * Body for `POST /contacts/:id/ticket/transfer`. Opens or transfers the contact's
197
+ * ticket. The backend only reads these fields; it does not enforce a 24h window or template.
198
+ */
199
+ export type TransferTicketPayload = {
200
+ departmentId: string
201
+ userId?: string
202
+ comments?: string
203
+ kanbanCardColumnId?: string
204
+ kanbanCardSubject?: string
205
+ initialMessage?: string
206
+ }
@@ -1,8 +1,8 @@
1
1
  import type { ApiClient } from '../../core/ApiClient'
2
- import { BaseCrudApi } from '../../core/BaseCrudApi'
2
+ import { ArchivableCrudApi } from '../../core/ArchivableCrudApi'
3
3
  import type { Department, CreateDepartmentPayload, UpdateDepartmentPayload } from './types'
4
4
 
5
- export class DepartmentsApi extends BaseCrudApi<
5
+ export class DepartmentsApi extends ArchivableCrudApi<
6
6
  Department,
7
7
  CreateDepartmentPayload,
8
8
  UpdateDepartmentPayload
@@ -24,4 +24,5 @@ export type CreateDepartmentPayload = {
24
24
  export type UpdateDepartmentPayload = {
25
25
  name?: string
26
26
  distributionId?: string | null
27
+ archivedAt?: string | null
27
28
  }
@@ -19,6 +19,8 @@ export type KanbanBoardRelationships = 'departments' | 'columns'
19
19
  export type CreateKanbanBoardPayload = {
20
20
  name: string
21
21
  timeoutAlertEnabled?: boolean
22
+ /** Department IDs to link to the board. Required by the backend on creation. */
23
+ departmentIds: string[]
22
24
  }
23
25
 
24
26
  export type UpdateKanbanBoardPayload = {
@@ -1,8 +1,12 @@
1
1
  import type { ApiClient } from '../../core/ApiClient'
2
- import { BaseCrudApi } from '../../core/BaseCrudApi'
2
+ import { ArchivableCrudApi } from '../../core/ArchivableCrudApi'
3
3
  import type { Service, CreateServicePayload, UpdateServicePayload } from './types'
4
4
 
5
- export class ServicesApi extends BaseCrudApi<Service, CreateServicePayload, UpdateServicePayload> {
5
+ export class ServicesApi extends ArchivableCrudApi<
6
+ Service,
7
+ CreateServicePayload,
8
+ UpdateServicePayload
9
+ > {
6
10
  constructor(client: ApiClient) {
7
11
  super(client, '/services')
8
12
  }
@@ -219,4 +219,5 @@ export type UpdateServicePayload = {
219
219
  settings?: ServiceSettings
220
220
  defaultDepartmentId?: string | null
221
221
  botId?: string | null
222
+ archivedAt?: string | null
222
223
  }
@@ -19,6 +19,8 @@ export type TagRelationships = 'contacts' | 'departments'
19
19
  export type CreateTagPayload = {
20
20
  label: string
21
21
  backgroundColor?: string
22
+ /** Department IDs to link to the tag on creation. */
23
+ departments?: string[]
22
24
  }
23
25
 
24
26
  export type UpdateTagPayload = {