@unboundcx/sdk 4.5.0 → 4.6.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 +39 -0
- package/index.js +2 -0
- package/package.json +4 -1
- package/schemas/workflows/capabilities.js +57 -0
- package/schemas/workflows/editEntry.js +59 -0
- package/schemas/workflows/index.js +9 -0
- package/schemas/workflows/layout.js +61 -0
- package/schemas/workflows/lint.js +89 -0
- package/schemas/workflows/moduleSpec.js +87 -0
- package/schemas/workflows/port.js +22 -0
- package/schemas/workflows/primitives.js +44 -0
- package/schemas/workflows/settingsSchema.js +30 -0
- package/schemas/workflows/validate.js +18 -0
- package/services/documents.js +263 -0
- package/services/externalOAuth.js +22 -0
- package/services/fax.js +11 -1
- package/services/objects.js +151 -14
- package/services/permissions.js +111 -0
- package/services/storage.js +2 -2
- package/test-complete-coverage.js +1 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
export class DocumentTemplatesService {
|
|
2
|
+
constructor(sdk) {
|
|
3
|
+
this.sdk = sdk;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Create a document template head (draft, no version row).
|
|
8
|
+
* @param {Object} params
|
|
9
|
+
* @param {string} params.name - Template name (required)
|
|
10
|
+
* @param {string} [params.description]
|
|
11
|
+
* @param {string} [params.tag]
|
|
12
|
+
* @param {'generative'|'overlay'} [params.engine='generative']
|
|
13
|
+
* @param {string} [params.sourcePdfStorageId] - Required when engine is overlay
|
|
14
|
+
* @param {Object} [params.draftSchemaJson]
|
|
15
|
+
* @param {Object} [params.draftLayoutJson]
|
|
16
|
+
* @param {Object} [params.draftPageJson]
|
|
17
|
+
* @param {Object} [params.draftThemeJson]
|
|
18
|
+
* @returns {Promise<Object>} Created template (includes draft*)
|
|
19
|
+
*/
|
|
20
|
+
async create({
|
|
21
|
+
name,
|
|
22
|
+
description,
|
|
23
|
+
tag,
|
|
24
|
+
engine,
|
|
25
|
+
sourcePdfStorageId,
|
|
26
|
+
draftSchemaJson,
|
|
27
|
+
draftLayoutJson,
|
|
28
|
+
draftPageJson,
|
|
29
|
+
draftThemeJson,
|
|
30
|
+
}) {
|
|
31
|
+
this.sdk.validateParams(
|
|
32
|
+
{ name },
|
|
33
|
+
{
|
|
34
|
+
name: { type: 'string', required: true },
|
|
35
|
+
description: { type: 'string', required: false },
|
|
36
|
+
tag: { type: 'string', required: false },
|
|
37
|
+
engine: { type: 'string', required: false },
|
|
38
|
+
sourcePdfStorageId: { type: 'string', required: false },
|
|
39
|
+
draftSchemaJson: { type: 'object', required: false },
|
|
40
|
+
draftLayoutJson: { type: 'object', required: false },
|
|
41
|
+
draftPageJson: { type: 'object', required: false },
|
|
42
|
+
draftThemeJson: { type: 'object', required: false },
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const body = { name };
|
|
47
|
+
if (description !== undefined) body.description = description;
|
|
48
|
+
if (tag !== undefined) body.tag = tag;
|
|
49
|
+
if (engine !== undefined) body.engine = engine;
|
|
50
|
+
if (sourcePdfStorageId !== undefined) {
|
|
51
|
+
body.sourcePdfStorageId = sourcePdfStorageId;
|
|
52
|
+
}
|
|
53
|
+
if (draftSchemaJson !== undefined) body.draftSchemaJson = draftSchemaJson;
|
|
54
|
+
if (draftLayoutJson !== undefined) body.draftLayoutJson = draftLayoutJson;
|
|
55
|
+
if (draftPageJson !== undefined) body.draftPageJson = draftPageJson;
|
|
56
|
+
if (draftThemeJson !== undefined) body.draftThemeJson = draftThemeJson;
|
|
57
|
+
|
|
58
|
+
return this.sdk._fetch('/documents/templates', 'POST', { body });
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* List document templates (not deleted). Returns draft* for authoring.
|
|
63
|
+
* @param {Object} [params]
|
|
64
|
+
* @param {string} [params.tag]
|
|
65
|
+
* @param {string} [params.status]
|
|
66
|
+
* @param {number} [params.limit]
|
|
67
|
+
* @returns {Promise<{results: Object[]}>}
|
|
68
|
+
*/
|
|
69
|
+
async list({ tag, status, limit } = {}) {
|
|
70
|
+
const query = {};
|
|
71
|
+
if (tag) query.tag = tag;
|
|
72
|
+
if (status) query.status = status;
|
|
73
|
+
if (limit) query.limit = limit;
|
|
74
|
+
return this.sdk._fetch('/documents/templates', 'GET', { query });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get a document template by id (head + draft* + published version if any).
|
|
79
|
+
* @param {string} id
|
|
80
|
+
* @returns {Promise<Object>}
|
|
81
|
+
*/
|
|
82
|
+
async get(id) {
|
|
83
|
+
this.sdk.validateParams({ id }, { id: { type: 'string', required: true } });
|
|
84
|
+
return this.sdk._fetch(`/documents/templates/${id}`, 'GET');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Update name/description/tag/draft*. Cannot change engine.
|
|
89
|
+
* @param {string} id
|
|
90
|
+
* @param {Object} params
|
|
91
|
+
* @param {string} [params.name]
|
|
92
|
+
* @param {string} [params.description]
|
|
93
|
+
* @param {string} [params.tag]
|
|
94
|
+
* @param {Object} [params.draftSchemaJson]
|
|
95
|
+
* @param {Object} [params.draftLayoutJson]
|
|
96
|
+
* @param {Object} [params.draftPageJson]
|
|
97
|
+
* @param {Object} [params.draftThemeJson]
|
|
98
|
+
* @returns {Promise<Object>}
|
|
99
|
+
*/
|
|
100
|
+
async update(
|
|
101
|
+
id,
|
|
102
|
+
{
|
|
103
|
+
name,
|
|
104
|
+
description,
|
|
105
|
+
tag,
|
|
106
|
+
draftSchemaJson,
|
|
107
|
+
draftLayoutJson,
|
|
108
|
+
draftPageJson,
|
|
109
|
+
draftThemeJson,
|
|
110
|
+
} = {},
|
|
111
|
+
) {
|
|
112
|
+
this.sdk.validateParams(
|
|
113
|
+
{ id },
|
|
114
|
+
{
|
|
115
|
+
id: { type: 'string', required: true },
|
|
116
|
+
name: { type: 'string', required: false },
|
|
117
|
+
description: { type: 'string', required: false },
|
|
118
|
+
tag: { type: 'string', required: false },
|
|
119
|
+
draftSchemaJson: { type: 'object', required: false },
|
|
120
|
+
draftLayoutJson: { type: 'object', required: false },
|
|
121
|
+
draftPageJson: { type: 'object', required: false },
|
|
122
|
+
draftThemeJson: { type: 'object', required: false },
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const body = {};
|
|
127
|
+
if (name !== undefined) body.name = name;
|
|
128
|
+
if (description !== undefined) body.description = description;
|
|
129
|
+
if (tag !== undefined) body.tag = tag;
|
|
130
|
+
if (draftSchemaJson !== undefined) body.draftSchemaJson = draftSchemaJson;
|
|
131
|
+
if (draftLayoutJson !== undefined) body.draftLayoutJson = draftLayoutJson;
|
|
132
|
+
if (draftPageJson !== undefined) body.draftPageJson = draftPageJson;
|
|
133
|
+
if (draftThemeJson !== undefined) body.draftThemeJson = draftThemeJson;
|
|
134
|
+
|
|
135
|
+
return this.sdk._fetch(`/documents/templates/${id}`, 'PATCH', { body });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Snapshot draft* into a new published version and set currentVersionId.
|
|
140
|
+
* @param {string} id
|
|
141
|
+
* @returns {Promise<Object>}
|
|
142
|
+
*/
|
|
143
|
+
async publish(id) {
|
|
144
|
+
this.sdk.validateParams({ id }, { id: { type: 'string', required: true } });
|
|
145
|
+
return this.sdk._fetch(`/documents/templates/${id}/publish`, 'POST', {
|
|
146
|
+
body: {},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Soft-delete a document template.
|
|
152
|
+
* @param {string} id
|
|
153
|
+
* @returns {Promise<{id: string, deleted: boolean}>}
|
|
154
|
+
*/
|
|
155
|
+
async delete(id) {
|
|
156
|
+
this.sdk.validateParams({ id }, { id: { type: 'string', required: true } });
|
|
157
|
+
return this.sdk._fetch(`/documents/templates/${id}`, 'DELETE');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export class DocumentsService {
|
|
162
|
+
constructor(sdk) {
|
|
163
|
+
this.sdk = sdk;
|
|
164
|
+
this.templates = new DocumentTemplatesService(sdk);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Generate a PDF from the published template version.
|
|
169
|
+
* @param {Object} params
|
|
170
|
+
* @param {string} params.templateId
|
|
171
|
+
* @param {Object} params.data
|
|
172
|
+
* @param {string} [params.versionId]
|
|
173
|
+
* @param {Object} [params.options]
|
|
174
|
+
* @param {string} [params.options.filename]
|
|
175
|
+
* @param {Object} [params.source]
|
|
176
|
+
* @param {string} [params.source.type]
|
|
177
|
+
* @param {string} [params.source.id]
|
|
178
|
+
* @returns {Promise<Object>}
|
|
179
|
+
*/
|
|
180
|
+
async generate({ templateId, data, versionId, options, source }) {
|
|
181
|
+
this.sdk.validateParams(
|
|
182
|
+
{ templateId, data },
|
|
183
|
+
{
|
|
184
|
+
templateId: { type: 'string', required: true },
|
|
185
|
+
data: { type: 'object', required: true },
|
|
186
|
+
versionId: { type: 'string', required: false },
|
|
187
|
+
options: { type: 'object', required: false },
|
|
188
|
+
source: { type: 'object', required: false },
|
|
189
|
+
},
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const body = { templateId, data };
|
|
193
|
+
if (versionId !== undefined) body.versionId = versionId;
|
|
194
|
+
if (options !== undefined) body.options = options;
|
|
195
|
+
if (source !== undefined) body.source = source;
|
|
196
|
+
|
|
197
|
+
return this.sdk._fetch('/documents/generate', 'POST', { body });
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Preview a PDF from draft* (or a specific versionId). isPreview=1.
|
|
202
|
+
* @param {Object} params
|
|
203
|
+
* @param {string} params.templateId
|
|
204
|
+
* @param {Object} [params.data]
|
|
205
|
+
* @param {string} [params.versionId]
|
|
206
|
+
* @returns {Promise<Object>}
|
|
207
|
+
*/
|
|
208
|
+
async preview({ templateId, data, versionId }) {
|
|
209
|
+
this.sdk.validateParams(
|
|
210
|
+
{ templateId },
|
|
211
|
+
{
|
|
212
|
+
templateId: { type: 'string', required: true },
|
|
213
|
+
data: { type: 'object', required: false },
|
|
214
|
+
versionId: { type: 'string', required: false },
|
|
215
|
+
},
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
const body = { templateId };
|
|
219
|
+
if (data !== undefined) body.data = data;
|
|
220
|
+
if (versionId !== undefined) body.versionId = versionId;
|
|
221
|
+
|
|
222
|
+
return this.sdk._fetch('/documents/preview', 'POST', { body });
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Attach a consumer id (e.g. fax document) after send.
|
|
227
|
+
* @param {Object} params
|
|
228
|
+
* @param {string} params.id - generatedDocuments id
|
|
229
|
+
* @param {string} [params.sourceId]
|
|
230
|
+
* @param {string} [params.sourceType]
|
|
231
|
+
* @returns {Promise<Object>}
|
|
232
|
+
*/
|
|
233
|
+
async updateGenerated({ id, sourceId, sourceType }) {
|
|
234
|
+
this.sdk.validateParams(
|
|
235
|
+
{ id },
|
|
236
|
+
{
|
|
237
|
+
id: { type: 'string', required: true },
|
|
238
|
+
sourceId: { type: 'string', required: false },
|
|
239
|
+
sourceType: { type: 'string', required: false },
|
|
240
|
+
},
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
const body = {};
|
|
244
|
+
if (sourceId !== undefined) body.sourceId = sourceId;
|
|
245
|
+
if (sourceType !== undefined) body.sourceType = sourceType;
|
|
246
|
+
|
|
247
|
+
return this.sdk._fetch(`/documents/generated/${id}`, 'PATCH', { body });
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Page count / size for a stored PDF.
|
|
252
|
+
* @param {Object} params
|
|
253
|
+
* @param {string} params.storageId
|
|
254
|
+
* @returns {Promise<{pageCount: number, pageSize: string|null}>}
|
|
255
|
+
*/
|
|
256
|
+
async inspect({ storageId }) {
|
|
257
|
+
this.sdk.validateParams(
|
|
258
|
+
{ storageId },
|
|
259
|
+
{ storageId: { type: 'string', required: true } },
|
|
260
|
+
);
|
|
261
|
+
return this.sdk._fetch('/documents/inspect', 'POST', { body: { storageId } });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -141,6 +141,7 @@ export class ExternalOAuthService {
|
|
|
141
141
|
scopes,
|
|
142
142
|
authorizationUrl,
|
|
143
143
|
tokenUrl,
|
|
144
|
+
fromConnectionId,
|
|
144
145
|
}) {
|
|
145
146
|
this.sdk.validateParams(
|
|
146
147
|
{ name, provider },
|
|
@@ -152,6 +153,7 @@ export class ExternalOAuthService {
|
|
|
152
153
|
scopes: { type: 'array', required: false },
|
|
153
154
|
authorizationUrl: { type: 'string', required: false },
|
|
154
155
|
tokenUrl: { type: 'string', required: false },
|
|
156
|
+
fromConnectionId: { type: 'string', required: false },
|
|
155
157
|
},
|
|
156
158
|
);
|
|
157
159
|
|
|
@@ -161,10 +163,30 @@ export class ExternalOAuthService {
|
|
|
161
163
|
if (scopes) body.scopes = scopes;
|
|
162
164
|
if (authorizationUrl) body.authorizationUrl = authorizationUrl;
|
|
163
165
|
if (tokenUrl) body.tokenUrl = tokenUrl;
|
|
166
|
+
if (fromConnectionId) body.fromConnectionId = fromConnectionId;
|
|
164
167
|
|
|
165
168
|
const result = await this.sdk._fetch('/externalOAuth/authorize', 'POST', {
|
|
166
169
|
body,
|
|
167
170
|
});
|
|
168
171
|
return result;
|
|
169
172
|
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Check whether a connection can be used for a purpose (e.g. Google Ads / Meta ads).
|
|
176
|
+
*
|
|
177
|
+
* @param {string} id
|
|
178
|
+
* @param {object} [args]
|
|
179
|
+
* @param {string} [args.purpose='googleAds']
|
|
180
|
+
* @returns {Promise<object>}
|
|
181
|
+
*/
|
|
182
|
+
async verify(id, { purpose = 'googleAds' } = {}) {
|
|
183
|
+
this.sdk.validateParams(
|
|
184
|
+
{ id },
|
|
185
|
+
{ id: { type: 'string', required: true } },
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
return this.sdk._fetch(`/externalOAuth/${id}/verify`, 'POST', {
|
|
189
|
+
body: { purpose },
|
|
190
|
+
});
|
|
191
|
+
}
|
|
170
192
|
}
|
package/services/fax.js
CHANGED
|
@@ -78,6 +78,8 @@ export class FaxService {
|
|
|
78
78
|
* Required if pdfStorageId and tiffStorageId are not provided.
|
|
79
79
|
* @param {string} [options.pdfStorageId] - Storage ID of the PDF version. Required if storageId is not provided.
|
|
80
80
|
* @param {string} [options.tiffStorageId] - Storage ID of the TIFF version. Required if storageId is not provided.
|
|
81
|
+
* @param {string} [options.coverStorageId] - Optional cover PDF (or TIFF). Concatenated in front of the body before TIFF convert.
|
|
82
|
+
* @param {('letter'|'legal'|'a4')} [options.paperSize] - Paper size hint for TIFF conversion. Server also reads PDF MediaBox.
|
|
81
83
|
* @param {string} [options.faxHeader] - TSI header text (defaults to mailbox faxHeader)
|
|
82
84
|
* @param {string} [options.resolution] - Fax resolution (defaults to mailbox resolution)
|
|
83
85
|
* @param {boolean} [options.ecm] - Enable Error Correction Mode (default: true)
|
|
@@ -95,6 +97,8 @@ export class FaxService {
|
|
|
95
97
|
* toNumber: '+15551234567',
|
|
96
98
|
* fromNumber: '+15559876543',
|
|
97
99
|
* storageId: '017xyz788...',
|
|
100
|
+
* paperSize: 'legal',
|
|
101
|
+
* coverStorageId: '017cover...',
|
|
98
102
|
* });
|
|
99
103
|
* console.log(result.id); // '158def456...'
|
|
100
104
|
* console.log(result.status); // 'sending'
|
|
@@ -120,13 +124,15 @@ export class FaxService {
|
|
|
120
124
|
storageId,
|
|
121
125
|
pdfStorageId,
|
|
122
126
|
tiffStorageId,
|
|
127
|
+
coverStorageId,
|
|
128
|
+
paperSize,
|
|
123
129
|
faxHeader,
|
|
124
130
|
resolution,
|
|
125
131
|
ecm,
|
|
126
132
|
timeout,
|
|
127
133
|
}) {
|
|
128
134
|
this.sdk.validateParams(
|
|
129
|
-
{ faxMailboxId, toNumber, fromNumber },
|
|
135
|
+
{ faxMailboxId, toNumber, fromNumber, coverStorageId, paperSize },
|
|
130
136
|
{
|
|
131
137
|
faxMailboxId: { type: 'string', required: true },
|
|
132
138
|
toNumber: { type: 'string', required: true },
|
|
@@ -134,6 +140,8 @@ export class FaxService {
|
|
|
134
140
|
storageId: { type: 'string', required: false },
|
|
135
141
|
pdfStorageId: { type: 'string', required: false },
|
|
136
142
|
tiffStorageId: { type: 'string', required: false },
|
|
143
|
+
coverStorageId: { type: 'string', required: false },
|
|
144
|
+
paperSize: { type: 'string', required: false },
|
|
137
145
|
},
|
|
138
146
|
);
|
|
139
147
|
|
|
@@ -151,6 +159,8 @@ export class FaxService {
|
|
|
151
159
|
storageId,
|
|
152
160
|
pdfStorageId,
|
|
153
161
|
tiffStorageId,
|
|
162
|
+
coverStorageId,
|
|
163
|
+
paperSize,
|
|
154
164
|
faxHeader,
|
|
155
165
|
resolution,
|
|
156
166
|
ecm,
|
package/services/objects.js
CHANGED
|
@@ -211,25 +211,27 @@ export class ObjectsService {
|
|
|
211
211
|
* Update an object record by ID
|
|
212
212
|
*
|
|
213
213
|
* Preferred usage (new signature):
|
|
214
|
-
* sdk.objects.updateById({ object: 'users', id: 'userId', update: { name: 'Jane' } })
|
|
214
|
+
* sdk.objects.updateById({ object: 'users', id: 'userId', update: { name: 'Jane' }, skipTriggers: true })
|
|
215
215
|
*
|
|
216
216
|
* Legacy usage (deprecated, but supported):
|
|
217
217
|
* sdk.objects.updateById('users', 'userId', { name: 'Jane' })
|
|
218
218
|
*
|
|
219
219
|
* @param {object} args - Update parameters
|
|
220
|
+
* @param {boolean} [args.skipTriggers=false] - Skip trigger execution for this write
|
|
220
221
|
* @returns {Promise} Updated object data
|
|
221
222
|
*/
|
|
222
223
|
async updateById(...args) {
|
|
223
|
-
// New signature: updateById({ object, id, update })
|
|
224
|
+
// New signature: updateById({ object, id, update, skipTriggers })
|
|
224
225
|
if (args.length === 1 && typeof args[0] === 'object' && args[0].object) {
|
|
225
|
-
const { object, id, update } = args[0];
|
|
226
|
+
const { object, id, update, skipTriggers = false } = args[0];
|
|
226
227
|
|
|
227
228
|
this.sdk.validateParams(
|
|
228
|
-
{ object, id, update },
|
|
229
|
+
{ object, id, update, skipTriggers },
|
|
229
230
|
{
|
|
230
231
|
object: { type: 'string', required: true },
|
|
231
232
|
id: { type: 'string', required: true },
|
|
232
233
|
update: { type: 'object', required: true },
|
|
234
|
+
skipTriggers: { type: 'boolean', required: false },
|
|
233
235
|
},
|
|
234
236
|
);
|
|
235
237
|
|
|
@@ -239,6 +241,7 @@ export class ObjectsService {
|
|
|
239
241
|
update,
|
|
240
242
|
},
|
|
241
243
|
};
|
|
244
|
+
if (skipTriggers) params.query = { skipTriggers: true };
|
|
242
245
|
|
|
243
246
|
return await this.sdk._fetch(`/object/${object}`, 'PUT', params);
|
|
244
247
|
}
|
|
@@ -269,13 +272,32 @@ export class ObjectsService {
|
|
|
269
272
|
throw new Error('Invalid arguments for updateById method');
|
|
270
273
|
}
|
|
271
274
|
|
|
272
|
-
|
|
275
|
+
/**
|
|
276
|
+
* Update records matching a where clause.
|
|
277
|
+
*
|
|
278
|
+
* @param {object} args
|
|
279
|
+
* @param {string} args.object
|
|
280
|
+
* @param {object} args.where
|
|
281
|
+
* @param {object} args.update
|
|
282
|
+
* @param {boolean} [args.skipTriggers=false] - Do not run triggers for this write
|
|
283
|
+
* @returns {Promise} Update result
|
|
284
|
+
*
|
|
285
|
+
* @example
|
|
286
|
+
* await sdk.objects.update({
|
|
287
|
+
* object: 'people',
|
|
288
|
+
* where: { id: '013…' },
|
|
289
|
+
* update: { leadScore: 200 },
|
|
290
|
+
* skipTriggers: true,
|
|
291
|
+
* });
|
|
292
|
+
*/
|
|
293
|
+
async update({ object, where, update, skipTriggers = false }) {
|
|
273
294
|
this.sdk.validateParams(
|
|
274
|
-
{ object, where, update },
|
|
295
|
+
{ object, where, update, skipTriggers },
|
|
275
296
|
{
|
|
276
297
|
object: { type: 'string', required: true },
|
|
277
298
|
where: { type: 'object', required: true },
|
|
278
299
|
update: { type: 'object', required: true },
|
|
300
|
+
skipTriggers: { type: 'boolean', required: false },
|
|
279
301
|
},
|
|
280
302
|
);
|
|
281
303
|
|
|
@@ -285,6 +307,7 @@ export class ObjectsService {
|
|
|
285
307
|
update,
|
|
286
308
|
},
|
|
287
309
|
};
|
|
310
|
+
if (skipTriggers) params.query = { skipTriggers: true };
|
|
288
311
|
|
|
289
312
|
const result = await this.sdk._fetch(`/object/${object}`, 'PUT', params);
|
|
290
313
|
return result;
|
|
@@ -294,28 +317,31 @@ export class ObjectsService {
|
|
|
294
317
|
* Create a new object record
|
|
295
318
|
*
|
|
296
319
|
* Preferred usage (new signature):
|
|
297
|
-
* sdk.objects.create({ object: 'users', body: { name: 'John', email: 'john@example.com' } })
|
|
320
|
+
* sdk.objects.create({ object: 'users', body: { name: 'John', email: 'john@example.com' }, skipTriggers: true })
|
|
298
321
|
*
|
|
299
322
|
* Legacy usage (deprecated, but supported):
|
|
300
323
|
* sdk.objects.create('users', { name: 'John', email: 'john@example.com' })
|
|
301
324
|
*
|
|
302
325
|
* @param {object} args - Creation parameters
|
|
326
|
+
* @param {boolean} [args.skipTriggers=false] - Skip trigger execution for this write
|
|
303
327
|
* @returns {Promise} Created object data
|
|
304
328
|
*/
|
|
305
329
|
async create(...args) {
|
|
306
|
-
// New signature: create({ object, body })
|
|
330
|
+
// New signature: create({ object, body, skipTriggers })
|
|
307
331
|
if (args.length === 1 && typeof args[0] === 'object' && args[0].object) {
|
|
308
|
-
const { object, body } = args[0];
|
|
332
|
+
const { object, body, skipTriggers = false } = args[0];
|
|
309
333
|
|
|
310
334
|
this.sdk.validateParams(
|
|
311
|
-
{ object, body },
|
|
335
|
+
{ object, body, skipTriggers },
|
|
312
336
|
{
|
|
313
337
|
object: { type: 'string', required: true },
|
|
314
338
|
body: { type: 'object', required: true },
|
|
339
|
+
skipTriggers: { type: 'boolean', required: false },
|
|
315
340
|
},
|
|
316
341
|
);
|
|
317
342
|
|
|
318
343
|
const params = { body };
|
|
344
|
+
if (skipTriggers) params.query = { skipTriggers: true };
|
|
319
345
|
return await this.sdk._fetch(`/object/${object}`, 'POST', params);
|
|
320
346
|
}
|
|
321
347
|
|
|
@@ -338,12 +364,29 @@ export class ObjectsService {
|
|
|
338
364
|
throw new Error('Invalid arguments for create method');
|
|
339
365
|
}
|
|
340
366
|
|
|
341
|
-
|
|
367
|
+
/**
|
|
368
|
+
* Delete records matching a where clause.
|
|
369
|
+
*
|
|
370
|
+
* @param {object} args
|
|
371
|
+
* @param {string} args.object
|
|
372
|
+
* @param {object} args.where
|
|
373
|
+
* @param {boolean} [args.skipTriggers=false] - Do not run triggers for this write
|
|
374
|
+
* @returns {Promise} Delete result
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* await sdk.objects.delete({
|
|
378
|
+
* object: 'people',
|
|
379
|
+
* where: { id: '013…' },
|
|
380
|
+
* skipTriggers: true,
|
|
381
|
+
* });
|
|
382
|
+
*/
|
|
383
|
+
async delete({ object, where, skipTriggers = false }) {
|
|
342
384
|
this.sdk.validateParams(
|
|
343
|
-
{ object, where },
|
|
385
|
+
{ object, where, skipTriggers },
|
|
344
386
|
{
|
|
345
387
|
object: { type: 'string', required: true },
|
|
346
388
|
where: { type: 'object', required: true },
|
|
389
|
+
skipTriggers: { type: 'boolean', required: false },
|
|
347
390
|
},
|
|
348
391
|
);
|
|
349
392
|
|
|
@@ -352,17 +395,31 @@ export class ObjectsService {
|
|
|
352
395
|
where,
|
|
353
396
|
},
|
|
354
397
|
};
|
|
398
|
+
if (skipTriggers) params.query = { skipTriggers: true };
|
|
355
399
|
|
|
356
400
|
const result = await this.sdk._fetch(`/object/${object}`, 'DELETE', params);
|
|
357
401
|
return result;
|
|
358
402
|
}
|
|
359
403
|
|
|
360
|
-
|
|
404
|
+
/**
|
|
405
|
+
* Delete a record by id.
|
|
406
|
+
*
|
|
407
|
+
* @param {object} args
|
|
408
|
+
* @param {string} args.object
|
|
409
|
+
* @param {string} args.id
|
|
410
|
+
* @param {boolean} [args.skipTriggers=false] - Do not run triggers for this write
|
|
411
|
+
* @returns {Promise} Delete result
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* await sdk.objects.deleteById({ object: 'people', id: '013…', skipTriggers: true });
|
|
415
|
+
*/
|
|
416
|
+
async deleteById({ object, id, skipTriggers = false }) {
|
|
361
417
|
this.sdk.validateParams(
|
|
362
|
-
{ object, id },
|
|
418
|
+
{ object, id, skipTriggers },
|
|
363
419
|
{
|
|
364
420
|
object: { type: 'string', required: true },
|
|
365
421
|
id: { type: 'string', required: true },
|
|
422
|
+
skipTriggers: { type: 'boolean', required: false },
|
|
366
423
|
},
|
|
367
424
|
);
|
|
368
425
|
|
|
@@ -373,6 +430,7 @@ export class ObjectsService {
|
|
|
373
430
|
},
|
|
374
431
|
},
|
|
375
432
|
};
|
|
433
|
+
if (skipTriggers) params.query = { skipTriggers: true };
|
|
376
434
|
|
|
377
435
|
const result = await this.sdk._fetch(`/object/${object}`, 'DELETE', params);
|
|
378
436
|
return result;
|
|
@@ -942,4 +1000,83 @@ export class ObjectsService {
|
|
|
942
1000
|
);
|
|
943
1001
|
return result;
|
|
944
1002
|
}
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* List Google Ads customer IDs for an OAuth connection.
|
|
1006
|
+
*
|
|
1007
|
+
* @param {object} args
|
|
1008
|
+
* @param {string} args.connectionId
|
|
1009
|
+
* @returns {Promise<{results: object[], warning?: string|null}>}
|
|
1010
|
+
*/
|
|
1011
|
+
async listGoogleAdAccounts({ connectionId }) {
|
|
1012
|
+
this.sdk.validateParams(
|
|
1013
|
+
{ connectionId },
|
|
1014
|
+
{ connectionId: { type: 'string', required: true } },
|
|
1015
|
+
);
|
|
1016
|
+
return this.sdk._fetch('/object/ad-catalog/google/accounts', 'GET', {
|
|
1017
|
+
query: { connectionId },
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
/**
|
|
1022
|
+
* List Google Ads campaigns for a customer.
|
|
1023
|
+
*
|
|
1024
|
+
* @param {object} args
|
|
1025
|
+
* @param {string} args.connectionId
|
|
1026
|
+
* @param {string} args.customerId
|
|
1027
|
+
* @param {string} [args.loginCustomerId]
|
|
1028
|
+
* @returns {Promise<{results: object[]}>}
|
|
1029
|
+
*/
|
|
1030
|
+
async listGoogleAdCampaigns({ connectionId, customerId, loginCustomerId }) {
|
|
1031
|
+
this.sdk.validateParams(
|
|
1032
|
+
{ connectionId, customerId },
|
|
1033
|
+
{
|
|
1034
|
+
connectionId: { type: 'string', required: true },
|
|
1035
|
+
customerId: { type: 'string', required: true },
|
|
1036
|
+
},
|
|
1037
|
+
);
|
|
1038
|
+
const query = { connectionId, customerId };
|
|
1039
|
+
if (loginCustomerId) query.loginCustomerId = loginCustomerId;
|
|
1040
|
+
return this.sdk._fetch('/object/ad-catalog/google/campaigns', 'GET', {
|
|
1041
|
+
query,
|
|
1042
|
+
});
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* List Meta ad accounts for an OAuth connection.
|
|
1047
|
+
*
|
|
1048
|
+
* @param {object} args
|
|
1049
|
+
* @param {string} args.connectionId
|
|
1050
|
+
* @returns {Promise<{results: object[]}>}
|
|
1051
|
+
*/
|
|
1052
|
+
async listMetaAdAccounts({ connectionId }) {
|
|
1053
|
+
this.sdk.validateParams(
|
|
1054
|
+
{ connectionId },
|
|
1055
|
+
{ connectionId: { type: 'string', required: true } },
|
|
1056
|
+
);
|
|
1057
|
+
return this.sdk._fetch('/object/ad-catalog/meta/accounts', 'GET', {
|
|
1058
|
+
query: { connectionId },
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
/**
|
|
1063
|
+
* List Meta campaigns for an ad account.
|
|
1064
|
+
*
|
|
1065
|
+
* @param {object} args
|
|
1066
|
+
* @param {string} args.connectionId
|
|
1067
|
+
* @param {string} args.adAccountId
|
|
1068
|
+
* @returns {Promise<{results: object[]}>}
|
|
1069
|
+
*/
|
|
1070
|
+
async listMetaAdCampaigns({ connectionId, adAccountId }) {
|
|
1071
|
+
this.sdk.validateParams(
|
|
1072
|
+
{ connectionId, adAccountId },
|
|
1073
|
+
{
|
|
1074
|
+
connectionId: { type: 'string', required: true },
|
|
1075
|
+
adAccountId: { type: 'string', required: true },
|
|
1076
|
+
},
|
|
1077
|
+
);
|
|
1078
|
+
return this.sdk._fetch('/object/ad-catalog/meta/campaigns', 'GET', {
|
|
1079
|
+
query: { connectionId, adAccountId },
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
945
1082
|
}
|