hacker-news-reader
Version:
Hacker News Reader CLI
135 lines (108 loc) • 4.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Api = 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 _request = require('request');
var _request2 = _interopRequireDefault(_request);
var _config = require('../config');
var config = _interopRequireWildcard(_config);
var _cacheLite = require('cache-lite');
var _cacheLite2 = _interopRequireDefault(_cacheLite);
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 Api = exports.Api = function () {
/**
* Constructor
*/
function Api() {
_classCallCheck(this, Api);
this.cache = new _cacheLite2.default();
this.topNewsList = [];
}
/**
* Get the Top News List
* @return Top News List
*/
_createClass(Api, [{
key: 'makeRequest',
/**
* Make HTTP request
* @param {string} url - Hacker Newa API url
* @return Promise
*/
value: function makeRequest(urlApi) {
return new Promise(function (resolve, reject) {
(0, _request2.default)(urlApi, function (err, res, body) {
if (err) {
return reject(err);
} else if (res.statusCode !== 200) {
var error = new Error('Unexpected status code: ' + res.statusCode);
error.res = res;
return reject(error);
}
return resolve(JSON.parse(body));
});
});
}
/**
* Get News Detail (url, comment, point ...)
* @param {number} id - News ID
* @param {number} index - Index
* @return Promise
*/
}, {
key: 'getNewsDetail',
value: function getNewsDetail(id, index) {
var _this = this;
return new Promise(function (resolveNews, reject) {
_this.cache.get(id).then(function (news) {
_this.topNewsList.push(news);
return resolveNews();
}).catch(function () {
_this.makeRequest(config.item(id)).then(function (news) {
var tempNews = news;
tempNews.order = index + 1;
_this.cache.set(id, tempNews, 60000).then(function () {
_this.topNewsList.push(tempNews);
return resolveNews();
});
}).catch(function (err) {
return reject(err);
});
});
});
}
/**
* Get top News from Hacker News
* @return Promise
*/
}, {
key: 'getTopNews',
value: function getTopNews() {
var _this2 = this;
return new Promise(function (resolve, reject) {
_this2.topNewsList = [];
_this2.makeRequest(config.topNews).then(function (ids) {
var promiseArray = [];
ids.slice(0, config.MaxNews).forEach(function (id, index) {
promiseArray.push(_this2.getNewsDetail(id, index));
});
Promise.all(promiseArray).then(function () {
resolve(_this2.topNewsList);
});
}).catch(function (err) {
return reject(err);
});
});
}
}, {
key: 'getTopNewsList',
get: function get() {
return this.topNewsList;
}
}]);
return Api;
}();