UNPKG

foobot-graphql

Version:

GraphQL server for Foobot device data.

236 lines (204 loc) 8.3 kB
'use strict'; 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); } })(); }