diff --git a/lib/api.js b/lib/api.js index a5032544..3707150d 100644 --- a/lib/api.js +++ b/lib/api.js @@ -213,9 +213,10 @@ exports.delete_related_assets_by_asset_id = (assetId, assetsToUnrelate, callback exports.delete_derived_resources = function delete_derived_resources(derived_resource_ids, callback, options = {}) { let uri; uri = ["derived_resources"]; - return call_api("delete", uri, { - "derived_resource_ids[]": derived_resource_ids - }, callback, options); + return call_api("delete", uri, extend({ + "derived_resource_ids[]": derived_resource_ids, + }, pickOnlyExistingValues(options, "invalidate")) + , callback, options); }; exports.delete_derived_by_transformation = function delete_derived_by_transformation( @@ -692,3 +693,8 @@ exports.update_metadata_rule = function update_metadata_rule(field_external_id, exports.delete_metadata_rule = function delete_metadata_rule(field_external_id, callback, options = {}) { return call_api('delete', ['metadata_rules', field_external_id], {}, callback, options); }; + +exports.set_partial_override = function set_partial_override(asset_id, callback, params = {}) { + const uri = ["resources", asset_id, "partial_overrides"]; + return call_api("put", uri, params, callback, {content_type: 'json'}); +}; diff --git a/lib/api_client/execute_request.js b/lib/api_client/execute_request.js index 9c0418d9..93f5bbc0 100644 --- a/lib/api_client/execute_request.js +++ b/lib/api_client/execute_request.js @@ -74,7 +74,7 @@ function execute_request(method, params, auth, api_url, callback, options = {}) if ("Authorization" in sanitizedOptions.headers) { delete sanitizedOptions.headers.Authorization; } } - if (includes([200, 400, 401, 403, 404, 409, 420, 500], res.statusCode)) { + if (includes([200, 201, 204, 400, 401, 403, 404, 409, 420, 500], res.statusCode)) { let buffer = ""; let error = false; res.on("data", function (d) { diff --git a/lib/v2/api.js b/lib/v2/api.js index 338d826e..1ba8e574 100644 --- a/lib/v2/api.js +++ b/lib/v2/api.js @@ -1,3 +1,5 @@ + + const api = require('../api'); const v1_adapters = require('../utils').v1_adapters; @@ -74,5 +76,6 @@ v1_adapters(exports, api, { add_related_assets: 2, add_related_assets_by_asset_id: 2, delete_related_assets: 2, - delete_related_assets_by_asset_id: 2 + delete_related_assets_by_asset_id: 2, + set_partial_override: 1 }); diff --git a/package.json b/package.json index b87ccd6e..2ccc0e27 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "eslint-plugin-import": "^2.20.2", "expect.js": "0.3.x", "glob": "^7.1.6", - "jsdoc": "^3.5.5", + "jsdoc": "3.5.5", "jsdom": "^9.12.0", "jsdom-global": "2.1.1", "mocha": "^6.2.3", diff --git a/test/integration/api/admin/api_spec.js b/test/integration/api/admin/api_spec.js index 227026c1..3ae5104f 100644 --- a/test/integration/api/admin/api_spec.js +++ b/test/integration/api/admin/api_spec.js @@ -1599,4 +1599,24 @@ describe("api", function () { } }); }); + describe('set_partial_override', () => { + it("should call the PUT /resources/:asset_id/partial_overrides endpoint", async () => { + this.timeout(TIMEOUT.LONG); + await retry(async function () { + return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => { + cloudinary.v2.api.set_partial_override('ASSET_ID_MOCK', { + transformation_prefix: 'tx_prefix', + asset_override_uri: 'snapshot_url', + overrides: [{ action: 'gen_fill', params: { seed: 'seed', prompt: 'prompt', ignore_foreground: true } }] + }); + sinon.assert.calledWith(writeSpy, sinon.match(helper.apiJsonParamMatcher('transformation_prefix', 'tx_prefix'))); + sinon.assert.calledWith(writeSpy, sinon.match(helper.apiJsonParamMatcher('asset_override_uri', 'snapshot_url'))); + return sinon.assert.calledWith(requestSpy, sinon.match({ + pathname: sinon.match("resources/ASSET_ID_MOCK/partial_overrides"), + method: sinon.match("PUT") + })); + }); + }); + }); + }) }); diff --git a/types/index.d.ts b/types/index.d.ts index a167ff47..02d5a57e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -500,6 +500,15 @@ declare module 'cloudinary' { [futureKey: string]: any; } + export interface UpdatePartialOverridesOptions { + transformation_prefix: string; + asset_override_uri: string; + overrides: Array<{ + action: string; + params: Record + }>; + } + export interface UploadApiOptions { access_mode?: AccessMode; allowed_formats?: Array | Array; @@ -1215,6 +1224,10 @@ declare module 'cloudinary' { function restore_metadata_field_datasource(field_external_id: string, entries_external_id: string[], callback?: ResponseCallback): Promise; + function set_partial_override(public_id: string, options: UpdatePartialOverridesOptions, callback?: ResponseCallback): Promise; + + function set_partial_override(public_id: string, callback?: ResponseCallback): Promise; + /****************************** Structured Metadata Rules API V2 Methods *************************************/ function add_metadata_rule(rule: MetadataRule, options?: AdminApiOptions, callback?: ResponseCallback): Promise;