foobot-graphql
Version:
GraphQL server for Foobot device data.
236 lines (204 loc) • 8.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _request2 = require('request');
var _request3 = _interopRequireDefault(_request2);
var _read = require('read');
var _read2 = _interopRequireDefault(_read);
var _package = require('../package.json');
var _package2 = _interopRequireDefault(_package);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var debug = require('debug')('foobot-graphql:api'); /**
* Simple Promise-based client for the Foobot API.
*
* Run this file as a standalone script to test different types of requests.
*/
var FoobotClient = function () {
function FoobotClient() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck3.default)(this, FoobotClient);
this.apiKey = opts.apiKey || process.env.FOOBOT_API_KEY;
if (this.apiKey == null) {
throw new Error('FoobotClient must be configured with an API key. ' + 'Use the `apiKey` option or `FOOBOT_API_KEY` environment variable.');
}
this.username = opts.username || process.env.FOOBOT_USERNAME;
if (this.username == null) {
throw new Error('FoobotClient must be configured with a username. ' + 'Use the `username` option or `FOOBOT_USERNAME` environment variable.');
}
this.defaultDevice = opts.defaultDevice || process.env.FOOBOT_DEFAULT_DEVICE;
this.lastRequestTime = null;
this.lastRequestLimit = null;
this.http = _request3.default.defaults({
baseUrl: 'https://api.foobot.io/',
json: true,
gzip: true,
timeout: 60000,
headers: {
'x-api-key-token': this.apiKey,
'User-Agent': _package2.default.name + '/' + _package2.default.version + ' ' + ('( ' + (_package2.default.homepage || _package2.default.author.url || _package2.default.author.email) + ' )')
}
});
}
(0, _createClass3.default)(FoobotClient, [{
key: '_request',
value: function _request(options) {
var _this = this;
return new _promise2.default(function (resolve, reject) {
debug('Sending request. url=\'' + options.url + '\'');
var lastRequestTime = new Date();
_this.http(options, function (err, response, body) {
if (err) {
return reject(err);
}
var lastRequestLimit = response.headers['x-api-key-limit-remaining'];
if (_this.lastRequestTime == null || _this.lastRequestTime <= lastRequestTime) {
_this.lastRequestTime = lastRequestTime;
if (lastRequestLimit != null) {
_this.lastRequestLimit = parseInt(lastRequestLimit, 10);
}
}
debug('Received response. ' + ('statusCode=' + response.statusCode + ' ') + ('lastRequestLimit=' + lastRequestLimit));
if (response.statusCode >= 200 && response.statusCode < 400) {
return resolve(response);
}
var message = 'Request failed with status code ' + response.statusCode;
if (response.statusMessage) {
message += ': ' + response.statusMessage;
}
err = new Error(message);
err.response = response;
return reject(err);
});
});
}
/**
* This endpoint is no longer necessary, as the API now uses the API key as
* the auth token. Keep this around in case someone wants to use it anyway.
*/
}, {
key: 'login',
value: function login() {
var username = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.username;
var password = arguments[1];
this.username = username;
return this._request({
url: '/v2/user/' + username + '/login/',
method: 'post',
body: { password: password }
}).then(function (response) {
if (response.headers['x-auth-token']) {
return response;
}
throw new Error('Authentication failed.');
});
}
}, {
key: 'devices',
value: function devices() {
var username = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.username;
return this._request({
url: '/v2/owner/' + username + '/device/'
}).then(function (response) {
return response.body;
});
}
}, {
key: 'datapoints',
value: function datapoints() {
var uuid = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.defaultDevice;
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
start = _ref.start,
end = _ref.end,
_ref$period = _ref.period,
period = _ref$period === undefined ? 0 : _ref$period,
_ref$averageBy = _ref.averageBy,
averageBy = _ref$averageBy === undefined ? 0 : _ref$averageBy;
if (start instanceof Date) {
start = start.toISOString();
}
if (end instanceof Date) {
end = end.toISOString();
}
if (period instanceof Date) {
var duration = Date.now() - period.getTime();
period = Math.ceil(duration / 1000);
}
var url = '/v2/device/' + uuid + '/datapoint/' + period + '/last/' + averageBy + '/';
if (start != null && end != null) {
url = '/v2/device/' + uuid + '/datapoint/' + start + '/' + end + '/' + averageBy + '/';
}
return this._request({ url: url }).then(function (response) {
response.body.date = Date.parse(response.headers.date) / 1000;
return response.body;
});
}
}]);
return FoobotClient;
}();
exports.default = FoobotClient;
if (require.main === module) {
(function () {
require('dotenv').config();
var _require = require('./util'),
logObject = _require.logObject,
logError = _require.logError,
safeExit = _require.safeExit;
var client = new FoobotClient();
var command = process.argv[2];
if (command === 'login') {
var username = process.argv[3] || client.username || new _promise2.default(function (resolve, reject) {
(0, _read2.default)({ prompt: 'Username:' }, function (err, username) {
return err ? reject(err) : resolve(username);
});
});
_promise2.default.resolve(username).then(function (username) {
return new _promise2.default(function (resolve, reject) {
(0, _read2.default)({
prompt: 'Password:',
silent: true,
replace: '•'
}, function (err, password) {
return err ? reject(err) : resolve({ username: username, password: password });
});
});
}).then(function (_ref2) {
var username = _ref2.username,
password = _ref2.password;
return client.login(username, password);
}).then(function (response) {
console.log(response.headers['x-auth-token']);
}).catch(function (err) {
logError(err);
safeExit(1);
});
} else if (command === 'devices') {
var _username = process.argv[3];
client.devices(_username).then(function (devices) {
logObject(devices);
}).catch(function (err) {
logError(err);
safeExit(1);
});
} else if (command === 'datapoints') {
var uuid = process.argv[3];
var period = process.argv[4];
var averageBy = process.argv[5];
client.datapoints(uuid, { period: period, averageBy: averageBy }).then(function (data) {
logObject(data);
}).catch(function (err) {
logError(err);
safeExit(1);
});
} else {
console.log('Commands: login, devices, datapoints');
safeExit(1);
}
})();
}