UNPKG

madmimi-alt

Version:

A simple, feature-complete client for the Mad Mimi REST API.

102 lines (86 loc) 2.61 kB
var request = require('request') , errbot = require('errbot') , methods = require('methods') , MadMimi; MadMimi = function (options) { this.configure(options); }; MadMimi.prototype.log = function() {}; MadMimi.prototype.configure = function (options) { options = options || {}; this.strictSSL = options.strictSSL !== false; this.secure = options.secure || true; this.host = options.host || 'api.madmimi.com'; this.username = options.username; this.key = options.key; this.log = options.log; }; MadMimi.prototype.request = function (method, route, data, done) { if ('/' !== route[0]) route = '/' + route; if (data && data.params) { route = Object.keys(data.params).reduce(function (output, key) { return output.replace(new RegExp(':' + key, 'g'), data.params[key]); }, route); delete data.params; } var self = this , protocol = (self.secure ? 'https' : 'http') , uri = [protocol, '://', self.host, route].join('') , isFormData = false; var reqOpts = { strictSSL: self.strictSSL, uri: uri, method: method, qs: { username: self.username, api_key: self.key }, headers: { Accept: 'application/json' }, json: true }; if (data && data.body) { reqOpts.body = data.body; } else if (data && data.formData) { var formData = data.formData; // qs is not useful is it's a 100% form based request formData.username = self.username; formData.api_key = self.key; reqOpts.formData = data.formData; isFormData = true; delete reqOpts.qs; delete reqOpts.json; } else { reqOpts.form = data; } request(reqOpts, function (err, res, body) { var statusCode = res && res.statusCode || 500; self.log({ method: method, uri: uri, statusCode: statusCode, fields: reqOpts.body || reqOpts.form, username: self.username, password: self.key, err: err && err.message, body: JSON.stringify(body) }); if (err || statusCode >= 400 || statusCode < 200) { return done(errbot.initialize(statusCode, err || body)); } // we always need to parse in case it's a formData request if (isFormData) { body = JSON.parse(body); } done(null, body); }); }; methods.forEach(function (method) { MadMimi.prototype[method] = function (route, data, done) { if ('function' === typeof data) { done = data; data = null; } return this.request(method.toUpperCase(), route, data, done); }; }); // We expose the constructor function instead module.exports = MadMimi;