From f3b1cde2cf2a72c6a10b4d7f825d584a99bc071b Mon Sep 17 00:00:00 2001 From: rtlCoil Date: Tue, 6 Jul 2021 19:32:40 +0300 Subject: [PATCH] Return structured metadata in resources APIs --- lib-es5/api.js | 8 +-- lib/api.js | 8 +-- test/integration/api/admin/api_spec.js | 79 ++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/lib-es5/api.js b/lib-es5/api.js index ce623ced..03a87c4b 100644 --- a/lib-es5/api.js +++ b/lib-es5/api.js @@ -54,7 +54,7 @@ exports.resources = function resources(callback) { if (options.start_at != null && Object.prototype.toString.call(options.start_at) === '[object Date]') { options.start_at = options.start_at.toUTCString(); } - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "prefix", "tags", "context", "direction", "moderations", "start_at"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "prefix", "tags", "context", "direction", "moderations", "start_at", "metadata"), callback, options); }; exports.resources_by_tag = function resources_by_tag(tag, callback) { @@ -64,7 +64,7 @@ exports.resources_by_tag = function resources_by_tag(tag, callback) { uri = void 0; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "tags", tag]; - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"), callback, options); }; exports.resources_by_context = function resources_by_context(key, value, callback) { @@ -75,7 +75,7 @@ exports.resources_by_context = function resources_by_context(key, value, callbac uri = void 0; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "context"]; - params = pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"); + params = pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"); params.key = key; if (value != null) { params.value = value; @@ -90,7 +90,7 @@ exports.resources_by_moderation = function resources_by_moderation(kind, status, uri = void 0; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "moderations", kind, status]; - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"), callback, options); }; exports.resources_by_ids = function resources_by_ids(public_ids, callback) { diff --git a/lib/api.js b/lib/api.js index 22bcdb57..23b378da 100644 --- a/lib/api.js +++ b/lib/api.js @@ -38,21 +38,21 @@ exports.resources = function resources(callback, options = {}) { if ((options.start_at != null) && Object.prototype.toString.call(options.start_at) === '[object Date]') { options.start_at = options.start_at.toUTCString(); } - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "prefix", "tags", "context", "direction", "moderations", "start_at"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "prefix", "tags", "context", "direction", "moderations", "start_at", "metadata"), callback, options); }; exports.resources_by_tag = function resources_by_tag(tag, callback, options = {}) { let resource_type, uri; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "tags", tag]; - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"), callback, options); }; exports.resources_by_context = function resources_by_context(key, value, callback, options = {}) { let params, resource_type, uri; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "context"]; - params = pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"); + params = pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"); params.key = key; if (value != null) { params.value = value; @@ -64,7 +64,7 @@ exports.resources_by_moderation = function resources_by_moderation(kind, status, let resource_type, uri; resource_type = options.resource_type || "image"; uri = ["resources", resource_type, "moderations", kind, status]; - return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options); + return call_api("get", uri, pickOnlyExistingValues(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations", "metadata"), callback, options); }; exports.resources_by_ids = function resources_by_ids(public_ids, callback, options = {}) { diff --git a/test/integration/api/admin/api_spec.js b/test/integration/api/admin/api_spec.js index 1025c49c..e50bbb9a 100644 --- a/test/integration/api/admin/api_spec.js +++ b/test/integration/api/admin/api_spec.js @@ -69,6 +69,8 @@ const EXPLICIT_TRANSFORMATION2 = { overlay: `text:Arial_60:${TEST_TAG}` }; +const METADATA_EXTERNAL_ID = "metadata_external_id_" + TEST_TAG; +const METADATA_DEFAULT_VALUE = "metadata_default_value_" + TEST_TAG; function getAllTags({ resources }) { @@ -87,6 +89,12 @@ describe("api", function () { before(function () { this.timeout(TIMEOUT.LONG); return Q.allSettled([ + cloudinary.v2.api.add_metadata_field({ + external_id: METADATA_EXTERNAL_ID, + label: METADATA_EXTERNAL_ID, + type: 'string', + default_value: METADATA_DEFAULT_VALUE + }), uploadImage({ public_id: PUBLIC_ID, tags: UPLOAD_TAGS, @@ -123,6 +131,7 @@ describe("api", function () { expect().fail("Missing key and secret. Please set CLOUDINARY_URL."); } return Q.allSettled([ + cloudinary.v2.api.delete_metadata_field(METADATA_EXTERNAL_ID), cloudinary.v2.api.delete_resources_by_tag(TEST_TAG), cloudinary.v2.api.delete_upload_preset(API_TEST_UPLOAD_PRESET1), cloudinary.v2.api.delete_upload_preset(API_TEST_UPLOAD_PRESET2), @@ -157,6 +166,76 @@ describe("api", function () { expect(resource.type).to.eql("upload"); }); }); + it("should allow listing resources with metadata", async function () { + this.timeout(TIMEOUT.MEDIUM); + let result = await cloudinary.v2.api.resources({ + type: "upload", + prefix: PUBLIC_ID, + metadata: true + }); + result.resources.forEach((resource) => { + expect(resource).to.have.property('metadata'); + }); + result = await cloudinary.v2.api.resources({ + type: "upload", + prefix: PUBLIC_ID, + metadata: false + }); + result.resources.forEach((resource) => { + expect(resource).to.not.have.property('metadata'); + }); + }); + it("should allow listing resources by tag with metadata", async function () { + this.timeout(TIMEOUT.MEDIUM); + let result = await cloudinary.v2.api.resources_by_tag(TEST_TAG, { + metadata: true + }); + result.resources.forEach((resource) => { + expect(resource).to.have.property('metadata'); + }); + result = await cloudinary.v2.api.resources_by_tag(TEST_TAG, { + metadata: false + }); + result.resources.forEach((resource) => { + expect(resource).to.not.have.property('metadata'); + }); + }); + it("should allow listing resources by context with metadata", async function () { + this.timeout(TIMEOUT.MEDIUM); + let result = await cloudinary.v2.api.resources_by_context(contextKey, null, { + metadata: true + }); + result.resources.forEach((resource) => { + expect(resource).to.have.property('metadata'); + }); + result = await cloudinary.v2.api.resources_by_context(contextKey, null, { + metadata: false + }); + result.resources.forEach((resource) => { + expect(resource).to.not.have.property('metadata'); + }); + }); + it("should allow listing resources by moderation with metadata", async function () { + this.timeout(TIMEOUT.MEDIUM); + const moderation = "manual"; + const status = "pending"; + await uploadImage({ + moderation, + tags: [TEST_TAG] + }); + let result = await cloudinary.v2.api.resources_by_moderation(moderation, status, { + metadata: true + }); + result.resources.forEach((resource) => { + expect(resource).to.have.property('metadata'); + }); + result = await cloudinary.v2.api.resources_by_moderation(moderation, status, { + metadata: false + }); + result.resources.forEach((resource) => { + expect(resource).to.not.have.property('metadata'); + }); + }); it("should allow listing resources by type", function () { this.timeout(TIMEOUT.MEDIUM); return uploadImage({