hacker-news-reader
Version:
Hacker News Reader CLI
87 lines (79 loc) • 2.11 kB
JavaScript
const request = require('request')
const config = require('../config')
const CacheLite = require('cache-lite')
module.exports = class Api {
/**
* Constructor
*/
constructor() {
this.cache = new CacheLite()
this.topNewsList = []
}
/**
* Get the Top News List
* @return Top News List
*/
get getTopNewsList() {
return this.topNewsList
}
/**
* Make HTTP request
* @param {string} url - Hacker Newa API url
* @return Promise
*/
makeRequest(urlApi) {
return new Promise((resolve, reject) => {
request(urlApi, (err, res, body) => {
if (err) {
return reject(err)
} else if (res.statusCode !== 200) {
const 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
*/
getNewsDetail(id, index) {
return new Promise((resolveNews, reject) => {
this.cache.get(id).then((news) => {
this.topNewsList.push(news)
return resolveNews()
}).catch(() => {
this.makeRequest(config.item(id)).then(news => {
const tempNews = news
tempNews.order = index + 1
this.cache.set(id, tempNews, 60000).then(() => {
this.topNewsList.push(tempNews)
return resolveNews()
})
}).catch((err) => reject(err))
})
})
}
/**
* Get top News from Hacker News
* @return Promise
*/
getTopNews() {
return new Promise((resolve, reject) => {
this.topNewsList = []
this.makeRequest(config.topNews).then(ids => {
const promiseArray = []
ids.slice(0, config.MaxNews).forEach((id, index) => {
promiseArray.push(this.getNewsDetail(id, index))
})
Promise.all(promiseArray).then(() => {
resolve(this.topNewsList)
})
}).catch((err) => reject(err))
})
}
}