@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,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STRING_OPS = exports.NUMBER_OPS = exports.ID_OPS = exports.DATE_OPS = exports.BOOLEAN_OPS = void 0;
|
|
4
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
5
|
+
const client_1 = require("../client");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
const condition_tree_translator_1 = require("../query/condition-tree-translator");
|
|
8
|
+
var operators_1 = require("../query/operators");
|
|
9
|
+
Object.defineProperty(exports, "BOOLEAN_OPS", { enumerable: true, get: function () { return operators_1.BOOLEAN_OPS; } });
|
|
10
|
+
Object.defineProperty(exports, "DATE_OPS", { enumerable: true, get: function () { return operators_1.DATE_OPS; } });
|
|
11
|
+
Object.defineProperty(exports, "ID_OPS", { enumerable: true, get: function () { return operators_1.ID_OPS; } });
|
|
12
|
+
Object.defineProperty(exports, "NUMBER_OPS", { enumerable: true, get: function () { return operators_1.NUMBER_OPS; } });
|
|
13
|
+
Object.defineProperty(exports, "STRING_OPS", { enumerable: true, get: function () { return operators_1.STRING_OPS; } });
|
|
14
|
+
class BaseZendeskCollection extends datasource_toolkit_1.BaseCollection {
|
|
15
|
+
constructor(name, datasource, client, resource, sortableFields, logger) {
|
|
16
|
+
super(name, datasource, client);
|
|
17
|
+
this.client = client;
|
|
18
|
+
this.resource = resource;
|
|
19
|
+
this.sortableFields = sortableFields;
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
this.zendeskIdToColumnName = new Map();
|
|
22
|
+
// Zendesk Search only supports counting search results — disallow grouped aggregates.
|
|
23
|
+
const capabilities = {
|
|
24
|
+
supportGroups: false,
|
|
25
|
+
supportedDateOperations: new Set(),
|
|
26
|
+
};
|
|
27
|
+
this.setAggregationCapabilities(capabilities);
|
|
28
|
+
this.enableCount();
|
|
29
|
+
}
|
|
30
|
+
async aggregate(caller, filter, aggregation, limit) {
|
|
31
|
+
if (aggregation.operation !== 'Count' || aggregation.field || aggregation.groups?.length) {
|
|
32
|
+
throw new errors_1.UnsupportedOperatorError(`Zendesk only supports the 'Count' aggregation without field/groups (got ${aggregation.operation}).`);
|
|
33
|
+
}
|
|
34
|
+
const count = await this.aggregateCount(caller, filter);
|
|
35
|
+
const results = count > 0 ? [{ value: count, group: {} }] : [];
|
|
36
|
+
return typeof limit === 'number' ? results.slice(0, limit) : results;
|
|
37
|
+
}
|
|
38
|
+
// ===== Helpers used by subclasses =====
|
|
39
|
+
/**
|
|
40
|
+
* Count the records matching the filter. An exact id-lookup is resolved by fetching the
|
|
41
|
+
* referenced records and re-applying the full condition tree in memory, so that non-existent
|
|
42
|
+
* ids and sibling conditions (scope/segment) are honored rather than blindly trusted.
|
|
43
|
+
*/
|
|
44
|
+
async aggregateCount(caller, filter) {
|
|
45
|
+
const ids = this.extractIdLookup(filter?.conditionTree);
|
|
46
|
+
if (ids) {
|
|
47
|
+
const records = await this.serializeForFilter(await this.fetchRecordsByIds(ids));
|
|
48
|
+
const matching = filter?.conditionTree
|
|
49
|
+
? filter.conditionTree.apply(records, this, caller.timezone)
|
|
50
|
+
: records;
|
|
51
|
+
return matching.length;
|
|
52
|
+
}
|
|
53
|
+
return this.client.count(this.resource, this.buildZendeskQuery(filter));
|
|
54
|
+
}
|
|
55
|
+
addCustomFields(customFields) {
|
|
56
|
+
for (const entry of customFields) {
|
|
57
|
+
if (this.schema.fields[entry.columnName] !== undefined) {
|
|
58
|
+
this.logger?.('Warn', `[datasource-zendesk] Custom field '${entry.columnName}' collides with a native field on '${this.name}'; skipping.`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.addField(entry.columnName, entry.schema);
|
|
62
|
+
this.zendeskIdToColumnName.set(entry.zendeskId, entry.columnName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
translateSort(sort) {
|
|
67
|
+
if (!sort || sort.length === 0)
|
|
68
|
+
return {};
|
|
69
|
+
const [first] = sort;
|
|
70
|
+
const zendeskField = this.sortableFields[first.field];
|
|
71
|
+
if (!zendeskField)
|
|
72
|
+
return {};
|
|
73
|
+
return { sortBy: zendeskField, sortOrder: first.ascending ? 'asc' : 'desc' };
|
|
74
|
+
}
|
|
75
|
+
// Zendesk Search is page-based; a window not aligned to a page boundary is satisfied by
|
|
76
|
+
// fetching the covering pages and slicing in memory rather than snapping to a boundary.
|
|
77
|
+
async searchRecords(filter) {
|
|
78
|
+
const skip = filter?.page?.skip ?? 0;
|
|
79
|
+
const limit = filter?.page?.limit ?? client_1.MAX_PER_PAGE;
|
|
80
|
+
if (skip + limit > client_1.MAX_TOTAL_RESULTS) {
|
|
81
|
+
throw new errors_1.UnsupportedOperatorError(`Zendesk Search caps results at ${client_1.MAX_TOTAL_RESULTS}. Requested skip+limit=${skip + limit}.`);
|
|
82
|
+
}
|
|
83
|
+
const perPage = Math.max(1, Math.min(limit, client_1.MAX_PER_PAGE));
|
|
84
|
+
const firstPage = Math.floor(skip / perPage) + 1;
|
|
85
|
+
const offset = skip - (firstPage - 1) * perPage;
|
|
86
|
+
const pageCount = Math.max(1, Math.ceil((offset + limit) / perPage));
|
|
87
|
+
const { sortBy, sortOrder } = this.translateSort(filter?.sort);
|
|
88
|
+
const query = this.buildZendeskQuery(filter);
|
|
89
|
+
const pages = await Promise.all(Array.from({ length: pageCount }, (_unused, index) => this.client.search(this.resource, {
|
|
90
|
+
query,
|
|
91
|
+
page: firstPage + index,
|
|
92
|
+
perPage,
|
|
93
|
+
sortBy,
|
|
94
|
+
sortOrder,
|
|
95
|
+
})));
|
|
96
|
+
const records = pages.flat();
|
|
97
|
+
return offset === 0 && pageCount === 1 ? records : records.slice(offset, offset + limit);
|
|
98
|
+
}
|
|
99
|
+
// Drops ids that no longer exist (findOne returns null on 404).
|
|
100
|
+
async fetchRecordsByIds(ids) {
|
|
101
|
+
const results = await Promise.all(ids.map(id => this.findOne(id)));
|
|
102
|
+
return results.filter((record) => record !== null);
|
|
103
|
+
}
|
|
104
|
+
// Overridable so collections can resolve derived columns before in-memory filtering.
|
|
105
|
+
async serializeForFilter(records) {
|
|
106
|
+
return records.map(record => this.serializeRecord(record));
|
|
107
|
+
}
|
|
108
|
+
// Re-apply the filter, sort and pagination in memory (used on the id-lookup path, which
|
|
109
|
+
// bypasses the Search API and therefore never had them applied server-side).
|
|
110
|
+
refine(records, filter, timezone) {
|
|
111
|
+
let result = records;
|
|
112
|
+
if (filter?.conditionTree)
|
|
113
|
+
result = filter.conditionTree.apply(result, this, timezone);
|
|
114
|
+
if (filter?.sort)
|
|
115
|
+
result = filter.sort.apply(result);
|
|
116
|
+
if (filter?.page)
|
|
117
|
+
result = filter.page.apply(result);
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
buildZendeskQuery(filter) {
|
|
121
|
+
if (!filter)
|
|
122
|
+
return '';
|
|
123
|
+
const fromTree = (0, condition_tree_translator_1.translateConditionTree)(filter.conditionTree, {
|
|
124
|
+
resource: this.resource,
|
|
125
|
+
customFieldMapping: this.dataSource.customFieldMapping,
|
|
126
|
+
});
|
|
127
|
+
const search = (filter.search ?? '').toString().trim();
|
|
128
|
+
return [fromTree, search]
|
|
129
|
+
.filter(part => part.length > 0)
|
|
130
|
+
.join(' ')
|
|
131
|
+
.trim();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns the list of primary-key values if the condition tree is an exact `id`
|
|
135
|
+
* lookup (Equal N or In [N1, N2, ...]), otherwise null. Lets `list/update/delete`
|
|
136
|
+
* bypass the Search API and hit the resource endpoint directly.
|
|
137
|
+
*/
|
|
138
|
+
extractIdLookup(tree) {
|
|
139
|
+
if (!tree)
|
|
140
|
+
return null;
|
|
141
|
+
if (tree instanceof datasource_toolkit_1.ConditionTreeLeaf && tree.field === 'id') {
|
|
142
|
+
if (tree.operator === 'Equal' && tree.value !== null && tree.value !== undefined) {
|
|
143
|
+
return [Number(tree.value)];
|
|
144
|
+
}
|
|
145
|
+
if (tree.operator === 'In' && Array.isArray(tree.value) && tree.value.length > 0) {
|
|
146
|
+
return tree.value.map(v => Number(v));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (tree instanceof datasource_toolkit_1.ConditionTreeBranch && tree.aggregator === 'And') {
|
|
150
|
+
for (const condition of tree.conditions) {
|
|
151
|
+
const ids = this.extractIdLookup(condition);
|
|
152
|
+
if (ids)
|
|
153
|
+
return ids;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve the primary keys targeted by update/delete. A pure id-lookup is authoritative; an
|
|
160
|
+
* id-lookup combined with other conditions (scope/segment) is re-checked in memory so we never
|
|
161
|
+
* mutate a record outside the caller's perimeter. Otherwise every matching page is collected.
|
|
162
|
+
*/
|
|
163
|
+
async resolveIds(filter, timezone) {
|
|
164
|
+
const ids = this.extractIdLookup(filter?.conditionTree);
|
|
165
|
+
if (ids) {
|
|
166
|
+
const onlyIds = filter?.conditionTree?.everyLeaf(leaf => leaf.field === 'id') ?? true;
|
|
167
|
+
if (onlyIds)
|
|
168
|
+
return ids;
|
|
169
|
+
const records = await this.serializeForFilter(await this.fetchRecordsByIds(ids));
|
|
170
|
+
return filter.conditionTree
|
|
171
|
+
.apply(records, this, timezone)
|
|
172
|
+
.map(record => Number(record.id))
|
|
173
|
+
.filter(id => Number.isFinite(id));
|
|
174
|
+
}
|
|
175
|
+
return this.searchAllIds(filter);
|
|
176
|
+
}
|
|
177
|
+
// Page through every matching result up to the Zendesk Search cap, warning if it is exceeded
|
|
178
|
+
// rather than silently affecting only the first page.
|
|
179
|
+
async searchAllIds(filter) {
|
|
180
|
+
const query = this.buildZendeskQuery(filter);
|
|
181
|
+
const maxPages = Math.ceil(client_1.MAX_TOTAL_RESULTS / client_1.MAX_PER_PAGE);
|
|
182
|
+
const ids = [];
|
|
183
|
+
for (let page = 1; page <= maxPages; page += 1) {
|
|
184
|
+
// eslint-disable-next-line no-await-in-loop
|
|
185
|
+
const records = await this.client.search(this.resource, {
|
|
186
|
+
query,
|
|
187
|
+
page,
|
|
188
|
+
perPage: client_1.MAX_PER_PAGE,
|
|
189
|
+
});
|
|
190
|
+
for (const record of records) {
|
|
191
|
+
const id = Number(record.id);
|
|
192
|
+
if (Number.isFinite(id))
|
|
193
|
+
ids.push(id);
|
|
194
|
+
}
|
|
195
|
+
if (records.length < client_1.MAX_PER_PAGE)
|
|
196
|
+
return ids;
|
|
197
|
+
}
|
|
198
|
+
this.logger?.('Warn', `[datasource-zendesk] A bulk operation on '${this.name}' matched more than ${client_1.MAX_TOTAL_RESULTS} records; Zendesk Search only returns the first ${client_1.MAX_TOTAL_RESULTS}, so the rest are left untouched.`);
|
|
199
|
+
return ids;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
exports.default = BaseZendeskCollection;
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS16ZW5kZXNrLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbnMvYmFzZS16ZW5kZXNrLWNvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBa0JBLHdFQUl5QztBQUV6QyxzQ0FBNEQ7QUFDNUQsc0NBQXFEO0FBQ3JELGtGQUE0RTtBQUU1RSxnREFBMkY7QUFBbEYsd0dBQUEsV0FBVyxPQUFBO0FBQUUscUdBQUEsUUFBUSxPQUFBO0FBQUUsbUdBQUEsTUFBTSxPQUFBO0FBQUUsdUdBQUEsVUFBVSxPQUFBO0FBQUUsdUdBQUEsVUFBVSxPQUFBO0FBRTlELE1BQThCLHFCQUFzQixTQUFRLG1DQUFjO0lBT3hFLFlBQ0UsSUFBWSxFQUNaLFVBQXNCLEVBQ3RCLE1BQXFCLEVBQ3JCLFFBQXlCLEVBQ3pCLGNBQXNDLEVBQ3RDLE1BQWU7UUFFZixLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUV2QyxzRkFBc0Y7UUFDdEYsTUFBTSxZQUFZLEdBQTRCO1lBQzVDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLHVCQUF1QixFQUFFLElBQUksR0FBRyxFQUFFO1NBQ25DLENBQUM7UUFDRixJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFnQlEsS0FBSyxDQUFDLFNBQVMsQ0FDdEIsTUFBYyxFQUNkLE1BQWMsRUFD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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 OrganizationCollection 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=organization-collection.d.ts.map
|
|
@@ -0,0 +1,145 @@
|
|
|
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 = require("./base-zendesk-collection");
|
|
8
|
+
const searchable_collection_1 = __importDefault(require("./searchable-collection"));
|
|
9
|
+
const serializer_1 = require("./ticket/serializer");
|
|
10
|
+
const SORTABLE = {
|
|
11
|
+
created_at: 'created_at',
|
|
12
|
+
updated_at: 'updated_at',
|
|
13
|
+
name: 'name',
|
|
14
|
+
};
|
|
15
|
+
const READ_ONLY_INPUTS = new Set(['id', 'created_at', 'updated_at']);
|
|
16
|
+
function getOrganizationFieldSchemas() {
|
|
17
|
+
return {
|
|
18
|
+
id: {
|
|
19
|
+
type: 'Column',
|
|
20
|
+
columnType: 'Number',
|
|
21
|
+
isPrimaryKey: true,
|
|
22
|
+
isReadOnly: true,
|
|
23
|
+
filterOperators: new Set(base_zendesk_collection_1.ID_OPS),
|
|
24
|
+
},
|
|
25
|
+
name: {
|
|
26
|
+
type: 'Column',
|
|
27
|
+
columnType: 'String',
|
|
28
|
+
isSortable: true,
|
|
29
|
+
filterOperators: new Set(base_zendesk_collection_1.STRING_OPS),
|
|
30
|
+
},
|
|
31
|
+
domain_names: {
|
|
32
|
+
type: 'Column',
|
|
33
|
+
columnType: ['String'],
|
|
34
|
+
filterOperators: new Set(),
|
|
35
|
+
},
|
|
36
|
+
details: {
|
|
37
|
+
type: 'Column',
|
|
38
|
+
columnType: 'String',
|
|
39
|
+
filterOperators: new Set(),
|
|
40
|
+
},
|
|
41
|
+
notes: {
|
|
42
|
+
type: 'Column',
|
|
43
|
+
columnType: 'String',
|
|
44
|
+
filterOperators: new Set(),
|
|
45
|
+
},
|
|
46
|
+
group_id: {
|
|
47
|
+
type: 'Column',
|
|
48
|
+
columnType: 'Number',
|
|
49
|
+
filterOperators: new Set(base_zendesk_collection_1.NUMBER_OPS),
|
|
50
|
+
},
|
|
51
|
+
shared_tickets: {
|
|
52
|
+
type: 'Column',
|
|
53
|
+
columnType: 'Boolean',
|
|
54
|
+
filterOperators: new Set(),
|
|
55
|
+
},
|
|
56
|
+
created_at: {
|
|
57
|
+
type: 'Column',
|
|
58
|
+
columnType: 'Date',
|
|
59
|
+
isReadOnly: true,
|
|
60
|
+
isSortable: true,
|
|
61
|
+
filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
|
|
62
|
+
},
|
|
63
|
+
updated_at: {
|
|
64
|
+
type: 'Column',
|
|
65
|
+
columnType: 'Date',
|
|
66
|
+
isReadOnly: true,
|
|
67
|
+
isSortable: true,
|
|
68
|
+
filterOperators: new Set(base_zendesk_collection_1.DATE_OPS),
|
|
69
|
+
},
|
|
70
|
+
users: {
|
|
71
|
+
type: 'OneToMany',
|
|
72
|
+
foreignCollection: datasource_1.COLLECTION_NAMES.user,
|
|
73
|
+
originKey: 'organization_id',
|
|
74
|
+
originKeyTarget: 'id',
|
|
75
|
+
},
|
|
76
|
+
tickets: {
|
|
77
|
+
type: 'OneToMany',
|
|
78
|
+
foreignCollection: datasource_1.COLLECTION_NAMES.ticket,
|
|
79
|
+
originKey: 'organization_id',
|
|
80
|
+
originKeyTarget: 'id',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
class OrganizationCollection extends searchable_collection_1.default {
|
|
85
|
+
constructor(datasource, client, customFields, logger) {
|
|
86
|
+
super(datasource_1.COLLECTION_NAMES.organization, datasource, client, 'organization', SORTABLE, logger);
|
|
87
|
+
this.customFields = customFields;
|
|
88
|
+
this.addFields(getOrganizationFieldSchemas());
|
|
89
|
+
this.addCustomFields(customFields);
|
|
90
|
+
}
|
|
91
|
+
async create(caller, data) {
|
|
92
|
+
const created = [];
|
|
93
|
+
for (const item of data) {
|
|
94
|
+
// eslint-disable-next-line no-await-in-loop
|
|
95
|
+
const raw = await this.client.createOrganization(this.buildPayload(item));
|
|
96
|
+
created.push((0, serializer_1.serializeOrganization)(raw));
|
|
97
|
+
}
|
|
98
|
+
return created;
|
|
99
|
+
}
|
|
100
|
+
async update(caller, filter, patch) {
|
|
101
|
+
const ids = await this.resolveIds(filter, caller.timezone);
|
|
102
|
+
const payload = this.buildPayload(patch);
|
|
103
|
+
for (const id of ids) {
|
|
104
|
+
// eslint-disable-next-line no-await-in-loop
|
|
105
|
+
await this.client.updateOrganization(id, payload);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async delete(caller, filter) {
|
|
109
|
+
const ids = await this.resolveIds(filter, caller.timezone);
|
|
110
|
+
for (const id of ids) {
|
|
111
|
+
// eslint-disable-next-line no-await-in-loop
|
|
112
|
+
await this.client.deleteOrganization(id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
findOne(id) {
|
|
116
|
+
return this.client.findOrganization(id);
|
|
117
|
+
}
|
|
118
|
+
serializeRecord(record) {
|
|
119
|
+
return (0, serializer_1.serializeOrganization)(record);
|
|
120
|
+
}
|
|
121
|
+
buildPayload(data) {
|
|
122
|
+
const payload = {};
|
|
123
|
+
const organizationFields = {};
|
|
124
|
+
for (const [key, value] of Object.entries(data)) {
|
|
125
|
+
if (READ_ONLY_INPUTS.has(key) || key === 'users' || key === 'tickets') {
|
|
126
|
+
// ignored
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const customField = this.customFields.find(cf => cf.columnName === key);
|
|
130
|
+
if (customField?.zendeskKey) {
|
|
131
|
+
organizationFields[customField.zendeskKey] = value;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
payload[key] = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (Object.keys(organizationFields).length > 0) {
|
|
139
|
+
payload.organization_fields = organizationFields;
|
|
140
|
+
}
|
|
141
|
+
return payload;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.default = OrganizationCollection;
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbnMvb3JnYW5pemF0aW9uLWNvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFXQSw4Q0FBaUQ7QUFDakQsdUVBQXFGO0FBQ3JGLG9GQUEyRDtBQUMzRCxvREFBNEQ7QUFFNUQsTUFBTSxRQUFRLEdBQTJCO0lBQ3ZDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLElBQUksRUFBRSxNQUFNO0NBQ2IsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFckUsU0FBUywyQkFBMkI7SUFDbEMsT0FBTztRQUNMLEVBQUUsRUFBRTtZQUNGLElBQUksRUFBRSxRQUFRO1lBQ2QsVUFBVSxFQUFFLFFBQVE7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsZUFBZSxFQUFFLElBQUksR0FBRyxDQUFDLGdDQUFNLENBQUM7U0FDakM7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGVBQWUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxvQ0FBVSxDQUFDO1NBQ3JDO1FBQ0QsWUFBWSxFQUFFO1lBQ1osSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDdEIsZUFBZSxFQUFFLElBQUksR0FBRyxFQUFFO1NBQzNCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUUsUUFBUTtZQUNwQixlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQUU7U0FDM0I7UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJ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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Caller, PaginatedFilter, Projection, RecordData } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import BaseZendeskCollection from './base-zendesk-collection';
|
|
3
|
+
export default abstract class SearchableCollection extends BaseZendeskCollection {
|
|
4
|
+
list(caller: Caller, filter: PaginatedFilter, projection: Projection): Promise<RecordData[]>;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=searchable-collection.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
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 base_zendesk_collection_1 = __importDefault(require("./base-zendesk-collection"));
|
|
7
|
+
class SearchableCollection extends base_zendesk_collection_1.default {
|
|
8
|
+
async list(caller, filter, projection) {
|
|
9
|
+
const ids = this.extractIdLookup(filter?.conditionTree);
|
|
10
|
+
if (ids) {
|
|
11
|
+
const raw = await this.fetchRecordsByIds(ids);
|
|
12
|
+
const records = raw.map(record => this.serializeRecord(record));
|
|
13
|
+
return projection.apply(this.refine(records, filter, caller.timezone));
|
|
14
|
+
}
|
|
15
|
+
const raw = await this.searchRecords(filter);
|
|
16
|
+
return projection.apply(raw.map(record => this.serializeRecord(record)));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.default = SearchableCollection;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoYWJsZS1jb2xsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbGxlY3Rpb25zL3NlYXJjaGFibGUtY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU9BLHdGQUE4RDtBQUU5RCxNQUE4QixvQkFBcUIsU0FBUSxpQ0FBcUI7SUFDckUsS0FBSyxDQUFDLElBQUksQ0FDakIsTUFBYyxFQUNkLE1BQXVCLEVBQ3ZCLFVBQXNCO1FBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXhELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRWhFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRjtBQW5CRCx1Q0FtQkMifQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ZendeskClient } from '../../client';
|
|
2
|
+
import type { Projection, RecordData } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export declare function isCommentsRequested(projection: Projection): boolean;
|
|
4
|
+
export declare function embedComments(records: RecordData[], client: ZendeskClient): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=comments-embedder.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isCommentsRequested = isCommentsRequested;
|
|
4
|
+
exports.embedComments = embedComments;
|
|
5
|
+
function serializeComment(comment, authorsById) {
|
|
6
|
+
const authorId = comment.author_id;
|
|
7
|
+
const author = authorId !== undefined ? authorsById.get(authorId) : undefined;
|
|
8
|
+
return {
|
|
9
|
+
id: comment.id,
|
|
10
|
+
body: comment.body,
|
|
11
|
+
html_body: comment.html_body,
|
|
12
|
+
public: comment.public,
|
|
13
|
+
author_email: author?.email ?? null,
|
|
14
|
+
author_name: author?.name ?? null,
|
|
15
|
+
created_at: comment.created_at,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function isCommentsRequested(projection) {
|
|
19
|
+
return projection.some(path => path === 'comments' || path.startsWith('comments:'));
|
|
20
|
+
}
|
|
21
|
+
async function embedComments(records, client) {
|
|
22
|
+
if (records.length === 0)
|
|
23
|
+
return;
|
|
24
|
+
const commentsByTicket = await Promise.all(records.map(record => typeof record.id === 'number' || typeof record.id === 'string'
|
|
25
|
+
? client.bestEffort(`fetch_ticket_comments(${record.id})`, [], () => client.fetchTicketComments(record.id))
|
|
26
|
+
: Promise.resolve([])));
|
|
27
|
+
const authorIds = new Set();
|
|
28
|
+
for (const comments of commentsByTicket) {
|
|
29
|
+
for (const comment of comments) {
|
|
30
|
+
const authorId = comment.author_id;
|
|
31
|
+
if (typeof authorId === 'number')
|
|
32
|
+
authorIds.add(authorId);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const authorsById = authorIds.size > 0 ? await client.fetchUsersByIds(Array.from(authorIds)) : new Map();
|
|
36
|
+
records.forEach((record, idx) => {
|
|
37
|
+
record.comments = (commentsByTicket[idx] ?? []).map(comment => serializeComment(comment, authorsById));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudHMtZW1iZWRkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29sbGVjdGlvbnMvdGlja2V0L2NvbW1lbnRzLWVtYmVkZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0JBLGtEQUVDO0FBRUQsc0NBOEJDO0FBcERELFNBQVMsZ0JBQWdCLENBQ3ZCLE9BQXNCLEVBQ3RCLFdBQXVDO0lBRXZDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUErQixDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUU5RSxPQUFPO1FBQ0wsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUF3QjtRQUNwQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQTBCO1FBQ3hDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBK0I7UUFDbEQsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUE0QjtRQUM1QyxZQUFZLEVBQUcsTUFBTSxFQUFFLEtBQTRCLElBQUksSUFBSTtRQUMzRCxXQUFXLEVBQUcsTUFBTSxFQUFFLElBQTJCLElBQUksSUFBSTtRQUN6RCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQWdDO0tBQ3JELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsVUFBc0I7SUFDeEQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDdEYsQ0FBQztBQUVNLEtBQUssVUFBVSxhQUFhLENBQUMsT0FBcUIsRUFBRSxNQUFxQjtJQUM5RSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU87SUFFakMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDbkIsT0FBTyxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxFQUFFLEtBQUssUUFBUTtRQUM1RCxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQXFCLEVBQUUsR0FBRyxFQUFFLENBQ25GLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBcUIsQ0FBQyxDQUN6RDtRQUNILENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQXFCLENBQUMsQ0FDM0MsQ0FDRixDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVwQyxLQUFLLE1BQU0sUUFBUSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ25DLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQ2YsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFdkYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUM5QixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzVELGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ZendeskClient } from '../../client';
|
|
2
|
+
import type { Projection, RecordData } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export type RelationKeys = {
|
|
4
|
+
requester: boolean;
|
|
5
|
+
assignee: boolean;
|
|
6
|
+
organization: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function findRequestedRelations(projection: Projection): RelationKeys;
|
|
9
|
+
export declare function embedRelations(records: RecordData[], relations: RelationKeys, client: ZendeskClient): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=relation-embedder.d.ts.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findRequestedRelations = findRequestedRelations;
|
|
4
|
+
exports.embedRelations = embedRelations;
|
|
5
|
+
const serializer_1 = require("./serializer");
|
|
6
|
+
const RELATION_NAMES = new Set(['requester', 'assignee', 'organization']);
|
|
7
|
+
function pushIfNumber(target, value) {
|
|
8
|
+
if (typeof value === 'number') {
|
|
9
|
+
target.push(value);
|
|
10
|
+
}
|
|
11
|
+
else if (typeof value === 'string' && value.length > 0 && !Number.isNaN(Number(value))) {
|
|
12
|
+
target.push(Number(value));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function unique(values) {
|
|
16
|
+
return Array.from(new Set(values));
|
|
17
|
+
}
|
|
18
|
+
function findRequestedRelations(projection) {
|
|
19
|
+
const requested = { requester: false, assignee: false, organization: false };
|
|
20
|
+
for (const path of projection) {
|
|
21
|
+
const index = path.indexOf(':');
|
|
22
|
+
if (index !== -1) {
|
|
23
|
+
const relation = path.substring(0, index);
|
|
24
|
+
if (RELATION_NAMES.has(relation))
|
|
25
|
+
requested[relation] = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return requested;
|
|
29
|
+
}
|
|
30
|
+
async function embedRelations(records, relations, client) {
|
|
31
|
+
if (records.length === 0)
|
|
32
|
+
return;
|
|
33
|
+
const userIds = [];
|
|
34
|
+
const orgIds = [];
|
|
35
|
+
for (const record of records) {
|
|
36
|
+
if (relations.requester)
|
|
37
|
+
pushIfNumber(userIds, record.requester_id);
|
|
38
|
+
if (relations.assignee)
|
|
39
|
+
pushIfNumber(userIds, record.assignee_id);
|
|
40
|
+
if (relations.organization)
|
|
41
|
+
pushIfNumber(orgIds, record.organization_id);
|
|
42
|
+
}
|
|
43
|
+
const [usersById, orgsById] = await Promise.all([
|
|
44
|
+
userIds.length > 0 ? client.fetchUsersByIds(unique(userIds)) : Promise.resolve(new Map()),
|
|
45
|
+
orgIds.length > 0 ? client.fetchOrganizationsByIds(unique(orgIds)) : Promise.resolve(new Map()),
|
|
46
|
+
]);
|
|
47
|
+
for (const record of records) {
|
|
48
|
+
if (relations.requester) {
|
|
49
|
+
const raw = usersById.get(Number(record.requester_id));
|
|
50
|
+
record.requester = raw ? (0, serializer_1.serializeUser)(raw) : null;
|
|
51
|
+
}
|
|
52
|
+
if (relations.assignee) {
|
|
53
|
+
const raw = usersById.get(Number(record.assignee_id));
|
|
54
|
+
record.assignee = raw ? (0, serializer_1.serializeUser)(raw) : null;
|
|
55
|
+
}
|
|
56
|
+
if (relations.organization) {
|
|
57
|
+
const raw = orgsById.get(Number(record.organization_id));
|
|
58
|
+
record.organization = raw ? (0, serializer_1.serializeOrganization)(raw) : null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRpb24tZW1iZWRkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29sbGVjdGlvbnMvdGlja2V0L3JlbGF0aW9uLWVtYmVkZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUJBLHdEQWFDO0FBRUQsd0NBcUNDO0FBMUVELDZDQUFvRTtBQUVwRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQVExRSxTQUFTLFlBQVksQ0FBQyxNQUFnQixFQUFFLEtBQWM7SUFDcEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7U0FBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsTUFBZ0I7SUFDOUIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLFVBQXNCO0lBQzNELE1BQU0sU0FBUyxHQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFM0YsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FieldSchema } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export declare const TICKET_SORTABLE: Record<string, string>;
|
|
3
|
+
export declare const TICKET_COMMENT_THREAD_SCHEMA: {
|
|
4
|
+
readonly id: "Number";
|
|
5
|
+
readonly body: "String";
|
|
6
|
+
readonly html_body: "String";
|
|
7
|
+
readonly public: "Boolean";
|
|
8
|
+
readonly author_email: "String";
|
|
9
|
+
readonly author_name: "String";
|
|
10
|
+
readonly created_at: "Date";
|
|
11
|
+
};
|
|
12
|
+
export declare function getTicketFieldSchemas(): Record<string, FieldSchema>;
|
|
13
|
+
//# sourceMappingURL=schema-definition.d.ts.map
|