UNPKG

nikeplus-client

Version:
254 lines (229 loc) 9.65 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.NikeClient = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _gpx = require('./gpx'); var _tcx = require('./tcx'); var _httpClient = require('./httpClient'); var _v = require('uuid/v1'); var _v2 = _interopRequireDefault(_v); var _exceptions = require('./exceptions'); var Errors = _interopRequireWildcard(_exceptions); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var NikeClient = exports.NikeClient = function () { function NikeClient(auth) { _classCallCheck(this, NikeClient); this._httpClient = new _httpClient.HttpClient(); this._refreshTokenAsked = false; this._tokenRefreshed = false; this.authData = auth || null; } _createClass(NikeClient, [{ key: '_shouldBeLogged', value: function _shouldBeLogged() { if (this.authData === null) { throw new Errors.NikeError('You are not logged in'); } this._tokenRefreshed = false; } }, { key: '_handleRefreshToken', value: function _handleRefreshToken(err, cb) { if (err.statusCode === 401 && !this._refreshTokenAsked) { return this.refresh_token().then(cb); } return Promise.reject({ error: err, data: null }); } }, { key: '_handleResponse', value: function _handleResponse(data) { var response = { error: null, data: JSON.parse(data) }; this._refreshTokenAsked = false; if (response.data && response.data && response.data.errors) { if (response.data.errors.filter(function (err) { return err.code === 35; }).length > 0) { return Promise.reject({ statusCode: 401 }); } response.error = data.errors[0]; response.data = null; } return Promise.resolve(response); } }, { key: '_Get', value: function _Get(uri) { var _this = this; var headers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; return this._httpClient.Get(uri, headers).then(function (data) { return _this._handleResponse(data); }); } }, { key: '_GetWithAuthQueryString', value: function _GetWithAuthQueryString(path) { var _this2 = this; var queryString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var uri = 'https://api.nike.com' + path + '?access_token=' + this.authData.access_token + '&app=FUELBAND&format=json' + queryString; //locale=en_FR var cb = this._GetWithAuthQueryString.bind(this, path, queryString); return this._Get(uri).catch(function (err) { return _this2._handleRefreshToken(err, cb); }); } }, { key: '_GetWithAuthInHeader', value: function _GetWithAuthInHeader(path) { var _this3 = this; var queryString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; var headers = { 'Authorization': 'Bearer ' + this.authData.access_token }; var uri = 'https://api.nike.com' + path + '?format=json' + queryString; var cb = this._GetWithAuthInHeader.bind(this, path, queryString); return this._Get(uri, headers).catch(function (err) { return _this3._handleRefreshToken(err, cb); }); } }, { key: 'login', value: function login(email, password) { var uri = 'https://unite.nike.com/login?appVersion=358' + '&experienceVersion=308&uxid=com.nike.commerce.nikedotcom.web' + '&locale=en_US&backendEnvironment=identity&browser=Google%20Inc.&os=undefined' + '&mobile=false&native=false&visit=1&visitor=' + (0, _v2.default)(); var data = { 'username': email, 'password': password, 'keepMeLoggedIn': true, 'client_id': 'QH8exE5gyCCyR0HbcQRRWklauH89tnQG', 'ux_id': 'com.nike.commerce.nikedotcom.web', 'grant_type': 'password' }; var that = this; return this._httpClient.Post(uri, { Referer: "https://awr.svs.nike.com/activity/login" }, data).then(function (data) { that.authData = JSON.parse(data); return Promise.resolve(that.authData); }).catch(function (err) { that.authData = null; var body = err.response.headers && err.response.headers['content-type'] === 'application/json' ? JSON.parse(err.response.body.trim().replace('\n', '')) : err.response.body; var data = { code: err.statusCode, uri: err.response.request.uri.href, body: body }; if (err.statusCode === 400 && body.error === 'InvalidRequest') { throw new Errors.NikeApiChange(data); } throw new Errors.NikeLoginError(data); }); } }, { key: 'set_auth', value: function set_auth(data) { if (!data || !data.access_token || !data.refresh_token) { throw new Errors.NikeError('Invalid login data'); } this.authData = data; } }, { key: 'refresh_token', value: function refresh_token() { var uri = 'https://unite.nike.com/tokenRefresh?appVersion=296&experienceVersion=257&uxid=com.nike.commerce.nikedotcom.web&backendEnvironment=identity&browser=Google%20Inc.&os=undefined&mobile=false&native=false&visit=&visitor='; //locale=en_US var data = { client_id: 'HlHa2Cje3ctlaOqnxvgZXNaAs7T9nAuH', grant_type: 'refresh_token', refresh_token: this.authData.refresh_token }; var that = this; this._refreshTokenAsked = true; return this._httpClient.Post(uri, null, data).then(function (data) { that._tokenRefreshed = true; that.authData = JSON.parse(data); return Promise.resolve(); }); } }, { key: 'me_summary', value: function me_summary() { this._shouldBeLogged(); return this._GetWithAuthInHeader('/plus/v3/lifetimeaggs/me/summary'); } }, { key: 'me_detail', value: function me_detail() { this._shouldBeLogged(); return this._GetWithAuthQueryString('/nsl/user/get'); } }, { key: 'me_snapshot', value: function me_snapshot() { this._shouldBeLogged(); return this._GetWithAuthQueryString('/v2.0/me/snapshot'); } }, { key: 'me_achievements', value: function me_achievements() { this._shouldBeLogged(); return this._GetWithAuthQueryString('/v3.0/me/achievements'); } }, { key: 'user_infos', value: function user_infos(upmIds) { this._shouldBeLogged(); return this._GetWithAuthQueryString('/plus/v3/userlookup/users', '&upmIds=' + upmIds); } }, { key: 'me_activities_year', value: function me_activities_year(startTime, endTime) { this._shouldBeLogged(); return this._GetWithAuthQueryString('/v3.0/me/activities', '&startTime=' + startTime + '&endTime=' + endTime); //1501459200000 1503100194141 //&isStream=0 } }, { key: 'me_activities_run_daily', value: function me_activities_run_daily(fromDate, toDate) { //2017-08-14 2017-08-21 this._shouldBeLogged(); return this._GetWithAuthInHeader('/plus/v3/historicalaggregates/aggregates/batch/daily/' + fromDate + '/' + toDate, '&metric_type=distance&activity_type=jogging&activity_type=run'); } }, { key: 'me_activities_before_id', value: function me_activities_before_id(id, limit, metrics, types) { //metrics=distance,pace limit = limit || 10; this._shouldBeLogged(); return this._GetWithAuthInHeader('/sport/v3/me/activities/before_id/' + id, '&limit=' + limit + '&metrics=distance&types=jogging,run'); } }, { key: 'me_activities_before_time', value: function me_activities_before_time(time, limit, metrics, types) { //time = 1503507694194, types = jogging,run limit = limit || 1; this._shouldBeLogged(); return this._GetWithAuthInHeader('/sport/v3/me/activities/before_time/' + time, '&limit=' + limit + '&types=jogging,run'); } }, { key: 'me_activity_detail', value: function me_activity_detail(id) { this._shouldBeLogged(); return this._GetWithAuthInHeader('/sport/v3/me/activity/' + id, '&metrics=ALL'); } }, { key: 'me_activity_to_gpx', value: function me_activity_to_gpx(id) { return this.me_activity_detail(id).then(function (run) { return Promise.resolve(_gpx.Gpx.ConvertFromNikeActivity(run)); }); } }, { key: 'me_activity_to_tcx', value: function me_activity_to_tcx(id) { return this.me_activity_detail(id).then(function (run) { return Promise.resolve(_tcx.Tcx.ConvertFromNikeActivity(run)); }); } }]); return NikeClient; }();