1 |
|
2 | const config = require("./config");
|
3 | const ensureOption = require('./utils/ensureOption').defaults(config());
|
4 |
|
5 | const https = /^http:/.test(config().upload_prefix) ? require('http') : require('https');
|
6 | const utils = require("./utils");
|
7 |
|
8 | const {extend, includes, isString, only, ensurePresenceOf} = utils;
|
9 |
|
10 | const querystring = require("querystring");
|
11 |
|
12 | const Q = require('q');
|
13 |
|
14 | const api = module.exports;
|
15 |
|
16 | function 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 |
|
124 | function transformationString(transformation) {
|
125 | if (isString(transformation)) {
|
126 | return transformation;
|
127 | } else {
|
128 | return utils.generate_transformation_string(extend({}, transformation));
|
129 | }
|
130 | }
|
131 |
|
132 | function deleteResourcesParams(options, params={}) {
|
133 | return extend(params, only(options, "keep_original", "invalidate", "next_cursor", "transformations"));
|
134 | }
|
135 |
|
136 | exports.ping = function ping(callback, options={}) {
|
137 | return call_api("get", ["ping"], {}, callback, options);
|
138 | };
|
139 |
|
140 | exports.usage = function usage(callback, options={}) {
|
141 | return call_api("get", ["usage"], {}, callback, options);
|
142 | };
|
143 |
|
144 | exports.resource_types = function resource_types(callback, options={}) {
|
145 | return call_api("get", ["resources"], {}, callback, options);
|
146 | };
|
147 |
|
148 | exports.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 |
|
162 | exports.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 |
|
169 | exports.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 |
|
181 | exports.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 |
|
188 | exports.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 |
|
198 | exports.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 |
|
206 | exports.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 |
|
216 | exports.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 |
|
228 | exports.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 |
|
238 | exports.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 |
|
248 | exports.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 |
|
255 | exports.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 |
|
266 | exports.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 |
|
274 | exports.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 |
|
287 | exports.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 |
|
294 | exports.transformations = function transformations(callback, options={}) {
|
295 | return call_api("get", ["transformations"], only(options, "next_cursor", "max_results", "named"), callback, options);
|
296 | };
|
297 |
|
298 | exports.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 |
|
304 | exports.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 |
|
310 | exports.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 |
|
320 | exports.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 |
|
328 | exports.upload_presets = function upload_presets(callback, options={}) {
|
329 | return call_api("get", ["upload_presets"], only(options, "next_cursor", "max_results"), callback, options);
|
330 | };
|
331 |
|
332 | exports.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 |
|
338 | exports.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 |
|
344 | exports.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 |
|
351 | exports.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 |
|
358 | exports.root_folders = function root_folders(callback, options={}) {
|
359 | let uri;
|
360 | uri = ["folders"];
|
361 | return call_api("get", uri, {}, callback, options);
|
362 | };
|
363 |
|
364 | exports.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 |
|
370 | exports.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 |
|
376 | exports.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 |
|
385 | exports.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 |
|
391 | exports.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 |
|
398 | exports.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 |
|
405 | function 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 |
|
417 | exports.publish_by_prefix = function publish_by_prefix(prefix, callback, options={}) {
|
418 | return publishResource("prefix", prefix, callback, options);
|
419 | };
|
420 |
|
421 | exports.publish_by_tag = function publish_by_tag(tag, callback, options={}) {
|
422 | return publishResource("tag", tag, callback, options);
|
423 | };
|
424 |
|
425 | exports.publish_by_ids = function publish_by_ids(public_ids, callback, options={}) {
|
426 | return publishResource("public_ids", public_ids, callback, options);
|
427 | };
|
428 |
|
429 | exports.list_streaming_profiles = function list_streaming_profiles(callback, options={}) {
|
430 | return call_api("get", "streaming_profiles", {}, callback, options);
|
431 | };
|
432 |
|
433 | exports.get_streaming_profile = function get_streaming_profile(name, callback, options={}) {
|
434 | return call_api("get", "streaming_profiles/" + name, {}, callback, options);
|
435 | };
|
436 |
|
437 | exports.delete_streaming_profile = function delete_streaming_profile(name, callback, options={}) {
|
438 | return call_api("delete", "streaming_profiles/" + name, {}, callback, options);
|
439 | };
|
440 |
|
441 | exports.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 |
|
447 | exports.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 |
|
454 | function 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 |
|
465 | exports.search = function search(params, callback, options={}) {
|
466 | options['content_type'] = 'json';
|
467 | return call_api("post", "resources/search", params, callback, options);
|
468 | };
|
469 |
|
470 | exports.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 |
|
474 | exports.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 |
|
478 | exports.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 | };
|