giantbomb
Version:
A simple, consistent wrapper for the Giant Bomb API.
104 lines (94 loc) • 2.64 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var _, buildDetailQuery, buildListQuery, formatFilterObject, httpDefaults, request, util;
util = require('util');
request = require('request');
_ = require('lodash');
httpDefaults = {
baseUrl: 'https://www.giantbomb.com/api',
json: true,
headers: {
'User-Agent': 'Node.js client - npmjs.com/package/giantbomb'
},
qs: {
api_key: '',
format: 'json'
},
qsStringifyOptions: {
encode: false
}
};
formatFilterObject = function(filter, i) {
var end, start;
if ((filter != null ? filter.value : void 0) != null) {
if (!_.isArray(filter.value)) {
filter.value = [filter.value];
}
return util.format('%s:%s', filter.field, filter.value.join('|'));
}
if (filter.start && filter.end) {
start = filter.start.toISOString();
end = filter.end.toISOString();
return util.format('%s:%s|%s', filter.field, start, end);
}
};
buildDetailQuery = function(config) {
var qs;
qs = {};
if (config.fields) {
qs.field_list = config.fields.join(',');
}
return qs;
};
buildListQuery = function(config) {
var filters, qs;
qs = {
limit: config.perPage || 10,
offset: 0
};
if (config.fields) {
qs.field_list = config.fields.join(',');
}
if (config.page) {
qs.offset = (config.page - 1) * qs.limit;
}
if (config.sortBy) {
qs.sort = config.sortBy + ':' + config.sortDir || 'asc';
}
if (config.filters) {
filters = config.filters.map(formatFilterObject);
qs.filter = filters.join(',');
}
return qs;
};
module.exports = function(apiKey) {
return {
sendRequest: function(opts, cb) {
opts = _.defaultsDeep(opts, httpDefaults);
opts.qs.api_key = apiKey;
request.debug = process.env.NODE_DEBUG === 'giantbomb';
return request(opts, function(err, res, body) {
var perPage, total;
if (body.number_of_total_results) {
total = body.number_of_total_results;
perPage = body.limit;
body.number_of_total_pages = Math.ceil(total / perPage);
}
return cb(err, res, body);
});
},
sendListRequest: function(url, config, cb) {
return this.sendRequest({
url: url,
qs: buildListQuery(config)
}, cb);
},
sendDetailRequest: function(url, config, cb) {
return this.sendRequest({
url: url,
qs: buildDetailQuery(config)
}, cb);
}
};
};
}).call(this);