UNPKG

18.6 kBJavaScriptView Raw
1
2const config = require("./config");
3const ensureOption = require('./utils/ensureOption').defaults(config());
4
5const https = /^http:/.test(config().upload_prefix) ? require('http') : require('https');
6const utils = require("./utils");
7
8const {extend, includes, isString, only, ensurePresenceOf} = utils;
9
10const querystring = require("querystring");
11
12const Q = require('q');
13
14const api = module.exports;
15
16function call_api(method, uri, params, callback, options) {
17 let handle_response, query_params;
18 ensurePresenceOf({method, uri});
19 const deferred = Q.defer();
20 const cloudinary = ensureOption(options, "upload_prefix", "https://api.cloudinary.com");
21 const cloud_name = ensureOption(options, "cloud_name");
22 const api_key = ensureOption(options, "api_key");
23 const api_secret = ensureOption(options, "api_secret");
24
25 method = method.toUpperCase();
26 let api_url = [cloudinary, "v1_1", cloud_name].concat(uri).join("/");
27 let content_type = 'application/x-www-form-urlencoded';
28 if (options['content_type'] === 'json') {
29 query_params = JSON.stringify(params);
30 content_type = 'application/json';
31 } else {
32 query_params = querystring.stringify(params);
33 }
34 if (method === "GET") {
35 api_url += "?" + query_params;
36 }
37 let request_options = require('url').parse(api_url);
38 request_options = extend(request_options, {
39 method: method,
40 headers: {
41 'Content-Type': content_type,
42 'User-Agent': utils.getUserAgent()
43 },
44 auth: api_key + ":" + api_secret
45 });
46 if (options.agent != null) {
47 request_options.agent = options.agent;
48 }
49 if (method !== "GET") {
50 request_options.headers['Content-Length'] = Buffer.byteLength(query_params);
51 }
52 handle_response = function (res) {
53 if (includes([200, 400, 401, 403, 404, 409, 420, 500], res.statusCode)) {
54 let buffer = "";
55 let error = false;
56 res.on("data", function (d) {
57 return buffer += d;
58 });
59 res.on("end", function () {
60 let e, result;
61 if (error) {
62 return;
63 }
64 try {
65 result = JSON.parse(buffer);
66 } catch (error1) {
67 e = error1;
68 result = {
69 error: {
70 message: "Server return invalid JSON response. Status Code " + res.statusCode
71 }
72 };
73 }
74 if (result["error"]) {
75 result["error"]["http_code"] = res.statusCode;
76 } else {
77 result["rate_limit_allowed"] = parseInt(res.headers["x-featureratelimit-limit"]);
78 result["rate_limit_reset_at"] = new Date(res.headers["x-featureratelimit-reset"]);
79 result["rate_limit_remaining"] = parseInt(res.headers["x-featureratelimit-remaining"]);
80 }
81 if (result.error) {
82 deferred.reject(result);
83 } else {
84 deferred.resolve(result);
85 }
86 return typeof callback === "function" ? callback(result) : void 0;
87 });
88 return res.on("error", function (e) {
89 error = true;
90 let err_obj = {
91 error: {
92 message: e,
93 http_code: res.statusCode
94 }
95 };
96 deferred.reject(err_obj.error);
97 return typeof callback === "function" ? callback(err_obj) : void 0;
98 });
99 } else {
100 let err_obj = {
101 error: {
102 message: "Server returned unexpected status code - " + res.statusCode,
103 http_code: res.statusCode
104 }
105 };
106 deferred.reject(err_obj.error);
107 return typeof callback === "function" ? callback(err_obj) : void 0;
108 }
109 };
110 const request = https.request(request_options, handle_response);
111 request.on("error", function (e) {
112 return typeof callback === "function" ? callback({
113 error: e
114 }) : void 0;
115 });
116 request.setTimeout( ensureOption(options, "timeout", 60000));
117 if (method !== "GET") {
118 request.write(query_params);
119 }
120 request.end();
121 return deferred.promise;
122}
123
124function transformationString(transformation) {
125 if (isString(transformation)) {
126 return transformation;
127 } else {
128 return utils.generate_transformation_string(extend({}, transformation));
129 }
130}
131
132function deleteResourcesParams(options, params={}) {
133 return extend(params, only(options, "keep_original", "invalidate", "next_cursor", "transformations"));
134}
135
136exports.ping = function ping(callback, options={}) {
137 return call_api("get", ["ping"], {}, callback, options);
138};
139
140exports.usage = function usage(callback, options={}) {
141 return call_api("get", ["usage"], {}, callback, options);
142};
143
144exports.resource_types = function resource_types(callback, options={}) {
145 return call_api("get", ["resources"], {}, callback, options);
146};
147
148exports.resources = function resources(callback, options={}) {
149 let ref, resource_type, type, uri;
150 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
151 type = options["type"];
152 uri = ["resources", resource_type];
153 if (type != null) {
154 uri.push(type);
155 }
156 if ((options.start_at != null) && Object.prototype.toString.call(options.start_at) === '[object Date]') {
157 options.start_at = options.start_at.toUTCString();
158 }
159 return call_api("get", uri, only(options, "next_cursor", "max_results", "prefix", "tags", "context", "direction", "moderations", "start_at"), callback, options);
160};
161
162exports.resources_by_tag = function resources_by_tag(tag, callback, options={}) {
163 let ref, resource_type, uri;
164 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
165 uri = ["resources", resource_type, "tags", tag];
166 return call_api("get", uri, only(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options);
167};
168
169exports.resources_by_context = function resources_by_context(key, value, callback, options={}) {
170 let params, ref, resource_type, uri;
171 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
172 uri = ["resources", resource_type, "context"];
173 params = only(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations");
174 params.key = key;
175 if (value != null) {
176 params.value = value;
177 }
178 return call_api("get", uri, params, callback, options);
179};
180
181exports.resources_by_moderation = function resources_by_moderation(kind, status, callback, options={}) {
182 let ref, resource_type, uri;
183 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
184 uri = ["resources", resource_type, "moderations", kind, status];
185 return call_api("get", uri, only(options, "next_cursor", "max_results", "tags", "context", "direction", "moderations"), callback, options);
186};
187
188exports.resources_by_ids = function resources_by_ids(public_ids, callback, options={}) {
189 let params, ref, ref1, resource_type, type, uri;
190 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
191 type = (ref1 = options["type"]) != null ? ref1 : "upload";
192 uri = ["resources", resource_type, type];
193 params = only(options, "tags", "context", "moderations");
194 params["public_ids[]"] = public_ids;
195 return call_api("get", uri, params, callback, options);
196};
197
198exports.resource = function resource(public_id, callback, options={}) {
199 let ref, ref1, resource_type, type, uri;
200 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
201 type = (ref1 = options["type"]) != null ? ref1 : "upload";
202 uri = ["resources", resource_type, type, public_id];
203 return call_api("get", uri, only(options, "exif", "colors", "faces", "image_metadata", "pages", "phash", "coordinates", "max_results"), callback, options);
204};
205
206exports.restore = function restore(public_ids, callback, options={}) {
207 let ref, ref1, resource_type, type, uri;
208 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
209 type = (ref1 = options["type"]) != null ? ref1 : "upload";
210 uri = ["resources", resource_type, type, "restore"];
211 return call_api("post", uri, {
212 public_ids: public_ids
213 }, callback, options);
214};
215
216exports.update = function update(public_id, callback, options={}) {
217 let params, ref, ref1, resource_type, type, uri;
218 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
219 type = (ref1 = options["type"]) != null ? ref1 : "upload";
220 uri = ["resources", resource_type, type, public_id];
221 params = utils.updateable_resource_params(options);
222 if (options.moderation_status != null) {
223 params.moderation_status = options.moderation_status;
224 }
225 return call_api("post", uri, params, callback, options);
226};
227
228exports.delete_resources = function delete_resources(public_ids, callback, options={}) {
229 let ref, ref1, resource_type, type, uri;
230 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
231 type = (ref1 = options["type"]) != null ? ref1 : "upload";
232 uri = ["resources", resource_type, type];
233 return call_api("delete", uri, deleteResourcesParams(options, {
234 "public_ids[]": public_ids
235 }), callback, options);
236};
237
238exports.delete_resources_by_prefix = function delete_resources_by_prefix(prefix, callback, options={}) {
239 let ref, ref1, resource_type, type, uri;
240 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
241 type = (ref1 = options["type"]) != null ? ref1 : "upload";
242 uri = ["resources", resource_type, type];
243 return call_api("delete", uri, deleteResourcesParams(options, {
244 prefix: prefix
245 }), callback, options);
246};
247
248exports.delete_resources_by_tag = function delete_resources_by_tag(tag, callback, options={}) {
249 let ref, resource_type, uri;
250 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
251 uri = ["resources", resource_type, "tags", tag];
252 return call_api("delete", uri, deleteResourcesParams(options), callback, options);
253};
254
255exports.delete_all_resources = function delete_all_resources(callback, options={}) {
256 let ref, ref1, resource_type, type, uri;
257
258 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
259 type = (ref1 = options["type"]) != null ? ref1 : "upload";
260 uri = ["resources", resource_type, type];
261 return call_api("delete", uri, deleteResourcesParams(options, {
262 all: true
263 }), callback, options);
264};
265
266exports.delete_derived_resources = function delete_derived_resources(derived_resource_ids, callback, options={}) {
267 let uri;
268 uri = ["derived_resources"];
269 return call_api("delete", uri, {
270 "derived_resource_ids[]": derived_resource_ids
271 }, callback, options);
272};
273
274exports.delete_derived_by_transformation = function delete_derived_by_transformation(public_ids, transformations, callback, options={}) {
275 let params, resource_type, type, uri;
276 resource_type = options["resource_type"] || "image";
277 type = options["type"] || "upload";
278 uri = "resources/" + resource_type + "/" + type;
279 params = extend({
280 "public_ids[]": public_ids
281 }, only(options, "invalidate"));
282 params["keep_original"] = true;
283 params["transformations"] = utils.build_eager(transformations);
284 return call_api("delete", uri, params, callback, options);
285};
286
287exports.tags = function tags(callback, options={}) {
288 let ref, resource_type, uri;
289 resource_type = (ref = options["resource_type"]) != null ? ref : "image";
290 uri = ["tags", resource_type];
291 return call_api("get", uri, only(options, "next_cursor", "max_results", "prefix"), callback, options);
292};
293
294exports.transformations = function transformations(callback, options={}) {
295 return call_api("get", ["transformations"], only(options, "next_cursor", "max_results", "named"), callback, options);
296};
297
298exports.transformation = function transformation(transformation, callback, options={}) {
299 let uri;
300 uri = ["transformations", transformationString(transformation)];
301 return call_api("get", uri, only(options, "next_cursor", "max_results"), callback, options);
302};
303
304exports.delete_transformation = function delete_transformation(transformation, callback, options={}) {
305 let uri;
306 uri = ["transformations", transformationString(transformation)];
307 return call_api("delete", uri, {}, callback, options);
308};
309
310exports.update_transformation = function update_transformation(transformation, updates, callback, options={}) {
311 let params, uri;
312 uri = ["transformations", transformationString(transformation)];
313 params = only(updates, "allowed_for_strict");
314 if (updates.unsafe_update != null) {
315 params.unsafe_update = transformationString(updates.unsafe_update);
316 }
317 return call_api("put", uri, params, callback, options);
318};
319
320exports.create_transformation = function create_transformation(name, definition, callback, options={}) {
321 let uri;
322 uri = ["transformations", name];
323 return call_api("post", uri, {
324 transformation: transformationString(definition)
325 }, callback, options);
326};
327
328exports.upload_presets = function upload_presets(callback, options={}) {
329 return call_api("get", ["upload_presets"], only(options, "next_cursor", "max_results"), callback, options);
330};
331
332exports.upload_preset = function upload_preset(name, callback, options={}) {
333 let uri;
334 uri = ["upload_presets", name];
335 return call_api("get", uri, {}, callback, options);
336};
337
338exports.delete_upload_preset = function delete_upload_preset(name, callback, options={}) {
339 let uri;
340 uri = ["upload_presets", name];
341 return call_api("delete", uri, {}, callback, options);
342};
343
344exports.update_upload_preset = function update_upload_preset(name, callback, options={}) {
345 let params, uri;
346 uri = ["upload_presets", name];
347 params = utils.merge(utils.clear_blank(utils.build_upload_params(options)), only(options, "unsigned", "disallow_public_id"));
348 return call_api("put", uri, params, callback, options);
349};
350
351exports.create_upload_preset = function create_upload_preset(callback, options={}) {
352 let params, uri;
353 uri = ["upload_presets"];
354 params = utils.merge(utils.clear_blank(utils.build_upload_params(options)), only(options, "name", "unsigned", "disallow_public_id"));
355 return call_api("post", uri, params, callback, options);
356};
357
358exports.root_folders = function root_folders(callback, options={}) {
359 let uri;
360 uri = ["folders"];
361 return call_api("get", uri, {}, callback, options);
362};
363
364exports.sub_folders = function sub_folders(path, callback, options={}) {
365 let uri;
366 uri = ["folders", path];
367 return call_api("get", uri, {}, callback, options);
368};
369
370exports.upload_mappings = function upload_mappings(callback, options={}) {
371 let params;
372 params = only(options, "next_cursor", "max_results");
373 return call_api("get", "upload_mappings", params, callback, options);
374};
375
376exports.upload_mapping = function upload_mapping(name, callback, options={}) {
377 if (name == null) {
378 name = null;
379 }
380 return call_api("get", 'upload_mappings', {
381 folder: name
382 }, callback, options);
383};
384
385exports.delete_upload_mapping = function delete_upload_mapping(name, callback, options={}) {
386 return call_api("delete", 'upload_mappings', {
387 folder: name
388 }, callback, options);
389};
390
391exports.update_upload_mapping = function update_upload_mapping(name, callback, options={}) {
392 let params;
393 params = only(options, "template");
394 params["folder"] = name;
395 return call_api("put", 'upload_mappings', params, callback, options);
396};
397
398exports.create_upload_mapping = function create_upload_mapping(name, callback, options={}) {
399 let params;
400 params = only(options, "template");
401 params["folder"] = name;
402 return call_api("post", 'upload_mappings', params, callback, options);
403};
404
405function publishResource(byKey, value, callback, options={}) {
406 let params, ref, resource_type, uri;
407 params = only(options, "type", "invalidate", "overwrite");
408 params[byKey] = value;
409 resource_type = (ref = options.resource_type) != null ? ref : "image";
410 uri = ["resources", resource_type, "publish_resources"];
411 options = extend({
412 resource_type: resource_type
413 }, options);
414 return call_api("post", uri, params, callback, options);
415}
416
417exports.publish_by_prefix = function publish_by_prefix(prefix, callback, options={}) {
418 return publishResource("prefix", prefix, callback, options);
419};
420
421exports.publish_by_tag = function publish_by_tag(tag, callback, options={}) {
422 return publishResource("tag", tag, callback, options);
423};
424
425exports.publish_by_ids = function publish_by_ids(public_ids, callback, options={}) {
426 return publishResource("public_ids", public_ids, callback, options);
427};
428
429exports.list_streaming_profiles = function list_streaming_profiles(callback, options={}) {
430 return call_api("get", "streaming_profiles", {}, callback, options);
431};
432
433exports.get_streaming_profile = function get_streaming_profile(name, callback, options={}) {
434 return call_api("get", "streaming_profiles/" + name, {}, callback, options);
435};
436
437exports.delete_streaming_profile = function delete_streaming_profile(name, callback, options={}) {
438 return call_api("delete", "streaming_profiles/" + name, {}, callback, options);
439};
440
441exports.update_streaming_profile = function update_streaming_profile(name, callback, options={}) {
442 let params;
443 params = utils.build_streaming_profiles_param(options);
444 return call_api("put", "streaming_profiles/" + name, params, callback, options);
445};
446
447exports.create_streaming_profile = function create_streaming_profile(name, callback, options={}) {
448 let params;
449 params = utils.build_streaming_profiles_param(options);
450 params["name"] = name;
451 return call_api("post", 'streaming_profiles', params, callback, options);
452};
453
454function updateResourcesAccessMode(access_mode, by_key, value, callback, options={}) {
455 let params, ref, ref1, resource_type, type;
456 resource_type = (ref = options.resource_type) != null ? ref : "image";
457 type = (ref1 = options.type) != null ? ref1 : "upload";
458 params = {
459 access_mode: access_mode
460 };
461 params[by_key] = value;
462 return call_api("post", "resources/" + resource_type + "/" + type + "/update_access_mode", params, callback, options);
463}
464
465exports.search = function search(params, callback, options={}) {
466 options['content_type'] = 'json';
467 return call_api("post", "resources/search", params, callback, options);
468};
469
470exports.update_resources_access_mode_by_prefix = function update_resources_access_mode_by_prefix(access_mode, prefix, callback, options={}) {
471 return updateResourcesAccessMode(access_mode, "prefix", prefix, callback, options);
472};
473
474exports.update_resources_access_mode_by_tag = function update_resources_access_mode_by_tag(access_mode, tag, callback, options={}) {
475 return updateResourcesAccessMode(access_mode, "tag", tag, callback, options);
476};
477
478exports.update_resources_access_mode_by_ids = function update_resources_access_mode_by_ids(access_mode, ids, callback, options={}) {
479 return updateResourcesAccessMode(access_mode, "public_ids[]", ids, callback, options);
480};