Skip to content

Commit eced347

Browse files
feat: basic asset relations api
1 parent 262d690 commit eced347

File tree

5 files changed

+243
-10
lines changed

5 files changed

+243
-10
lines changed

lib-es5/api.js

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,50 @@ exports.delete_all_resources = function delete_all_resources(callback) {
242242
}), callback, options);
243243
};
244244

245+
var createRelationParams = function createRelationParams() {
246+
var publicIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
247+
248+
return {
249+
assets_to_relate: Array.isArray(publicIds) ? publicIds : [publicIds]
250+
};
251+
};
252+
253+
var deleteRelationParams = function deleteRelationParams() {
254+
var publicIds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
255+
256+
return {
257+
assets_to_unrelate: Array.isArray(publicIds) ? publicIds : [publicIds]
258+
};
259+
};
260+
261+
exports.add_related_assets = function (publicId, assetsToRelate, callback) {
262+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
263+
264+
var params = createRelationParams(assetsToRelate);
265+
return call_api('post', ['resources', options.resource_type, options.type, publicId], params, callback, options);
266+
};
267+
268+
exports.add_related_assets_by_asset_id = function (assetId, assetsToRelate, callback) {
269+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
270+
271+
var params = createRelationParams(assetsToRelate);
272+
return call_api('post', ['resources', assetId], params, callback, options);
273+
};
274+
275+
exports.delete_related_assets = function (publicId, assetsToUnrelate, callback) {
276+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
277+
278+
var params = deleteRelationParams(assetsToUnrelate);
279+
return call_api('delete', ['resources', options.resource_type, options.type, publicId], params, callback, options);
280+
};
281+
282+
exports.delete_related_assets_by_asset_id = function (assetId, assetsToUnrelate, callback) {
283+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
284+
285+
var params = deleteRelationParams(assetsToUnrelate);
286+
return call_api('delete', ['resources', assetId], params, callback, options);
287+
};
288+
245289
exports.delete_derived_resources = function delete_derived_resources(derived_resource_ids, callback) {
246290
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
247291

@@ -748,7 +792,10 @@ exports.order_metadata_field_datasource = function order_metadata_field_datasour
748792
var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
749793

750794
options.content_type = "json";
751-
var params = { order_by: sort_by, direction: direction };
795+
var params = {
796+
order_by: sort_by,
797+
direction: direction
798+
};
752799
return call_api("post", ["metadata_fields", field_external_id, "datasource", "order"], params, callback, options);
753800
};
754801

@@ -766,7 +813,10 @@ exports.reorder_metadata_fields = function reorder_metadata_fields(order_by, dir
766813
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
767814

768815
options.content_type = "json";
769-
var params = { order_by, direction };
816+
var params = {
817+
order_by,
818+
direction
819+
};
770820
return call_api("put", ["metadata_fields", "order"], params, callback, options);
771821
};
772822

lib-es5/v2/api.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,9 @@ v1_adapters(exports, api, {
7070
list_metadata_rules: 1,
7171
add_metadata_rule: 1,
7272
delete_metadata_rule: 1,
73-
update_metadata_rule: 2
73+
update_metadata_rule: 2,
74+
add_related_assets: 2,
75+
add_related_assets_by_asset_id: 2,
76+
delete_related_assets: 2,
77+
delete_related_assets_by_asset_id: 2
7478
});

lib/api.js

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
const utils = require("./utils");
22
const call_api = require("./api_client/call_api");
33

4-
const { extend, pickOnlyExistingValues } = utils;
4+
const {
5+
extend,
6+
pickOnlyExistingValues
7+
} = utils;
58

69
const TRANSFORMATIONS_URI = "transformations";
710

@@ -175,6 +178,38 @@ exports.delete_all_resources = function delete_all_resources(callback, options =
175178
}), callback, options);
176179
};
177180

181+
const createRelationParams = (publicIds = []) => {
182+
return {
183+
assets_to_relate: Array.isArray(publicIds) ? publicIds : [publicIds]
184+
};
185+
};
186+
187+
const deleteRelationParams = (publicIds = []) => {
188+
return {
189+
assets_to_unrelate: Array.isArray(publicIds) ? publicIds : [publicIds]
190+
};
191+
};
192+
193+
exports.add_related_assets = (publicId, assetsToRelate, callback, options = {}) => {
194+
const params = createRelationParams(assetsToRelate);
195+
return call_api('post', ['resources', options.resource_type, options.type, publicId], params, callback, options);
196+
};
197+
198+
exports.add_related_assets_by_asset_id = (assetId, assetsToRelate, callback, options = {}) => {
199+
const params = createRelationParams(assetsToRelate);
200+
return call_api('post', ['resources', assetId], params, callback, options);
201+
};
202+
203+
exports.delete_related_assets = (publicId, assetsToUnrelate, callback, options = {}) => {
204+
const params = deleteRelationParams(assetsToUnrelate);
205+
return call_api('delete', ['resources', options.resource_type, options.type, publicId], params, callback, options);
206+
};
207+
208+
exports.delete_related_assets_by_asset_id = (assetId, assetsToUnrelate, callback, options = {}) => {
209+
const params = deleteRelationParams(assetsToUnrelate);
210+
return call_api('delete', ['resources', assetId], params, callback, options);
211+
};
212+
178213
exports.delete_derived_resources = function delete_derived_resources(derived_resource_ids, callback, options = {}) {
179214
let uri;
180215
uri = ["derived_resources"];
@@ -235,7 +270,7 @@ exports.update_transformation = function update_transformation(transformationNam
235270
};
236271

237272
exports.create_transformation = function create_transformation(name, definition, callback, options = {}) {
238-
const params = { name };
273+
const params = {name};
239274
params.transformation = utils.build_eager(definition);
240275
return call_api("post", TRANSFORMATIONS_URI, params, callback, options);
241276
};
@@ -560,7 +595,7 @@ exports.update_metadata_field_datasource = function update_metadata_field_dataso
560595
*/
561596
exports.delete_datasource_entries = function delete_datasource_entries(field_external_id, entries_external_id, callback, options = {}) {
562597
options.content_type = "json";
563-
const params = { external_ids: entries_external_id };
598+
const params = {external_ids: entries_external_id};
564599
return call_api("delete", ["metadata_fields", field_external_id, "datasource"], params, callback, options);
565600
};
566601

@@ -581,7 +616,7 @@ exports.delete_datasource_entries = function delete_datasource_entries(field_ext
581616
*/
582617
exports.restore_metadata_field_datasource = function restore_metadata_field_datasource(field_external_id, entries_external_id, callback, options = {}) {
583618
options.content_type = "json";
584-
const params = { external_ids: entries_external_id };
619+
const params = {external_ids: entries_external_id};
585620
return call_api("post", ["metadata_fields", field_external_id, "datasource_restore"], params, callback, options);
586621
};
587622

@@ -597,7 +632,10 @@ exports.restore_metadata_field_datasource = function restore_metadata_field_data
597632
*/
598633
exports.order_metadata_field_datasource = function order_metadata_field_datasource(field_external_id, sort_by, direction, callback, options = {}) {
599634
options.content_type = "json";
600-
const params = { order_by: sort_by, direction: direction};
635+
const params = {
636+
order_by: sort_by,
637+
direction: direction
638+
};
601639
return call_api("post", ["metadata_fields", field_external_id, "datasource", "order"], params, callback, options);
602640
};
603641

@@ -613,7 +651,10 @@ exports.order_metadata_field_datasource = function order_metadata_field_datasour
613651
*/
614652
exports.reorder_metadata_fields = function reorder_metadata_fields(order_by, direction, callback, options = {}) {
615653
options.content_type = "json";
616-
const params = { order_by, direction };
654+
const params = {
655+
order_by,
656+
direction
657+
};
617658
return call_api("put", ["metadata_fields", "order"], params, callback, options);
618659
};
619660

lib/v2/api.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,9 @@ v1_adapters(exports, api, {
6868
list_metadata_rules: 1,
6969
add_metadata_rule: 1,
7070
delete_metadata_rule: 1,
71-
update_metadata_rule: 2
71+
update_metadata_rule: 2,
72+
add_related_assets: 2,
73+
add_related_assets_by_asset_id: 2,
74+
delete_related_assets: 2,
75+
delete_related_assets_by_asset_id: 2
7276
});
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
const helper = require('../../../spechelper');
2+
const cloudinary = require('../../../../cloudinary');
3+
const {
4+
strictEqual,
5+
deepStrictEqual
6+
} = require('assert');
7+
const {TEST_CLOUD_NAME} = require('../../../testUtils/testConstants');
8+
9+
describe('Asset relations API', () => {
10+
const testPublicId = 'test-public-id';
11+
const testAssetId = 'test-asset-id';
12+
const singleRelatedPublicId = 'related-public-id';
13+
const multipleRelatedPublicId = ['related-public-id-1', 'related-public-id-2'];
14+
15+
describe('when creating new relation', () => {
16+
describe('using public id', () => {
17+
it('should allow passing a single public id to create a relation', () => {
18+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
19+
cloudinary.v2.api.add_related_assets(testPublicId, singleRelatedPublicId, {
20+
resource_type: 'image',
21+
type: 'upload'
22+
});
23+
24+
const [calledWithUrl] = requestSpy.firstCall.args;
25+
strictEqual(calledWithUrl.method, 'POST');
26+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/image/upload/test-public-id`);
27+
const callApiArguments = writeSpy.firstCall.args;
28+
deepStrictEqual(callApiArguments, ['assets_to_relate=related-public-id']);
29+
});
30+
});
31+
32+
it('should allow passing multiple public ids to create a relation', () => {
33+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
34+
cloudinary.v2.api.add_related_assets(testPublicId, multipleRelatedPublicId, {
35+
resource_type: 'image',
36+
type: 'upload'
37+
});
38+
39+
const [calledWithUrl] = requestSpy.firstCall.args;
40+
strictEqual(calledWithUrl.method, 'POST');
41+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/image/upload/${testPublicId}`);
42+
const callApiArguments = writeSpy.firstCall.args;
43+
deepStrictEqual(callApiArguments, ['assets_to_relate=related-public-id-1&assets_to_relate=related-public-id-2']);
44+
});
45+
});
46+
});
47+
48+
describe('using asset id', () => {
49+
it('should allow passing a single public id to create a relation', () => {
50+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
51+
cloudinary.v2.api.add_related_assets_by_asset_id(testAssetId, singleRelatedPublicId);
52+
53+
const [calledWithUrl] = requestSpy.firstCall.args;
54+
strictEqual(calledWithUrl.method, 'POST');
55+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/test-asset-id`);
56+
const callApiArguments = writeSpy.firstCall.args;
57+
deepStrictEqual(callApiArguments, ['assets_to_relate=related-public-id']);
58+
});
59+
});
60+
61+
it('should allow passing multiple public ids to create a relation', () => {
62+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
63+
cloudinary.v2.api.add_related_assets_by_asset_id(testAssetId, multipleRelatedPublicId);
64+
65+
const [calledWithUrl] = requestSpy.firstCall.args;
66+
strictEqual(calledWithUrl.method, 'POST');
67+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/test-asset-id`);
68+
const callApiArguments = writeSpy.firstCall.args;
69+
deepStrictEqual(callApiArguments, ['assets_to_relate=related-public-id-1&assets_to_relate=related-public-id-2']);
70+
});
71+
});
72+
});
73+
});
74+
75+
describe('when deleting existing relation', () => {
76+
describe('using public id', () => {
77+
it('should allow passing a single public id to delete a relation', () => {
78+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
79+
cloudinary.v2.api.delete_related_assets(testPublicId, singleRelatedPublicId, {
80+
resource_type: 'image',
81+
type: 'upload'
82+
});
83+
84+
const [calledWithUrl] = requestSpy.firstCall.args;
85+
strictEqual(calledWithUrl.method, 'DELETE');
86+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/image/upload/test-public-id`);
87+
const callApiArguments = writeSpy.firstCall.args;
88+
deepStrictEqual(callApiArguments, ['assets_to_unrelate=related-public-id']);
89+
});
90+
});
91+
92+
it('should allow passing multiple public ids to delete a relation', () => {
93+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
94+
cloudinary.v2.api.delete_related_assets(testPublicId, multipleRelatedPublicId, {
95+
resource_type: 'image',
96+
type: 'upload'
97+
});
98+
99+
const [calledWithUrl] = requestSpy.firstCall.args;
100+
strictEqual(calledWithUrl.method, 'DELETE');
101+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/image/upload/test-public-id`);
102+
const callApiArguments = writeSpy.firstCall.args;
103+
deepStrictEqual(callApiArguments, ['assets_to_unrelate=related-public-id-1&assets_to_unrelate=related-public-id-2']);
104+
});
105+
});
106+
});
107+
108+
describe('and using asset id', () => {
109+
it('should allow passing a single public id to delete a relation', () => {
110+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
111+
cloudinary.v2.api.delete_related_assets_by_asset_id(testAssetId, singleRelatedPublicId);
112+
113+
const [calledWithUrl] = requestSpy.firstCall.args;
114+
strictEqual(calledWithUrl.method, 'DELETE');
115+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/test-asset-id`);
116+
const callApiArguments = writeSpy.firstCall.args;
117+
deepStrictEqual(callApiArguments, ['assets_to_unrelate=related-public-id']);
118+
});
119+
});
120+
121+
it('should allow passing multiple public ids to delete a relation', () => {
122+
return helper.provideMockObjects((mockXHR, writeSpy, requestSpy) => {
123+
cloudinary.v2.api.delete_related_assets_by_asset_id(testAssetId, multipleRelatedPublicId);
124+
125+
const [calledWithUrl] = requestSpy.firstCall.args;
126+
strictEqual(calledWithUrl.method, 'DELETE');
127+
strictEqual(calledWithUrl.path, `/v1_1/${TEST_CLOUD_NAME}/resources/test-asset-id`);
128+
const callApiArguments = writeSpy.firstCall.args;
129+
deepStrictEqual(callApiArguments, ['assets_to_unrelate=related-public-id-1&assets_to_unrelate=related-public-id-2']);
130+
});
131+
});
132+
});
133+
});
134+
});

0 commit comments

Comments
 (0)