diff --git a/.envSample b/.envSample index e69de29..993b684 100644 --- a/.envSample +++ b/.envSample @@ -0,0 +1,3 @@ +APIKEY= +API_MODE= +# Available modes: dev, startup, grow \ No newline at end of file diff --git a/divisaTraceback.js b/divisaTraceback.js index a2b452c..2fa2b09 100644 --- a/divisaTraceback.js +++ b/divisaTraceback.js @@ -1,4 +1,5 @@ -let moment = require('moment'); +const moment = require('moment'); +const request = require('request-promise'); require('dotenv').config(); // Source: https://apiv2.bitcoinaverage.com/ @@ -6,33 +7,27 @@ require('dotenv').config(); const divisaTraceback = async(timestamp, divisa, amount) => { let crypto = ['BTC', 'ETH', 'LTC'] let normal = ['USD', 'GBP', 'CNY', 'EUR']; - try { - if((Date.now() - 7776000000) <= (timestamp * 1000)) { - if(crypto.includes(divisa) || normal.includes(divisa)) { - if(amount >= 0) { - let divisaTraceback = {}; - let resolution = await getResolution(timestamp); + if(amount > 0) { + let divisaTraceback = {}; + let resolution = await getResolution(timestamp); + if(crypto.includes(divisa)) { + divisaTraceback[crypto.splice(crypto.indexOf(divisa), 1)[0]] = Number(amount); + Object.assign(divisaTraceback, await requestIteration(normal, divisa, true, timestamp, amount, resolution)); + Object.assign(divisaTraceback, await requestIteration(crypto, 'USD', false, timestamp, divisaTraceback['USD'], resolution)); + } + else if (normal.includes(divisa)) { + divisaTraceback[normal.splice(normal.indexOf(divisa), 1)[0]] = Number(amount); + Object.assign(divisaTraceback, await requestIteration(crypto, divisa, false, timestamp, amount, resolution)); + Object.assign(divisaTraceback, await requestIteration(normal, 'BTC', true, timestamp, divisaTraceback['BTC'], resolution)); + } else throw new Error('Currency target invalid'); - if(crypto.includes(divisa)) { - divisaTraceback[crypto.splice(crypto.indexOf(divisa), 1)[0]] = Number(amount); - Object.assign(divisaTraceback, await requestIteration(normal, divisa, true, timestamp, amount, resolution)); - Object.assign(divisaTraceback, await requestIteration(crypto, 'USD', false, timestamp, divisaTraceback['USD'], resolution)); - } - else { - divisaTraceback[normal.splice(normal.indexOf(divisa), 1)[0]] = Number(amount); - Object.assign(divisaTraceback, await requestIteration(crypto, divisa, false, timestamp, amount, resolution)); - Object.assign(divisaTraceback, await requestIteration(normal, 'BTC', true, timestamp, divisaTraceback['BTC'], resolution)); - } - return(divisaTraceback); - } else return('The amount must be 1 or higher'); - } else return('Currency target invalid'); - } else return('Date out of range') - } catch(e) { - throw 'error'; - } + console.log(` Resolution: ${resolution}`); + return(divisaTraceback); + } else throw new Error('The amount must be 0 or higher'); }; const requestIteration = async(set, divisa, flag, timestamp, amount, resolution) => { + timestamp = timestamp.format('X'); let opt = { method: 'GET', json: true, @@ -44,12 +39,14 @@ const requestIteration = async(set, divisa, flag, timestamp, amount, resolution) for (element in set) { if(flag) { opt.uri = `https://apiv2.bitcoinaverage.com/indices/global/history/${divisa}${set[element]}?at=${timestamp}&resolution=${resolution}`; - let { average } = await request(opt); + let { average, time } = await request(opt); + if(res.time === undefined) res.time = moment.utc(time, 'YYYY-MM-DD HH:mm:ss').format('DD-MM-YYYY HH:mm Z'); res[set[element]] = average * amount; } else { opt.uri = `https://apiv2.bitcoinaverage.com/indices/global/history/${set[element]}${divisa}?at=${timestamp}&resolution=${resolution}`; - let { average } = await request(opt); + let { average, time } = await request(opt); + if(res.time === undefined) res.time = moment.utc(time, 'YYYY-MM-DD HH:mm:ss').format('DD-MM-YYYY HH:mm Z'); res[set[element]] = amount / average; } } @@ -58,17 +55,13 @@ const requestIteration = async(set, divisa, flag, timestamp, amount, resolution) const getResolution = async(timestamp) => { let resolution = 'day'; - let momentTime = moment(timestamp); - if(process.env.API_MODE == 'dev') { - if(momentTime >= moment().subtract(2, 'hours')) resolution = 'minute'; - else if(momentTime >= moment().subtract(10, 'days')) resolution = 'hour'; - - } else if(process.env.API_MODE == 'startup' || process.env.API_MODE == 'grow') { - if(momentTime >= moment().subtract(24, 'hours')) resolution = 'minute'; - else if(momentTime >= moment().subtract(31, 'days')) resolution = 'hour'; - - } else throw new Error('Bad config'); - + if(process.env.APIMODE == 'dev') { + if(timestamp >= moment.utc().subtract(2, 'hours')) resolution = 'minute'; + else if(timestamp >= moment().subtract(10, 'days')) resolution = 'hour'; + } else if(process.env.APIMODE == 'startup' || process.env.APIMODE == 'grow') { + if(timestamp >= moment.utc().subtract(24, 'hours')) resolution = 'minute'; + else if(timestamp >= moment.utc().subtract(31, 'days')) resolution = 'hour'; + } else throw new Error('Bad config at .env file'); return resolution; } diff --git a/interfaz.js b/interfaz.js index 8e43eeb..b4ff2c8 100644 --- a/interfaz.js +++ b/interfaz.js @@ -91,7 +91,7 @@ const main = async () => { } while (true) { await init(); - //console.clear(); + console.clear(); console.log('Select one to modify the field.\n'); let carbonCreditMenu = await generateData(carbonCredit, 0); let { insertMenu } = await inquirer.prompt([{ @@ -113,7 +113,7 @@ const main = async () => { if (await validateInsertion(carbonCredit)) { try{ carbonCredit.conversionPrice = await divisaTraceback( - moment.utc(carbonCredit.cancelDate + ' +0000', 'DD-MM-YYYY HH:mm Z').unix(), + moment.utc(carbonCredit.cancelDate, 'DD-MM-YYYY HH:mm Z'), carbonCredit.cancelPrice.divisa, carbonCredit.cancelPrice.qty ); @@ -148,10 +148,10 @@ const main = async () => { } else { console.clear(); console.log('Insertion aborted'); - break; + continue; } } catch(e) { - console.log(e.message); + console.log(`Error at divisaTraceback: ${e.message}`); } } else { @@ -187,11 +187,12 @@ const main = async () => { if (input == '') console.log('Input mustn\'t be empty'); else if (insertMenu == 'issueDate' || insertMenu == 'cancelDate' || insertMenu == 'ccVintageStart' || insertMenu == 'ccVintageEnd') { const date = moment.utc(input + ' +0000', 'DD-MM-YYYY HH:mm'); - if(date.isValid() && moment() >= date) { + console.log(date); + if(date.isValid() && moment.utc() >= date) { if(insertMenu != 'cancelDate') carbonCredit[insertMenu] = date.format('DD-MM-YYYY HH:mm Z'); - else if((date >= moment().subtract(3, 'months') && process.env.API_MODE == 'dev') || - (date >= moment().subtract(1, 'year') && process.env.API_MODE == 'startup') || - (date >= moment().subtract(7, 'year') && process.env.API_MODE == 'grow')) { + else if((date >= moment.utc().subtract(3, 'months') && process.env.APIMODE == 'dev') || + (date >= moment.utc().subtract(1, 'year') && process.env.APIMODE == 'startup') || + (date >= moment.utc().subtract(7, 'year') && process.env.APIMODE == 'grow')) { carbonCredit[insertMenu] = date.format('DD-MM-YYYY HH:mm Z'); } else console.error(' Date is too old to get pricing data'); } else console.error(' Date must follow next syntax: dd-mm-yyyy hh-mm and can\'t be in the future'); @@ -529,7 +530,7 @@ const generateData = async (data, n) => { menu.push({ name: element, disabled: ' ' }); menu = menu.concat(await generateData(data[element], n + 1)); } else { - let space = ' '.repeat(20 - element.length); + let space = ' '.repeat(25 - element.length); space = space.substring(0, space.length - tab.length); menu.push(`${tab}${element}${space}${data[element]}`); }