Skip to content

Commit afe8fae

Browse files
Add support for metadata array value (#433)
* Add support for metadata array value
1 parent 2f20c76 commit afe8fae

File tree

3 files changed

+115
-11
lines changed

3 files changed

+115
-11
lines changed

lib-es5/utils/index.js

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -347,16 +347,53 @@ function encode_key_value(arg) {
347347
}).join('|');
348348
}
349349

350-
function encode_context(arg) {
351-
if (!isObject(arg)) {
352-
return arg;
350+
/**
351+
* @description Escape = and | with two backslashes \\
352+
* @param {string|number} value
353+
* @return {string}
354+
*/
355+
function escapeMetadataValue(value) {
356+
return value.toString().replace(/([=|])/g, '\\$&');
357+
}
358+
359+
/**
360+
*
361+
* @description Encode metadata fields based on incoming value.
362+
* If array, escape as color_id=[\"green\",\"red\"]
363+
* If string/number, escape as in_stock_id=50
364+
*
365+
* Joins resulting values with a pipe:
366+
* in_stock_id=50|color_id=[\"green\",\"red\"]
367+
*
368+
* = and | and escaped by default (this can't be turned off)
369+
*
370+
* @param metadataObj
371+
* @return {string}
372+
*/
373+
function encode_context(metadataObj) {
374+
if (!isObject(metadataObj)) {
375+
return metadataObj;
353376
}
354-
return entries(arg).map(function (_ref3) {
355-
var _ref4 = _slicedToArray(_ref3, 2),
356-
k = _ref4[0],
357-
v = _ref4[1];
358377

359-
return `${k}=${v.replace(/([=|])/g, '\\$&')}`;
378+
return entries(metadataObj).map(function (_ref3) {
379+
var _ref4 = _slicedToArray(_ref3, 2),
380+
key = _ref4[0],
381+
value = _ref4[1];
382+
383+
// if string, simply parse the value and move on
384+
if (isString(value)) {
385+
return `${key}=${escapeMetadataValue(value)}`;
386+
387+
// If array, parse each item individually
388+
} else if (isArray(value)) {
389+
var values = value.map(function (innerVal) {
390+
return `\"${escapeMetadataValue(innerVal)}\"`;
391+
}).join(',');
392+
return `${key}=[${values}]`;
393+
// if unknown, return the value as string
394+
} else {
395+
return value.toString();
396+
}
360397
}).join('|');
361398
}
362399

lib/utils/index.js

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,9 +320,50 @@ function encode_key_value(arg) {
320320
return entries(arg).map(([k, v]) => `${k}=${v}`).join('|');
321321
}
322322

323-
function encode_context(arg) {
324-
if (!isObject(arg)) { return arg; }
325-
return entries(arg).map(([k, v]) => `${k}=${v.replace(/([=|])/g, '\\$&')}`).join('|');
323+
324+
/**
325+
* @description Escape = and | with two backslashes \\
326+
* @param {string|number} value
327+
* @return {string}
328+
*/
329+
function escapeMetadataValue(value) {
330+
return value.toString().replace(/([=|])/g, '\\$&');
331+
}
332+
333+
334+
/**
335+
*
336+
* @description Encode metadata fields based on incoming value.
337+
* If array, escape as color_id=[\"green\",\"red\"]
338+
* If string/number, escape as in_stock_id=50
339+
*
340+
* Joins resulting values with a pipe:
341+
* in_stock_id=50|color_id=[\"green\",\"red\"]
342+
*
343+
* = and | and escaped by default (this can't be turned off)
344+
*
345+
* @param metadataObj
346+
* @return {string}
347+
*/
348+
function encode_context(metadataObj) {
349+
if (!isObject(metadataObj)) { return metadataObj; }
350+
351+
return entries(metadataObj).map(([key, value]) => {
352+
// if string, simply parse the value and move on
353+
if (isString(value)) {
354+
return `${key}=${escapeMetadataValue(value)}`;
355+
356+
// If array, parse each item individually
357+
} else if (isArray(value)) {
358+
let values = value.map((innerVal) => {
359+
return `\"${escapeMetadataValue(innerVal)}\"`
360+
}).join(',');
361+
return `${key}=[${values}]`
362+
// if unknown, return the value as string
363+
} else {
364+
return value.toString();
365+
}
366+
}).join('|');
326367
}
327368

328369
function build_eager(transformations) {

test/integration/api/admin/structured_metadata_spec.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const EXTERNAL_ID_ENUM_2 = 'metadata_external_id_enum_2_' + TEST_ID;
1515
const EXTERNAL_ID_SET = 'metadata_external_id_set_' + TEST_ID;
1616
const EXTERNAL_ID_SET_2 = 'metadata_external_id_set_2_' + TEST_ID;
1717
const EXTERNAL_ID_SET_3 = 'metadata_external_id_set_3_' + TEST_ID;
18+
const EXTERNAL_ID_SET_4 = 'metadata_external_id_set_4_' + TEST_ID;
1819
const EXTERNAL_ID_DELETE = 'metadata_deletion_' + TEST_ID;
1920
const EXTERNAL_ID_DELETE_2 = 'metadata_deletion_2_' + TEST_ID;
2021
const EXTERNAL_ID_DATE_VALIDATION = 'metadata_date_validation_' + TEST_ID;
@@ -414,4 +415,29 @@ describe("structured metadata api", function () {
414415
});
415416
});
416417
});
418+
419+
it('Should update an metadata field that is an array', (done) => {
420+
let metadata = {
421+
"external_id": EXTERNAL_ID_SET_4,
422+
"label": EXTERNAL_ID_SET_4,
423+
"type": "set",
424+
"datasource": {
425+
"values": [
426+
{
427+
"external_id": "1",
428+
"value": "Email",
429+
"state": "active"
430+
}
431+
]
432+
}
433+
};
434+
435+
api.add_metadata_field(metadata, (res, res2) => {
436+
cloudinary.v2.uploader.update_metadata({[EXTERNAL_ID_SET_4]: [1]}, ['sample'], (err, res) => {
437+
expect(typeof err).to.be('undefined');
438+
expect(res.public_ids[0]).to.equal('sample');
439+
done();
440+
})
441+
});
442+
});
417443
});

0 commit comments

Comments
 (0)