@forestadmin/datasource-zendesk 1.0.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 (52) hide show
  1. package/README.md +162 -0
  2. package/dist/client/index.d.ts +91 -0
  3. package/dist/client/index.js +243 -0
  4. package/dist/client-options.d.ts +16 -0
  5. package/dist/client-options.js +10 -0
  6. package/dist/collections/base-zendesk-collection.d.ts +52 -0
  7. package/dist/collections/base-zendesk-collection.js +203 -0
  8. package/dist/collections/organization-collection.d.ts +15 -0
  9. package/dist/collections/organization-collection.js +145 -0
  10. package/dist/collections/searchable-collection.d.ts +6 -0
  11. package/dist/collections/searchable-collection.js +20 -0
  12. package/dist/collections/ticket/comments-embedder.d.ts +5 -0
  13. package/dist/collections/ticket/comments-embedder.js +40 -0
  14. package/dist/collections/ticket/relation-embedder.d.ts +10 -0
  15. package/dist/collections/ticket/relation-embedder.js +62 -0
  16. package/dist/collections/ticket/schema-definition.d.ts +13 -0
  17. package/dist/collections/ticket/schema-definition.js +147 -0
  18. package/dist/collections/ticket/serializer.d.ts +15 -0
  19. package/dist/collections/ticket/serializer.js +96 -0
  20. package/dist/collections/ticket-collection.d.ts +18 -0
  21. package/dist/collections/ticket-collection.js +139 -0
  22. package/dist/collections/user-collection.d.ts +15 -0
  23. package/dist/collections/user-collection.js +162 -0
  24. package/dist/datasource.d.ts +16 -0
  25. package/dist/datasource.js +49 -0
  26. package/dist/enums.d.ts +10 -0
  27. package/dist/enums.js +12 -0
  28. package/dist/errors.d.ts +14 -0
  29. package/dist/errors.js +31 -0
  30. package/dist/factory.d.ts +5 -0
  31. package/dist/factory.js +15 -0
  32. package/dist/index.d.ts +15 -0
  33. package/dist/index.js +30 -0
  34. package/dist/plugins/close-ticket/errors.d.ts +7 -0
  35. package/dist/plugins/close-ticket/errors.js +44 -0
  36. package/dist/plugins/close-ticket/index.d.ts +13 -0
  37. package/dist/plugins/close-ticket/index.js +74 -0
  38. package/dist/plugins/close-ticket/messages.d.ts +12 -0
  39. package/dist/plugins/close-ticket/messages.js +33 -0
  40. package/dist/plugins/create-ticket-with-notification/form-builder.d.ts +30 -0
  41. package/dist/plugins/create-ticket-with-notification/form-builder.js +179 -0
  42. package/dist/plugins/create-ticket-with-notification/index.d.ts +19 -0
  43. package/dist/plugins/create-ticket-with-notification/index.js +81 -0
  44. package/dist/query/condition-tree-translator.d.ts +9 -0
  45. package/dist/query/condition-tree-translator.js +90 -0
  46. package/dist/query/operators.d.ts +15 -0
  47. package/dist/query/operators.js +34 -0
  48. package/dist/schema/custom-fields-introspector.d.ts +13 -0
  49. package/dist/schema/custom-fields-introspector.js +89 -0
  50. package/dist/types.d.ts +23 -0
  51. package/dist/types.js +3 -0
  52. package/package.json +33 -0
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TICKET_COMMENT_THREAD_SCHEMA = exports.TICKET_SORTABLE = void 0;
4
+ exports.getTicketFieldSchemas = getTicketFieldSchemas;
5
+ const datasource_1 = require("../../datasource");
6
+ const enums_1 = require("../../enums");
7
+ const base_zendesk_collection_1 = require("../base-zendesk-collection");
8
+ exports.TICKET_SORTABLE = {
9
+ updated_at: 'updated_at',
10
+ created_at: 'created_at',
11
+ priority: 'priority',
12
+ status: 'status',
13
+ ticket_type: 'ticket_type',
14
+ };
15
+ exports.TICKET_COMMENT_THREAD_SCHEMA = {
16
+ id: 'Number',
17
+ body: 'String',
18
+ html_body: 'String',
19
+ public: 'Boolean',
20
+ author_email: 'String',
21
+ author_name: 'String',
22
+ created_at: 'Date',
23
+ };
24
+ function getTicketFieldSchemas() {
25
+ return {
26
+ id: {
27
+ type: 'Column',
28
+ columnType: 'Number',
29
+ isPrimaryKey: true,
30
+ isReadOnly: true,
31
+ isSortable: false,
32
+ filterOperators: new Set(base_zendesk_collection_1.ID_OPS),
33
+ },
34
+ subject: {
35
+ type: 'Column',
36
+ columnType: 'String',
37
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
38
+ },
39
+ description: {
40
+ type: 'Column',
41
+ columnType: 'String',
42
+ filterOperators: new Set(),
43
+ },
44
+ status: {
45
+ type: 'Column',
46
+ columnType: 'Enum',
47
+ enumValues: [...enums_1.TICKET_STATUSES],
48
+ isSortable: true,
49
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
50
+ },
51
+ priority: {
52
+ type: 'Column',
53
+ columnType: 'Enum',
54
+ enumValues: [...enums_1.TICKET_PRIORITIES],
55
+ isSortable: true,
56
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
57
+ },
58
+ ticket_type: {
59
+ type: 'Column',
60
+ columnType: 'Enum',
61
+ enumValues: [...enums_1.TICKET_TYPES],
62
+ isSortable: true,
63
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
64
+ },
65
+ requester_id: {
66
+ type: 'Column',
67
+ columnType: 'Number',
68
+ filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
69
+ },
70
+ assignee_id: {
71
+ type: 'Column',
72
+ columnType: 'Number',
73
+ filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
74
+ },
75
+ group_id: {
76
+ type: 'Column',
77
+ columnType: 'Number',
78
+ filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
79
+ },
80
+ organization_id: {
81
+ type: 'Column',
82
+ columnType: 'Number',
83
+ filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
84
+ },
85
+ external_id: {
86
+ type: 'Column',
87
+ columnType: 'String',
88
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
89
+ },
90
+ requester_email: {
91
+ type: 'Column',
92
+ columnType: 'String',
93
+ isReadOnly: true,
94
+ filterOperators: new Set(['Equal']),
95
+ },
96
+ tags: {
97
+ type: 'Column',
98
+ columnType: ['String'],
99
+ filterOperators: new Set(),
100
+ },
101
+ url: {
102
+ type: 'Column',
103
+ columnType: 'String',
104
+ isReadOnly: true,
105
+ filterOperators: new Set(),
106
+ },
107
+ created_at: {
108
+ type: 'Column',
109
+ columnType: 'Date',
110
+ isReadOnly: true,
111
+ isSortable: true,
112
+ filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
113
+ },
114
+ updated_at: {
115
+ type: 'Column',
116
+ columnType: 'Date',
117
+ isReadOnly: true,
118
+ isSortable: true,
119
+ filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
120
+ },
121
+ comments: {
122
+ type: 'Column',
123
+ columnType: [exports.TICKET_COMMENT_THREAD_SCHEMA],
124
+ isReadOnly: true,
125
+ filterOperators: new Set(),
126
+ },
127
+ requester: {
128
+ type: 'ManyToOne',
129
+ foreignCollection: datasource_1.COLLECTION_NAMES.user,
130
+ foreignKey: 'requester_id',
131
+ foreignKeyTarget: 'id',
132
+ },
133
+ assignee: {
134
+ type: 'ManyToOne',
135
+ foreignCollection: datasource_1.COLLECTION_NAMES.user,
136
+ foreignKey: 'assignee_id',
137
+ foreignKeyTarget: 'id',
138
+ },
139
+ organization: {
140
+ type: 'ManyToOne',
141
+ foreignCollection: datasource_1.COLLECTION_NAMES.organization,
142
+ foreignKey: 'organization_id',
143
+ foreignKeyTarget: 'id',
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWRlZmluaXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29sbGVjdGlvbnMvdGlja2V0L3NjaGVtYS1kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSxzREEwSEM7QUFoSkQsaURBQW9EO0FBQ3BELHVDQUErRTtBQUMvRSx3RUFBc0Y7QUFFekUsUUFBQSxlQUFlLEdBQTJCO0lBQ3JELFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLFdBQVcsRUFBRSxhQUFhO0NBQzNCLENBQUM7QUFFVyxRQUFBLDRCQUE0QixHQUFHO0lBQzFDLEVBQUUsRUFBRSxRQUFRO0lBQ1osSUFBSSxFQUFFLFFBQVE7SUFDZCxTQUFTLEVBQUUsUUFBUTtJQUNuQixNQUFNLEVBQUUsU0FBUztJQUNqQixZQUFZLEVBQUUsUUFBUTtJQUN0QixXQUFXLEVBQUUsUUFBUTtJQUNyQixVQUFVLEVBQUUsTUFBTTtDQUNWLENBQUM7QUFFWCxTQUFnQixxQkFBcUI7SUFDbkMsT0FBTztRQUNMLEVBQUUsRUFBRTtZQUNGLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFLFFBQVE7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsZUFBZSxFQUFFLElBQUksR0FBRyxDQUFDLGdDQUFNLENBQUM7U0FDakM7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQ0FBVSxDQUFDO1NBQ3JDO1FBQ0QsV0FBVyxFQUFFO1lBQ1gsSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUUsUUFBUTtZQUNwQixlQUFlLEVBQUUsSUFBSSxHQUFHLEVB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
@@ -0,0 +1,15 @@
1
+ import type { ZendeskRecord } from '../../types';
2
+ import type { RecordData } from '@forestadmin/datasource-toolkit';
3
+ /**
4
+ * Map a raw Zendesk ticket payload to the Forest column layout exposed by TicketCollection.
5
+ *
6
+ * - Zendesk's `type` field is renamed `ticket_type` to avoid collision with the JS keyword.
7
+ * - Custom fields (`custom_fields: [{ id, value }]`) are flattened to columns named via the
8
+ * `customFieldIdToColumnName` map. Unknown custom field ids are silently ignored.
9
+ * - `requester_email` is provided by the caller through `emails` because the raw ticket
10
+ * payload only carries `requester_id`.
11
+ */
12
+ export declare function serializeTicket(ticket: ZendeskRecord, emails: Map<number, string>, customFieldIdToColumnName: Map<number, string>): RecordData;
13
+ export declare function serializeUser(user: ZendeskRecord): RecordData;
14
+ export declare function serializeOrganization(organization: ZendeskRecord): RecordData;
15
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeTicket = serializeTicket;
4
+ exports.serializeUser = serializeUser;
5
+ exports.serializeOrganization = serializeOrganization;
6
+ const TICKET_BASE_FIELDS = [
7
+ 'id',
8
+ 'subject',
9
+ 'description',
10
+ 'status',
11
+ 'priority',
12
+ 'requester_id',
13
+ 'assignee_id',
14
+ 'group_id',
15
+ 'organization_id',
16
+ 'external_id',
17
+ 'tags',
18
+ 'url',
19
+ 'created_at',
20
+ 'updated_at',
21
+ ];
22
+ /**
23
+ * Map a raw Zendesk ticket payload to the Forest column layout exposed by TicketCollection.
24
+ *
25
+ * - Zendesk's `type` field is renamed `ticket_type` to avoid collision with the JS keyword.
26
+ * - Custom fields (`custom_fields: [{ id, value }]`) are flattened to columns named via the
27
+ * `customFieldIdToColumnName` map. Unknown custom field ids are silently ignored.
28
+ * - `requester_email` is provided by the caller through `emails` because the raw ticket
29
+ * payload only carries `requester_id`.
30
+ */
31
+ function serializeTicket(ticket, emails, customFieldIdToColumnName) {
32
+ const record = {};
33
+ for (const key of TICKET_BASE_FIELDS) {
34
+ if (ticket[key] !== undefined)
35
+ record[key] = ticket[key];
36
+ }
37
+ record.ticket_type = ticket.type ?? null;
38
+ const requesterId = ticket.requester_id;
39
+ if (typeof requesterId === 'number' && emails.has(requesterId)) {
40
+ record.requester_email = emails.get(requesterId);
41
+ }
42
+ else {
43
+ record.requester_email = null;
44
+ }
45
+ const rawCustomFields = Array.isArray(ticket.custom_fields)
46
+ ? ticket.custom_fields
47
+ : [];
48
+ for (const entry of rawCustomFields) {
49
+ const columnName = customFieldIdToColumnName.get(entry.id);
50
+ if (columnName)
51
+ record[columnName] = entry.value;
52
+ }
53
+ return record;
54
+ }
55
+ function serializeUser(user) {
56
+ const record = {
57
+ id: user.id,
58
+ email: user.email,
59
+ name: user.name,
60
+ role: user.role,
61
+ phone: user.phone,
62
+ organization_id: user.organization_id,
63
+ time_zone: user.time_zone,
64
+ locale: user.locale,
65
+ verified: user.verified,
66
+ suspended: user.suspended,
67
+ created_at: user.created_at,
68
+ updated_at: user.updated_at,
69
+ };
70
+ const userFields = (user.user_fields ?? {});
71
+ for (const [key, value] of Object.entries(userFields)) {
72
+ if (record[key] === undefined)
73
+ record[key] = value;
74
+ }
75
+ return record;
76
+ }
77
+ function serializeOrganization(organization) {
78
+ const record = {
79
+ id: organization.id,
80
+ name: organization.name,
81
+ domain_names: organization.domain_names,
82
+ details: organization.details,
83
+ notes: organization.notes,
84
+ group_id: organization.group_id,
85
+ shared_tickets: organization.shared_tickets,
86
+ created_at: organization.created_at,
87
+ updated_at: organization.updated_at,
88
+ };
89
+ const orgFields = (organization.organization_fields ?? {});
90
+ for (const [key, value] of Object.entries(orgFields)) {
91
+ if (record[key] === undefined)
92
+ record[key] = value;
93
+ }
94
+ return record;
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy90aWNrZXQvc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZCQSwwQ0ErQkM7QUFFRCxzQ0F1QkM7QUFFRCxzREFvQkM7QUF4R0QsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixJQUFJO0lBQ0osU0FBUztJQUNULGFBQWE7SUFDYixRQUFRO0lBQ1IsVUFBVTtJQUNWLGNBQWM7SUFDZCxhQUFhO0lBQ2IsVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixhQUFhO0lBQ2IsTUFBTTtJQUNOLEtBQUs7SUFDTCxZQUFZO0lBQ1osWUFBWTtDQUNiLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsTUFBcUIsRUFDckIsTUFBMkIsRUFDM0IseUJBQThDO0lBRTlDLE1BQU0sTUFBTSxHQUFlLEVBQUUsQ0FBQztJQUU5QixLQUFLLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUztZQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUF1QixDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxHQUFJLE1BQU0sQ0FBQyxJQUEyQixJQUFJLElBQUksQ0FBQztJQUVqRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBRXhDLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNoQyxD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
@@ -0,0 +1,18 @@
1
+ import type { ZendeskClient } from '../client';
2
+ import type { CustomFieldEntry, ZendeskRecord } from '../types';
3
+ import type { Caller, DataSource, Filter, Logger, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
4
+ import BaseZendeskCollection from './base-zendesk-collection';
5
+ export default class TicketCollection extends BaseZendeskCollection {
6
+ private readonly customFields;
7
+ constructor(datasource: DataSource, client: ZendeskClient, customFields: CustomFieldEntry[], logger?: Logger);
8
+ list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
9
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
10
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
11
+ delete(caller: Caller, filter: Filter): Promise<void>;
12
+ protected findOne(id: number | string): Promise<ZendeskRecord | null>;
13
+ protected serializeRecord(record: ZendeskRecord): RecordData;
14
+ protected serializeForFilter(records: ZendeskRecord[]): Promise<RecordData[]>;
15
+ private filtersOnRequesterEmail;
16
+ private buildPayload;
17
+ }
18
+ //# sourceMappingURL=ticket-collection.d.ts.map
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const datasource_1 = require("../datasource");
7
+ const base_zendesk_collection_1 = __importDefault(require("./base-zendesk-collection"));
8
+ const comments_embedder_1 = require("./ticket/comments-embedder");
9
+ const relation_embedder_1 = require("./ticket/relation-embedder");
10
+ const schema_definition_1 = require("./ticket/schema-definition");
11
+ const serializer_1 = require("./ticket/serializer");
12
+ const READ_ONLY_INPUTS = new Set([
13
+ 'id',
14
+ 'url',
15
+ 'created_at',
16
+ 'updated_at',
17
+ 'requester_email',
18
+ 'comments',
19
+ 'requester',
20
+ 'assignee',
21
+ 'organization',
22
+ ]);
23
+ function collectIds(records, field) {
24
+ const ids = [];
25
+ for (const record of records) {
26
+ const value = record[field];
27
+ if (typeof value === 'number')
28
+ ids.push(value);
29
+ else if (typeof value === 'string' && !Number.isNaN(Number(value)))
30
+ ids.push(Number(value));
31
+ }
32
+ return Array.from(new Set(ids));
33
+ }
34
+ class TicketCollection extends base_zendesk_collection_1.default {
35
+ constructor(datasource, client, customFields, logger) {
36
+ super(datasource_1.COLLECTION_NAMES.ticket, datasource, client, 'ticket', schema_definition_1.TICKET_SORTABLE, logger);
37
+ this.customFields = customFields;
38
+ this.addFields((0, schema_definition_1.getTicketFieldSchemas)());
39
+ this.addCustomFields(customFields);
40
+ }
41
+ async list(caller, filter, projection) {
42
+ const ids = this.extractIdLookup(filter?.conditionTree);
43
+ const tickets = ids ? await this.fetchRecordsByIds(ids) : await this.searchRecords(filter);
44
+ const needsEmail = projection.includes('requester_email') ||
45
+ (ids !== null && this.filtersOnRequesterEmail(filter));
46
+ const emails = needsEmail
47
+ ? await this.client.fetchUserEmails(collectIds(tickets, 'requester_id'))
48
+ : new Map();
49
+ let records = tickets.map(ticket => (0, serializer_1.serializeTicket)(ticket, emails, this.zendeskIdToColumnName));
50
+ // The id-lookup path bypassed Zendesk Search, so honor the filter, sort and pagination here.
51
+ if (ids)
52
+ records = this.refine(records, filter, caller.timezone);
53
+ const relations = (0, relation_embedder_1.findRequestedRelations)(projection);
54
+ if (relations.requester || relations.assignee || relations.organization) {
55
+ await (0, relation_embedder_1.embedRelations)(records, relations, this.client);
56
+ }
57
+ if ((0, comments_embedder_1.isCommentsRequested)(projection)) {
58
+ await (0, comments_embedder_1.embedComments)(records, this.client);
59
+ }
60
+ return projection.apply(records);
61
+ }
62
+ async create(caller, data) {
63
+ const created = [];
64
+ for (const item of data) {
65
+ // eslint-disable-next-line no-await-in-loop
66
+ const raw = await this.client.createTicket(this.buildPayload(item, { onCreate: true }));
67
+ created.push((0, serializer_1.serializeTicket)(raw, new Map(), this.zendeskIdToColumnName));
68
+ }
69
+ return created;
70
+ }
71
+ async update(caller, filter, patch) {
72
+ const ids = await this.resolveIds(filter, caller.timezone);
73
+ const payload = this.buildPayload(patch, { onCreate: false });
74
+ for (const id of ids) {
75
+ // eslint-disable-next-line no-await-in-loop
76
+ await this.client.updateTicket(id, payload);
77
+ }
78
+ }
79
+ async delete(caller, filter) {
80
+ const ids = await this.resolveIds(filter, caller.timezone);
81
+ for (const id of ids) {
82
+ // eslint-disable-next-line no-await-in-loop
83
+ await this.client.deleteTicket(id);
84
+ }
85
+ }
86
+ findOne(id) {
87
+ return this.client.findTicket(id);
88
+ }
89
+ serializeRecord(record) {
90
+ return (0, serializer_1.serializeTicket)(record, new Map(), this.zendeskIdToColumnName);
91
+ }
92
+ // Resolve requester_email so scope/segment conditions on it are honored when filtering in memory.
93
+ async serializeForFilter(records) {
94
+ const emails = await this.client.fetchUserEmails(collectIds(records, 'requester_id'));
95
+ return records.map(record => (0, serializer_1.serializeTicket)(record, emails, this.zendeskIdToColumnName));
96
+ }
97
+ // ===== Helpers =====
98
+ filtersOnRequesterEmail(filter) {
99
+ return filter?.conditionTree?.someLeaf(leaf => leaf.field === 'requester_email') ?? false;
100
+ }
101
+ buildPayload(data, { onCreate }) {
102
+ const payload = {};
103
+ const customFields = [];
104
+ for (const [key, value] of Object.entries(data)) {
105
+ if (READ_ONLY_INPUTS.has(key)) {
106
+ // ignore read-only inputs
107
+ }
108
+ else if (key === 'description') {
109
+ // Zendesk derives `description` from the first comment; it can only be set at creation.
110
+ if (onCreate) {
111
+ payload.description = value;
112
+ }
113
+ else {
114
+ this.logger?.('Warn', `[datasource-zendesk] 'description' cannot be edited after creation; ignoring it.`);
115
+ }
116
+ }
117
+ else if (key === 'ticket_type') {
118
+ payload.type = value;
119
+ }
120
+ else {
121
+ const ticketCustomField = this.customFields.find(cf => cf.columnName === key);
122
+ if (ticketCustomField) {
123
+ customFields.push({ id: ticketCustomField.zendeskId, value });
124
+ }
125
+ else {
126
+ payload[key] = value;
127
+ }
128
+ }
129
+ }
130
+ if (customFields.length > 0)
131
+ payload.custom_fields = customFields;
132
+ if (onCreate && typeof data.description === 'string') {
133
+ payload.comment = { body: data.description };
134
+ }
135
+ return payload;
136
+ }
137
+ }
138
+ exports.default = TicketCollection;
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbnMvdGlja2V0LWNvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFZQSw4Q0FBaUQ7QUFDakQsd0ZBQThEO0FBQzlELGtFQUFnRjtBQUNoRixrRUFBb0Y7QUFDcEYsa0VBQW9GO0FBQ3BGLG9EQUFzRDtBQUV0RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQy9CLElBQUk7SUFDSixLQUFLO0lBQ0wsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsVUFBVTtJQUNWLFdBQVc7SUFDWCxVQUFVO0lBQ1YsY0FBYztDQUNmLENBQUMsQ0FBQztBQUVILFNBQVMsVUFBVSxDQUFDLE9BQXdCLEVBQUUsS0FBYTtJQUN6RCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFFekIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQXFCLGdCQUFpQixTQUFRLGlDQUFxQjtJQUdqRSxZQUNFLFVBQXNCLEVBQ3RCLE1BQXFCLEVBQ3JCLFlBQWdDLEVBQ2hDLE1B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
@@ -0,0 +1,15 @@
1
+ import type { ZendeskClient } from '../client';
2
+ import type { CustomFieldEntry, ZendeskRecord } from '../types';
3
+ import type { Caller, DataSource, Filter, Logger, RecordData } from '@forestadmin/datasource-toolkit';
4
+ import SearchableCollection from './searchable-collection';
5
+ export default class UserCollection extends SearchableCollection {
6
+ private readonly customFields;
7
+ constructor(datasource: DataSource, client: ZendeskClient, customFields: CustomFieldEntry[], logger?: Logger);
8
+ create(caller: Caller, data: RecordData[]): Promise<RecordData[]>;
9
+ update(caller: Caller, filter: Filter, patch: RecordData): Promise<void>;
10
+ delete(caller: Caller, filter: Filter): Promise<void>;
11
+ protected findOne(id: number | string): Promise<ZendeskRecord | null>;
12
+ protected serializeRecord(record: ZendeskRecord): RecordData;
13
+ private buildPayload;
14
+ }
15
+ //# sourceMappingURL=user-collection.d.ts.map
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const datasource_1 = require("../datasource");
7
+ const enums_1 = require("../enums");
8
+ const base_zendesk_collection_1 = require("./base-zendesk-collection");
9
+ const searchable_collection_1 = __importDefault(require("./searchable-collection"));
10
+ const serializer_1 = require("./ticket/serializer");
11
+ const SORTABLE = {
12
+ created_at: 'created_at',
13
+ updated_at: 'updated_at',
14
+ name: 'name',
15
+ };
16
+ const READ_ONLY_INPUTS = new Set(['id', 'created_at', 'updated_at']);
17
+ function getUserFieldSchemas() {
18
+ return {
19
+ id: {
20
+ type: 'Column',
21
+ columnType: 'Number',
22
+ isPrimaryKey: true,
23
+ isReadOnly: true,
24
+ isSortable: false,
25
+ filterOperators: new Set(base_zendesk_collection_1.ID_OPS),
26
+ },
27
+ email: {
28
+ type: 'Column',
29
+ columnType: 'String',
30
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
31
+ },
32
+ name: {
33
+ type: 'Column',
34
+ columnType: 'String',
35
+ isSortable: true,
36
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
37
+ },
38
+ role: {
39
+ type: 'Column',
40
+ columnType: 'Enum',
41
+ enumValues: [...enums_1.USER_ROLES],
42
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
43
+ },
44
+ phone: {
45
+ type: 'Column',
46
+ columnType: 'String',
47
+ filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
48
+ },
49
+ organization_id: {
50
+ type: 'Column',
51
+ columnType: 'Number',
52
+ filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
53
+ },
54
+ time_zone: {
55
+ type: 'Column',
56
+ columnType: 'String',
57
+ filterOperators: new Set(),
58
+ },
59
+ locale: {
60
+ type: 'Column',
61
+ columnType: 'String',
62
+ filterOperators: new Set(),
63
+ },
64
+ verified: {
65
+ type: 'Column',
66
+ columnType: 'Boolean',
67
+ filterOperators: new Set(base_zendesk_collection_1.BOOLEAN_OPS),
68
+ },
69
+ suspended: {
70
+ type: 'Column',
71
+ columnType: 'Boolean',
72
+ filterOperators: new Set(base_zendesk_collection_1.BOOLEAN_OPS),
73
+ },
74
+ created_at: {
75
+ type: 'Column',
76
+ columnType: 'Date',
77
+ isReadOnly: true,
78
+ isSortable: true,
79
+ filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
80
+ },
81
+ updated_at: {
82
+ type: 'Column',
83
+ columnType: 'Date',
84
+ isReadOnly: true,
85
+ isSortable: true,
86
+ filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
87
+ },
88
+ organization: {
89
+ type: 'ManyToOne',
90
+ foreignCollection: datasource_1.COLLECTION_NAMES.organization,
91
+ foreignKey: 'organization_id',
92
+ foreignKeyTarget: 'id',
93
+ },
94
+ requested_tickets: {
95
+ type: 'OneToMany',
96
+ foreignCollection: datasource_1.COLLECTION_NAMES.ticket,
97
+ originKey: 'requester_id',
98
+ originKeyTarget: 'id',
99
+ },
100
+ };
101
+ }
102
+ class UserCollection extends searchable_collection_1.default {
103
+ constructor(datasource, client, customFields, logger) {
104
+ super(datasource_1.COLLECTION_NAMES.user, datasource, client, 'user', SORTABLE, logger);
105
+ this.customFields = customFields;
106
+ this.addFields(getUserFieldSchemas());
107
+ this.addCustomFields(customFields);
108
+ }
109
+ async create(caller, data) {
110
+ const created = [];
111
+ for (const item of data) {
112
+ // eslint-disable-next-line no-await-in-loop
113
+ const raw = await this.client.createUser(this.buildPayload(item));
114
+ created.push((0, serializer_1.serializeUser)(raw));
115
+ }
116
+ return created;
117
+ }
118
+ async update(caller, filter, patch) {
119
+ const ids = await this.resolveIds(filter, caller.timezone);
120
+ const payload = this.buildPayload(patch);
121
+ for (const id of ids) {
122
+ // eslint-disable-next-line no-await-in-loop
123
+ await this.client.updateUser(id, payload);
124
+ }
125
+ }
126
+ async delete(caller, filter) {
127
+ const ids = await this.resolveIds(filter, caller.timezone);
128
+ for (const id of ids) {
129
+ // eslint-disable-next-line no-await-in-loop
130
+ await this.client.deleteUser(id);
131
+ }
132
+ }
133
+ findOne(id) {
134
+ return this.client.findUser(id);
135
+ }
136
+ serializeRecord(record) {
137
+ return (0, serializer_1.serializeUser)(record);
138
+ }
139
+ buildPayload(data) {
140
+ const payload = {};
141
+ const userFields = {};
142
+ for (const [key, value] of Object.entries(data)) {
143
+ if (READ_ONLY_INPUTS.has(key) || key === 'requested_tickets' || key === 'organization') {
144
+ // ignored
145
+ }
146
+ else {
147
+ const customField = this.customFields.find(cf => cf.columnName === key);
148
+ if (customField?.zendeskKey) {
149
+ userFields[customField.zendeskKey] = value;
150
+ }
151
+ else {
152
+ payload[key] = value;
153
+ }
154
+ }
155
+ }
156
+ if (Object.keys(userFields).length > 0)
157
+ payload.user_fields = userFields;
158
+ return payload;
159
+ }
160
+ }
161
+ exports.default = UserCollection;
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbGxlY3Rpb25zL3VzZXItY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVdBLDhDQUFpRDtBQUNqRCxvQ0FBc0M7QUFDdEMsdUVBQWtHO0FBQ2xHLG9GQUEyRDtBQUMzRCxvREFBb0Q7QUFFcEQsTUFBTSxRQUFRLEdBQTJCO0lBQ3ZDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFckUsU0FBUyxtQkFBbUI7SUFDMUIsT0FBTztRQUNMLEVBQUUsRUFBRTtZQUNGLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFLFFBQVE7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLEtBQUs7WUFDakIsZUFBZSxFQUFFLElBQUksR0FBRyxDQUFDLGdDQUFNLENBQUM7U0FDakM7UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGVBQWUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQ0FBVSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUUsUUFBUTtZQUNwQixVQUFVLEVBQUUsSUFBSTtZQUNoQixlQUFlLEVBQUUsSUFBSSxHQUFHLENBQUMsb0NBQVUsQ0FBQztTQUNyQztRQUNELElBQUksRUFBRTtZQUNKLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFLE1BQU07WUFDbEIsVUFBVSxFQUFFLENBQUMsR0FBRyxrQkFBVSxDQUFDO1lBQzNC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
@@ -0,0 +1,16 @@
1
+ import type { ZendeskClient } from './client';
2
+ import type { CustomFieldMapping } from './types';
3
+ import type { Logger } from '@forestadmin/datasource-toolkit';
4
+ import { BaseDataSource } from '@forestadmin/datasource-toolkit';
5
+ export declare const COLLECTION_NAMES: {
6
+ readonly ticket: "zendesk_ticket";
7
+ readonly user: "zendesk_user";
8
+ readonly organization: "zendesk_organization";
9
+ };
10
+ export default class ZendeskDataSource extends BaseDataSource {
11
+ readonly client: ZendeskClient;
12
+ readonly customFieldMapping: CustomFieldMapping;
13
+ static create(client: ZendeskClient, logger?: Logger): Promise<ZendeskDataSource>;
14
+ private constructor();
15
+ }
16
+ //# sourceMappingURL=datasource.d.ts.map