@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.
- package/README.md +162 -0
- package/dist/client/index.d.ts +91 -0
- package/dist/client/index.js +243 -0
- package/dist/client-options.d.ts +16 -0
- package/dist/client-options.js +10 -0
- package/dist/collections/base-zendesk-collection.d.ts +52 -0
- package/dist/collections/base-zendesk-collection.js +203 -0
- package/dist/collections/organization-collection.d.ts +15 -0
- package/dist/collections/organization-collection.js +145 -0
- package/dist/collections/searchable-collection.d.ts +6 -0
- package/dist/collections/searchable-collection.js +20 -0
- package/dist/collections/ticket/comments-embedder.d.ts +5 -0
- package/dist/collections/ticket/comments-embedder.js +40 -0
- package/dist/collections/ticket/relation-embedder.d.ts +10 -0
- package/dist/collections/ticket/relation-embedder.js +62 -0
- package/dist/collections/ticket/schema-definition.d.ts +13 -0
- package/dist/collections/ticket/schema-definition.js +147 -0
- package/dist/collections/ticket/serializer.d.ts +15 -0
- package/dist/collections/ticket/serializer.js +96 -0
- package/dist/collections/ticket-collection.d.ts +18 -0
- package/dist/collections/ticket-collection.js +139 -0
- package/dist/collections/user-collection.d.ts +15 -0
- package/dist/collections/user-collection.js +162 -0
- package/dist/datasource.d.ts +16 -0
- package/dist/datasource.js +49 -0
- package/dist/enums.d.ts +10 -0
- package/dist/enums.js +12 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.js +31 -0
- package/dist/factory.d.ts +5 -0
- package/dist/factory.js +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +30 -0
- package/dist/plugins/close-ticket/errors.d.ts +7 -0
- package/dist/plugins/close-ticket/errors.js +44 -0
- package/dist/plugins/close-ticket/index.d.ts +13 -0
- package/dist/plugins/close-ticket/index.js +74 -0
- package/dist/plugins/close-ticket/messages.d.ts +12 -0
- package/dist/plugins/close-ticket/messages.js +33 -0
- package/dist/plugins/create-ticket-with-notification/form-builder.d.ts +30 -0
- package/dist/plugins/create-ticket-with-notification/form-builder.js +179 -0
- package/dist/plugins/create-ticket-with-notification/index.d.ts +19 -0
- package/dist/plugins/create-ticket-with-notification/index.js +81 -0
- package/dist/query/condition-tree-translator.d.ts +9 -0
- package/dist/query/condition-tree-translator.js +90 -0
- package/dist/query/operators.d.ts +15 -0
- package/dist/query/operators.js +34 -0
- package/dist/schema/custom-fields-introspector.d.ts +13 -0
- package/dist/schema/custom-fields-introspector.js +89 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.js +3 -0
- package/package.json +33 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { EmailTemplate, FormBuilderOptions } from './form-builder';
|
|
2
|
+
import type { ZendeskClientProvider } from '../../client-options';
|
|
3
|
+
import type { TicketPriority, TicketType } from '../../enums';
|
|
4
|
+
import type { Plugin } from '@forestadmin/datasource-customizer';
|
|
5
|
+
export type { EmailTemplate };
|
|
6
|
+
export type CreateTicketWithNotificationOptions = {
|
|
7
|
+
actionName?: string;
|
|
8
|
+
emailTemplates?: EmailTemplate[];
|
|
9
|
+
requesterEmailDefault?: FormBuilderOptions['requesterEmailDefault'];
|
|
10
|
+
defaultSubject?: FormBuilderOptions['defaultSubject'];
|
|
11
|
+
defaultMessage?: FormBuilderOptions['defaultMessage'];
|
|
12
|
+
priorityOverride?: TicketPriority;
|
|
13
|
+
typeOverride?: TicketType;
|
|
14
|
+
senderEmail?: string;
|
|
15
|
+
ticketIdField?: string;
|
|
16
|
+
showInternalNote?: boolean;
|
|
17
|
+
} & ZendeskClientProvider;
|
|
18
|
+
export declare const createTicketWithNotificationPlugin: Plugin<CreateTicketWithNotificationOptions>;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTicketWithNotificationPlugin = void 0;
|
|
4
|
+
const form_builder_1 = require("./form-builder");
|
|
5
|
+
const client_options_1 = require("../../client-options");
|
|
6
|
+
function stringValue(value) {
|
|
7
|
+
if (typeof value === 'string' && value.length > 0)
|
|
8
|
+
return value;
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
function deriveName(email) {
|
|
12
|
+
const at = email.indexOf('@');
|
|
13
|
+
return at > 0 ? email.substring(0, at) : email;
|
|
14
|
+
}
|
|
15
|
+
async function tryWritebackTicketId(context, field, ticketId) {
|
|
16
|
+
try {
|
|
17
|
+
await context.collection.update(context.filter, { [field]: ticketId });
|
|
18
|
+
return '';
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
return `(Warning: failed to write ticket id back to '${field}': ${error instanceof Error ? error.message : String(error)})`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const createTicketWithNotificationPlugin = async (_dataSource, collection, options, logger) => {
|
|
25
|
+
if (!collection) {
|
|
26
|
+
throw new Error('createTicketWithNotificationPlugin can only be used on collections.');
|
|
27
|
+
}
|
|
28
|
+
if (!options) {
|
|
29
|
+
throw new Error('createTicketWithNotificationPlugin requires options.');
|
|
30
|
+
}
|
|
31
|
+
const client = (0, client_options_1.resolveZendeskClient)(options, logger);
|
|
32
|
+
const actionName = options.actionName ?? 'Create ticket and notify';
|
|
33
|
+
collection.addAction(actionName, {
|
|
34
|
+
scope: 'Single',
|
|
35
|
+
form: (0, form_builder_1.buildForm)(options),
|
|
36
|
+
execute: async (context, resultBuilder) => {
|
|
37
|
+
const { formValues } = context;
|
|
38
|
+
const requesterEmail = stringValue(formValues[form_builder_1.FORM_FIELDS.requesterEmail]);
|
|
39
|
+
if (!requesterEmail) {
|
|
40
|
+
return resultBuilder.error('Requester email is required.');
|
|
41
|
+
}
|
|
42
|
+
const internalNote = options.showInternalNote
|
|
43
|
+
? Boolean(formValues[form_builder_1.FORM_FIELDS.internalNote])
|
|
44
|
+
: false;
|
|
45
|
+
const payload = {
|
|
46
|
+
requester: { email: requesterEmail, name: deriveName(requesterEmail) },
|
|
47
|
+
subject: stringValue(formValues[form_builder_1.FORM_FIELDS.subject]),
|
|
48
|
+
comment: {
|
|
49
|
+
html_body: stringValue(formValues[form_builder_1.FORM_FIELDS.message]) ?? '',
|
|
50
|
+
public: !internalNote,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const priority = options.priorityOverride ?? stringValue(formValues[form_builder_1.FORM_FIELDS.priority]);
|
|
54
|
+
if (priority)
|
|
55
|
+
payload.priority = priority;
|
|
56
|
+
const type = options.typeOverride ?? stringValue(formValues[form_builder_1.FORM_FIELDS.type]);
|
|
57
|
+
if (type)
|
|
58
|
+
payload.type = type;
|
|
59
|
+
if (options.senderEmail)
|
|
60
|
+
payload.recipient = options.senderEmail;
|
|
61
|
+
let created;
|
|
62
|
+
try {
|
|
63
|
+
created = await client.createTicket(payload);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return resultBuilder.error(`Failed to create Zendesk ticket: ${error instanceof Error ? error.message : String(error)}`);
|
|
67
|
+
}
|
|
68
|
+
const ticketId = created.id;
|
|
69
|
+
let writebackWarning = '';
|
|
70
|
+
if (options.ticketIdField && (typeof ticketId === 'number' || typeof ticketId === 'string')) {
|
|
71
|
+
writebackWarning = await tryWritebackTicketId(context, options.ticketIdField, ticketId);
|
|
72
|
+
}
|
|
73
|
+
const baseMessage = internalNote
|
|
74
|
+
? `Ticket #${ticketId} created (internal note, no email).`
|
|
75
|
+
: `Ticket #${ticketId} created and requester notified.`;
|
|
76
|
+
return resultBuilder.success(writebackWarning ? `${baseMessage} ${writebackWarning}` : baseMessage);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
exports.createTicketWithNotificationPlugin = createTicketWithNotificationPlugin;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGx1Z2lucy9jcmVhdGUtdGlja2V0LXdpdGgtbm90aWZpY2F0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLGlEQUF3RDtBQUN4RCx5REFBNEQ7QUFpQjVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFaEUsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU5QixPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDakQsQ0FBQztBQUVELEtBQUssVUFBVSxvQkFBb0IsQ0FDakMsT0FBNEIsRUFDNUIsS0FBYSxFQUNiLFFBQXlCO0lBRXpCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV2RSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxnREFBZ0QsS0FBSyxNQUMxRCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2RCxHQUFHLENBQUM7SUFDTixDQUFDO0FBQ0gsQ0FBQztBQUVNLE1BQU0sa0NBQWtD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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CustomFieldMapping, ZendeskResource } from '../types';
|
|
2
|
+
import type { ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export type TranslateOptions = {
|
|
4
|
+
resource: ZendeskResource;
|
|
5
|
+
customFieldMapping?: CustomFieldMapping;
|
|
6
|
+
timezone?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function translateConditionTree(tree: ConditionTree | undefined, options: TranslateOptions): string;
|
|
9
|
+
//# sourceMappingURL=condition-tree-translator.d.ts.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.translateConditionTree = translateConditionTree;
|
|
4
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const SPECIAL_CHARS_PATTERN = /[\s"():-]/;
|
|
7
|
+
function ensureNonEmptyArray(value, operator) {
|
|
8
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
9
|
+
throw new errors_1.UnsupportedOperatorError(`Operator '${operator}' requires a non-empty array value.`);
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
function formatValue(value) {
|
|
14
|
+
if (value instanceof Date)
|
|
15
|
+
return value.toISOString();
|
|
16
|
+
if (typeof value === 'boolean')
|
|
17
|
+
return value ? 'true' : 'false';
|
|
18
|
+
if (typeof value === 'number')
|
|
19
|
+
return String(value);
|
|
20
|
+
const stringValue = String(value);
|
|
21
|
+
if (SPECIAL_CHARS_PATTERN.test(stringValue)) {
|
|
22
|
+
return `"${stringValue.replace(/"/g, '\\"')}"`;
|
|
23
|
+
}
|
|
24
|
+
return stringValue;
|
|
25
|
+
}
|
|
26
|
+
function mapFieldName(field, operator, options) {
|
|
27
|
+
// Tickets expose `requester_email` as a derived field; on the Zendesk Search side it is
|
|
28
|
+
// queried through the `requester` shortcut, but only with an equality match.
|
|
29
|
+
if (options.resource === 'ticket' && field === 'requester_email') {
|
|
30
|
+
if (operator !== 'Equal') {
|
|
31
|
+
throw new errors_1.UnsupportedOperatorError(`'requester_email' on tickets only supports the 'Equal' operator (got '${operator}').`);
|
|
32
|
+
}
|
|
33
|
+
return 'requester';
|
|
34
|
+
}
|
|
35
|
+
return options.customFieldMapping?.get(field) ?? field;
|
|
36
|
+
}
|
|
37
|
+
function translateLeaf(leaf, options) {
|
|
38
|
+
const fieldName = mapFieldName(leaf.field, leaf.operator, options);
|
|
39
|
+
const { operator, value } = leaf;
|
|
40
|
+
if (operator === 'Present')
|
|
41
|
+
return `${fieldName}:*`;
|
|
42
|
+
if (operator === 'Blank')
|
|
43
|
+
return `-${fieldName}:*`;
|
|
44
|
+
if (value === null || value === undefined) {
|
|
45
|
+
throw new errors_1.UnsupportedOperatorError(`Operator '${operator}' with null/undefined value is not supported by Zendesk Search.`);
|
|
46
|
+
}
|
|
47
|
+
switch (operator) {
|
|
48
|
+
case 'Equal':
|
|
49
|
+
return `${fieldName}:${formatValue(value)}`;
|
|
50
|
+
case 'NotEqual':
|
|
51
|
+
return `-${fieldName}:${formatValue(value)}`;
|
|
52
|
+
case 'In': {
|
|
53
|
+
const list = ensureNonEmptyArray(value, operator);
|
|
54
|
+
return list.map(v => `${fieldName}:${formatValue(v)}`).join(' ');
|
|
55
|
+
}
|
|
56
|
+
case 'NotIn': {
|
|
57
|
+
const list = ensureNonEmptyArray(value, operator);
|
|
58
|
+
return list.map(v => `-${fieldName}:${formatValue(v)}`).join(' ');
|
|
59
|
+
}
|
|
60
|
+
case 'GreaterThan':
|
|
61
|
+
case 'After':
|
|
62
|
+
return `${fieldName}>${formatValue(value)}`;
|
|
63
|
+
case 'LessThan':
|
|
64
|
+
case 'Before':
|
|
65
|
+
return `${fieldName}<${formatValue(value)}`;
|
|
66
|
+
default:
|
|
67
|
+
throw new errors_1.UnsupportedOperatorError(`Operator '${operator}' is not supported by Zendesk Search.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function translateNode(tree, options) {
|
|
71
|
+
if (tree instanceof datasource_toolkit_1.ConditionTreeBranch) {
|
|
72
|
+
if (tree.aggregator !== 'And') {
|
|
73
|
+
throw new errors_1.UnsupportedOperatorError(`Zendesk Search does not support the '${tree.aggregator}' aggregator. Only 'And' is supported.`);
|
|
74
|
+
}
|
|
75
|
+
return tree.conditions
|
|
76
|
+
.map(condition => translateNode(condition, options))
|
|
77
|
+
.filter(part => part.length > 0)
|
|
78
|
+
.join(' ');
|
|
79
|
+
}
|
|
80
|
+
if (tree instanceof datasource_toolkit_1.ConditionTreeLeaf) {
|
|
81
|
+
return translateLeaf(tree, options);
|
|
82
|
+
}
|
|
83
|
+
throw new errors_1.UnsupportedOperatorError(`Unknown condition tree node: ${tree.constructor.name}`);
|
|
84
|
+
}
|
|
85
|
+
function translateConditionTree(tree, options) {
|
|
86
|
+
if (!tree)
|
|
87
|
+
return '';
|
|
88
|
+
return translateNode(tree, options).trim();
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXRyZWUtdHJhbnNsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyeS9jb25kaXRpb24tdHJlZS10cmFuc2xhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0hBLHdEQU9DO0FBNUhELHdFQUF5RjtBQUV6RixzQ0FBcUQ7QUFRckQsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUM7QUFFMUMsU0FBUyxtQkFBbUIsQ0FBQyxLQUFjLEVBQUUsUUFBZ0I7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksaUNBQXdCLENBQUMsYUFBYSxRQUFRLHFDQUFxQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsSUFBSSxLQUFLLFlBQVksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRXRELElBQUksT0FBTyxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUVoRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEMsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNB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
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator vocabularies supported by the Zendesk Search API, declared once and shared by
|
|
3
|
+
* the static collection schemas and the custom-field introspector so the two can never drift.
|
|
4
|
+
*
|
|
5
|
+
* `In`/`NotIn` are advertised so the operators-equivalence decorator does not rewrite them into
|
|
6
|
+
* an `Or` tree (which the translator cannot express — Zendesk Search has no `OR`). Zendesk treats
|
|
7
|
+
* the resulting terms as a conjunction, so multi-value membership on Search-resolved fields is a
|
|
8
|
+
* known limitation; only the primary key matches each value exactly, via the id-lookup path.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ID_OPS: Set<"Equal" | "NotEqual" | "LessThan" | "GreaterThan" | "LessThanOrEqual" | "GreaterThanOrEqual" | "Match" | "NotContains" | "NotIContains" | "LongerThan" | "ShorterThan" | "IncludesAll" | "IncludesNone" | "Today" | "Yesterday" | "PreviousMonth" | "PreviousQuarter" | "PreviousWeek" | "PreviousYear" | "PreviousMonthToDate" | "PreviousQuarterToDate" | "PreviousWeekToDate" | "PreviousXDaysToDate" | "PreviousXDays" | "PreviousYearToDate" | "Present" | "Blank" | "Missing" | "In" | "NotIn" | "StartsWith" | "EndsWith" | "Contains" | "IStartsWith" | "IEndsWith" | "IContains" | "Like" | "ILike" | "Before" | "After" | "AfterXHoursAgo" | "BeforeXHoursAgo" | "Future" | "Past">;
|
|
11
|
+
export declare const STRING_OPS: Set<"Equal" | "NotEqual" | "LessThan" | "GreaterThan" | "LessThanOrEqual" | "GreaterThanOrEqual" | "Match" | "NotContains" | "NotIContains" | "LongerThan" | "ShorterThan" | "IncludesAll" | "IncludesNone" | "Today" | "Yesterday" | "PreviousMonth" | "PreviousQuarter" | "PreviousWeek" | "PreviousYear" | "PreviousMonthToDate" | "PreviousQuarterToDate" | "PreviousWeekToDate" | "PreviousXDaysToDate" | "PreviousXDays" | "PreviousYearToDate" | "Present" | "Blank" | "Missing" | "In" | "NotIn" | "StartsWith" | "EndsWith" | "Contains" | "IStartsWith" | "IEndsWith" | "IContains" | "Like" | "ILike" | "Before" | "After" | "AfterXHoursAgo" | "BeforeXHoursAgo" | "Future" | "Past">;
|
|
12
|
+
export declare const NUMBER_OPS: Set<"Equal" | "NotEqual" | "LessThan" | "GreaterThan" | "LessThanOrEqual" | "GreaterThanOrEqual" | "Match" | "NotContains" | "NotIContains" | "LongerThan" | "ShorterThan" | "IncludesAll" | "IncludesNone" | "Today" | "Yesterday" | "PreviousMonth" | "PreviousQuarter" | "PreviousWeek" | "PreviousYear" | "PreviousMonthToDate" | "PreviousQuarterToDate" | "PreviousWeekToDate" | "PreviousXDaysToDate" | "PreviousXDays" | "PreviousYearToDate" | "Present" | "Blank" | "Missing" | "In" | "NotIn" | "StartsWith" | "EndsWith" | "Contains" | "IStartsWith" | "IEndsWith" | "IContains" | "Like" | "ILike" | "Before" | "After" | "AfterXHoursAgo" | "BeforeXHoursAgo" | "Future" | "Past">;
|
|
13
|
+
export declare const DATE_OPS: Set<"Equal" | "NotEqual" | "LessThan" | "GreaterThan" | "LessThanOrEqual" | "GreaterThanOrEqual" | "Match" | "NotContains" | "NotIContains" | "LongerThan" | "ShorterThan" | "IncludesAll" | "IncludesNone" | "Today" | "Yesterday" | "PreviousMonth" | "PreviousQuarter" | "PreviousWeek" | "PreviousYear" | "PreviousMonthToDate" | "PreviousQuarterToDate" | "PreviousWeekToDate" | "PreviousXDaysToDate" | "PreviousXDays" | "PreviousYearToDate" | "Present" | "Blank" | "Missing" | "In" | "NotIn" | "StartsWith" | "EndsWith" | "Contains" | "IStartsWith" | "IEndsWith" | "IContains" | "Like" | "ILike" | "Before" | "After" | "AfterXHoursAgo" | "BeforeXHoursAgo" | "Future" | "Past">;
|
|
14
|
+
export declare const BOOLEAN_OPS: Set<"Equal" | "NotEqual" | "LessThan" | "GreaterThan" | "LessThanOrEqual" | "GreaterThanOrEqual" | "Match" | "NotContains" | "NotIContains" | "LongerThan" | "ShorterThan" | "IncludesAll" | "IncludesNone" | "Today" | "Yesterday" | "PreviousMonth" | "PreviousQuarter" | "PreviousWeek" | "PreviousYear" | "PreviousMonthToDate" | "PreviousQuarterToDate" | "PreviousWeekToDate" | "PreviousXDaysToDate" | "PreviousXDays" | "PreviousYearToDate" | "Present" | "Blank" | "Missing" | "In" | "NotIn" | "StartsWith" | "EndsWith" | "Contains" | "IStartsWith" | "IEndsWith" | "IContains" | "Like" | "ILike" | "Before" | "After" | "AfterXHoursAgo" | "BeforeXHoursAgo" | "Future" | "Past">;
|
|
15
|
+
//# sourceMappingURL=operators.d.ts.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BOOLEAN_OPS = exports.DATE_OPS = exports.NUMBER_OPS = exports.STRING_OPS = exports.ID_OPS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Operator vocabularies supported by the Zendesk Search API, declared once and shared by
|
|
6
|
+
* the static collection schemas and the custom-field introspector so the two can never drift.
|
|
7
|
+
*
|
|
8
|
+
* `In`/`NotIn` are advertised so the operators-equivalence decorator does not rewrite them into
|
|
9
|
+
* an `Or` tree (which the translator cannot express — Zendesk Search has no `OR`). Zendesk treats
|
|
10
|
+
* the resulting terms as a conjunction, so multi-value membership on Search-resolved fields is a
|
|
11
|
+
* known limitation; only the primary key matches each value exactly, via the id-lookup path.
|
|
12
|
+
*/
|
|
13
|
+
exports.ID_OPS = new Set(['Equal', 'In']);
|
|
14
|
+
exports.STRING_OPS = new Set([
|
|
15
|
+
'Equal',
|
|
16
|
+
'NotEqual',
|
|
17
|
+
'In',
|
|
18
|
+
'NotIn',
|
|
19
|
+
'Present',
|
|
20
|
+
'Blank',
|
|
21
|
+
]);
|
|
22
|
+
exports.NUMBER_OPS = new Set([
|
|
23
|
+
'Equal',
|
|
24
|
+
'NotEqual',
|
|
25
|
+
'In',
|
|
26
|
+
'NotIn',
|
|
27
|
+
'Present',
|
|
28
|
+
'Blank',
|
|
29
|
+
'GreaterThan',
|
|
30
|
+
'LessThan',
|
|
31
|
+
]);
|
|
32
|
+
exports.DATE_OPS = new Set(['Equal', 'Before', 'After', 'Present', 'Blank']);
|
|
33
|
+
exports.BOOLEAN_OPS = new Set(['Equal', 'NotEqual']);
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3F1ZXJ5L29wZXJhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7Ozs7R0FRRztBQUNVLFFBQUEsTUFBTSxHQUFHLElBQUksR0FBRyxDQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFNUMsUUFBQSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQVc7SUFDMUMsT0FBTztJQUNQLFVBQVU7SUFDVixJQUFJO0lBQ0osT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0NBQ1IsQ0FBQyxDQUFDO0FBRVUsUUFBQSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQVc7SUFDMUMsT0FBTztJQUNQLFVBQVU7SUFDVixJQUFJO0lBQ0osT0FBTztJQUNQLFNBQVM7SUFDVCxPQUFPO0lBQ1AsYUFBYTtJQUNiLFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFVSxRQUFBLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBRS9FLFFBQUEsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ZendeskClient } from '../client';
|
|
2
|
+
import type { CustomFieldEntry } from '../types';
|
|
3
|
+
import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
4
|
+
export declare class CustomFieldsIntrospector {
|
|
5
|
+
private readonly client;
|
|
6
|
+
private readonly logger?;
|
|
7
|
+
constructor(client: ZendeskClient, logger?: Logger);
|
|
8
|
+
ticketCustomFields(): Promise<CustomFieldEntry[]>;
|
|
9
|
+
userCustomFields(): Promise<CustomFieldEntry[]>;
|
|
10
|
+
organizationCustomFields(): Promise<CustomFieldEntry[]>;
|
|
11
|
+
private toEntry;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=custom-fields-introspector.d.ts.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CustomFieldsIntrospector = void 0;
|
|
4
|
+
const operators_1 = require("../query/operators");
|
|
5
|
+
function column(columnType, operators) {
|
|
6
|
+
return {
|
|
7
|
+
type: 'Column',
|
|
8
|
+
columnType,
|
|
9
|
+
filterOperators: new Set(operators),
|
|
10
|
+
isReadOnly: false,
|
|
11
|
+
isSortable: false,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function enumColumn(field) {
|
|
15
|
+
const enumValues = (field.custom_field_options ?? [])
|
|
16
|
+
.map(option => option.value)
|
|
17
|
+
.filter(value => typeof value === 'string' && value.length > 0);
|
|
18
|
+
if (enumValues.length === 0)
|
|
19
|
+
return column('String', operators_1.STRING_OPS);
|
|
20
|
+
return { ...column('Enum', operators_1.STRING_OPS), enumValues };
|
|
21
|
+
}
|
|
22
|
+
function toColumnSchema(field) {
|
|
23
|
+
switch (field.type) {
|
|
24
|
+
case 'text':
|
|
25
|
+
case 'textarea':
|
|
26
|
+
case 'regexp':
|
|
27
|
+
case 'partialcreditcard':
|
|
28
|
+
return column('String', operators_1.STRING_OPS);
|
|
29
|
+
case 'integer':
|
|
30
|
+
case 'decimal':
|
|
31
|
+
case 'lookup':
|
|
32
|
+
return column('Number', operators_1.NUMBER_OPS);
|
|
33
|
+
case 'date':
|
|
34
|
+
return column('Dateonly', operators_1.DATE_OPS);
|
|
35
|
+
case 'checkbox':
|
|
36
|
+
return column('Boolean', operators_1.BOOLEAN_OPS);
|
|
37
|
+
case 'multiselect':
|
|
38
|
+
return { ...column('Json', new Set()), isGroupable: false };
|
|
39
|
+
case 'dropdown':
|
|
40
|
+
case 'tagger':
|
|
41
|
+
return enumColumn(field);
|
|
42
|
+
default:
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
47
|
+
class CustomFieldsIntrospector {
|
|
48
|
+
constructor(client, logger) {
|
|
49
|
+
this.client = client;
|
|
50
|
+
this.logger = logger;
|
|
51
|
+
}
|
|
52
|
+
async ticketCustomFields() {
|
|
53
|
+
const fields = await this.client.fetchTicketFields();
|
|
54
|
+
return fields
|
|
55
|
+
.filter(field => field.active && field.removable)
|
|
56
|
+
.map(field => this.toEntry(field, 'ticket'))
|
|
57
|
+
.filter((entry) => entry !== null);
|
|
58
|
+
}
|
|
59
|
+
async userCustomFields() {
|
|
60
|
+
const fields = await this.client.fetchUserFields();
|
|
61
|
+
return fields
|
|
62
|
+
.filter(field => field.active)
|
|
63
|
+
.map(field => this.toEntry(field, 'user'))
|
|
64
|
+
.filter((entry) => entry !== null);
|
|
65
|
+
}
|
|
66
|
+
async organizationCustomFields() {
|
|
67
|
+
const fields = await this.client.fetchOrganizationFields();
|
|
68
|
+
return fields
|
|
69
|
+
.filter(field => field.active)
|
|
70
|
+
.map(field => this.toEntry(field, 'organization'))
|
|
71
|
+
.filter((entry) => entry !== null);
|
|
72
|
+
}
|
|
73
|
+
toEntry(field, kind) {
|
|
74
|
+
const schema = toColumnSchema(field);
|
|
75
|
+
if (!schema) {
|
|
76
|
+
this.logger?.('Warn', `[datasource-zendesk] Skipping custom field ${field.id} (${field.type}): unsupported type`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const columnName = kind === 'ticket' ? `custom_${field.id}` : field.key ?? `custom_${field.id}`;
|
|
80
|
+
return {
|
|
81
|
+
columnName,
|
|
82
|
+
zendeskId: field.id,
|
|
83
|
+
zendeskKey: field.key,
|
|
84
|
+
schema,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.CustomFieldsIntrospector = CustomFieldsIntrospector;
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWZpZWxkcy1pbnRyb3NwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hL2N1c3RvbS1maWVsZHMtaW50cm9zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLGtEQUFtRjtBQUluRixTQUFTLE1BQU0sQ0FBQyxVQUFzQyxFQUFFLFNBQXdCO0lBQzlFLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVU7UUFDVixlQUFlLEVBQUUsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ25DLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBK0I7SUFDakQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1NBQ2xELEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFbEUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsc0JBQVUsQ0FBQyxDQUFDO0lBRWpFLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsc0JBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUErQjtJQUNyRCxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxtQkFBbUI7WUFDdEIsT0FB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
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ColumnSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export type ZendeskClientOptions = {
|
|
3
|
+
subdomain: string;
|
|
4
|
+
email: string;
|
|
5
|
+
apiToken: string;
|
|
6
|
+
};
|
|
7
|
+
export type ZendeskResource = 'ticket' | 'user' | 'organization';
|
|
8
|
+
export type SearchParams = {
|
|
9
|
+
query: string;
|
|
10
|
+
page?: number;
|
|
11
|
+
perPage?: number;
|
|
12
|
+
sortBy?: string;
|
|
13
|
+
sortOrder?: 'asc' | 'desc';
|
|
14
|
+
};
|
|
15
|
+
export type ZendeskRecord = Record<string, unknown>;
|
|
16
|
+
export type CustomFieldEntry = {
|
|
17
|
+
columnName: string;
|
|
18
|
+
zendeskId: number;
|
|
19
|
+
zendeskKey?: string;
|
|
20
|
+
schema: ColumnSchema;
|
|
21
|
+
};
|
|
22
|
+
export type CustomFieldMapping = Map<string, string>;
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@forestadmin/datasource-zendesk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"license": "GPL-3.0",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/ForestAdmin/agent-nodejs.git",
|
|
12
|
+
"directory": "packages/datasource-zendesk"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@forestadmin/datasource-toolkit": "1.53.1",
|
|
16
|
+
"superagent": "^10.3.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@forestadmin/datasource-customizer": "1.69.3",
|
|
20
|
+
"@types/superagent": "^8.1.0"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist/**/*.js",
|
|
24
|
+
"dist/**/*.d.ts"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"build:watch": "tsc --watch",
|
|
29
|
+
"clean": "rm -rf coverage dist",
|
|
30
|
+
"lint": "eslint src test",
|
|
31
|
+
"test": "jest"
|
|
32
|
+
}
|
|
33
|
+
}
|