madmimi-alt
Version:
A simple, feature-complete client for the Mad Mimi REST API.
102 lines (86 loc) • 2.61 kB
JavaScript
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;