UNPKG

backand

Version:

Command line interface for Backand cloud services - Online backend REST API as a service

190 lines (169 loc) 5.34 kB
'use strict'; // production: var config = require('../config'); var http = require(config.backand.protocol); var BASE_URL = config.backand.host; var BASE_PORT = config.backand.port; var Q = require('q'); var logger = require('../logger'); var url = require('url'); var merge = require('merge'); function logRequest(request) { logger .newline().log(request.method) .log('url: ' + (BASE_URL + request.path).yellow); if (request.data) { logger.log('data: ' + beautify(request.data).yellow); } if (request.headers) { logger.log('headers: ' + beautify(request.headers).yellow); } logger.newline(); } function beautify(json) { if (typeof(json) === 'string') { try { json = JSON.parse(json); } catch(e) {} } try { json = JSON.stringify(json, null, 4); } catch(e) {} return json; } function logResponse(response, body) { logger.log('responseCode: ' + response.statusCode.toString().yellow); logger.log('responseBody: ' + beautify(body).blue).newline(); } module.exports = { request: function(options, echo) { options = merge(options, {host: BASE_URL, port: BASE_PORT}); options.headers = options.headers || {}; if (options.accessToken) { options.headers['Authorization'] = 'bearer ' + options.accessToken; } if (options.data) { options.headers['Content-Length'] = options.data.length; options.headers['Content-Type'] = 'application/x-www-form-urlencoded'; } if (echo) { logRequest(options); } var deferred = Q.defer(); var req = http.request(options, function(response) { var body = ''; response.on('data', function(chunk) { body += chunk; }); response.on('end', function() { if (echo) { logResponse(response, body); } if (response.statusCode > 299) { var obj = null; try{ //the error is not JSON all the time obj = JSON.parse(body); } catch(e){} if(obj && obj.error_description){ logger.warn(beautify(obj.error_description)); } else { logger.warn(beautify(body)); } deferred.reject(beautify(body)); return; } if (body == '') { deferred.resolve(body); } else { try { var data = JSON.parse(body); if (data.error_description || data.error) { logger.warn(data.error_description || data.error); deferred.reject(data); return; } deferred.resolve(data); } catch (e) { logger.warn('Could not parse response as JSON').log(body.blue); deferred.reject(beautify(body)); return; } } }); }).on('error', function(error) { logger.warn(error.message); deferred.reject(error.message); return; }); if (options.data) { req.write(options.data); } req.end(); return deferred.promise; }, requestExist: function(options, echo) { options = merge(options, {host: BASE_URL, port: BASE_PORT}); options.headers = options.headers || {}; if (options.accessToken) { options.headers['Authorization'] = 'bearer ' + options.accessToken; } if (echo) { logRequest(options); } var deferred = Q.defer(); var req = http.request(options, function(response) { var body = ''; response.on('data', function(chunk) { body += chunk; }); response.on('end', function() { if (echo) { logResponse(response, body); } var exists = response.statusCode == 200; var notExists = response.statusCode == 404; var error = !exists && !notExists; if (error){ logger.warn(beautify(body)); deferred.reject(beautify(body)); return; } deferred.resolve(exists); }); }).on('error', function(error) { logger.warn(error.message); deferred.reject(error.message); }); if (options.data) { req.write(options.data); } req.end(); return deferred.promise; }, exists: function(path, params, headers, echo, accessToken, auth) { path = url.format({pathname: path, query: params}); return this.requestExist({method: 'GET', path: path, headers: headers, accessToken: accessToken, auth: auth}, echo); }, get: function(path, params, headers, echo, accessToken, auth) { path = url.format({pathname: path, query: params}); return this.request({method: 'GET', path: path, headers: headers, accessToken: accessToken, auth: auth}, echo); }, post: function(path, data, params, headers, echo, accessToken, auth) { if (typeof(data) === 'object') { data = JSON.stringify(data); } path = url.format({pathname: path, query: params}); return this.request({method: 'POST', path: path, headers: headers, data: data, accessToken: accessToken, auth: auth}, echo); }, put: function(path, data, params, headers, echo, accessToken, auth) { if (typeof(data) === 'object') { data = JSON.stringify(data); } path = url.format({pathname: path, query: params}); return this.request({method: 'put', path: path, headers: headers, data: data, accessToken: accessToken, auth: auth}, echo); }, delete: function(path, params, headers, echo, accessToken, auth) { path = url.format({pathname: path, query: params}); return this.request({method: 'DELETE', path: path, headers: headers, accessToken: accessToken, auth: auth}, echo); }, };