72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
const ynab = require("ynab");
|
|
const { argv } = require('yargs');
|
|
const fs = require('fs');
|
|
const { pat, cacheDir } = require('./config');
|
|
const ynabAPI = new ynab.API(pat);
|
|
|
|
const ensureDataDir = async function(path) {
|
|
if (!fs.existsSync(path)) {
|
|
await fs.promises.mkdir(path);
|
|
}
|
|
}
|
|
|
|
const getCachedJsonOrHydrate = async function(fileName, hydrator) {
|
|
const filePath = `${cacheDir}/${fileName}`
|
|
|
|
if (fs.existsSync(filePath)) {
|
|
return JSON.parse(await fs.promises.readFile(filePath));
|
|
}
|
|
|
|
const data = await hydrator();
|
|
await ensureDataDir(cacheDir);
|
|
await fs.promises.writeFile(filePath, JSON.stringify(data));
|
|
return data;
|
|
}
|
|
|
|
const getBudgetId = async function(budgetName) {
|
|
const budgets = await getCachedJsonOrHydrate("budgets.json", async () => {
|
|
console.log("Grabbing budgets from YNAB");
|
|
const budgetsResponse = await ynabAPI.budgets.getBudgets();
|
|
return budgetsResponse.data.budgets;
|
|
});
|
|
|
|
const budgetId = budgets.filter(b => { return b.name === budgetName; })[0].id;
|
|
return budgetId;
|
|
}
|
|
|
|
const getAccountId = async function(budgetId, accountName) {
|
|
let accounts = await getCachedJsonOrHydrate("accounts.json", async () => {
|
|
console.log("Grabbing accounts from YNAB");
|
|
const accountsResponse = await ynabAPI.accounts.getAccounts(budgetId);
|
|
return accountsResponse.data.accounts;
|
|
});
|
|
|
|
const accountId = accounts.filter(a => { return a.name === accountName; })[0].id;
|
|
return accountId;
|
|
}
|
|
|
|
const getTransactions = async function(budgetId, accountId) {
|
|
const date = new Date();
|
|
const jsonFile = `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}-transactions.json`;
|
|
let transactions = await getCachedJsonOrHydrate(jsonFile, async () => {
|
|
console.log("Grabbing transactions from YNAB");
|
|
const transactionsResponse = await ynabAPI.transactions.getTransactionsByAccount(budgetId, accountId);
|
|
return transactionsResponse.data.transactions;
|
|
});
|
|
|
|
return transactions;
|
|
}
|
|
|
|
const main = async function(budgetName, accountName) {
|
|
console.log(`Looking for account '${accountName}' in budget named '${budgetName}'.`);
|
|
|
|
const budgetId = await getBudgetId(budgetName);
|
|
const accountId = await getAccountId(budgetId, accountName);
|
|
const transactions = await getTransactions(budgetId, accountId);
|
|
|
|
console.log(transactions.length);
|
|
console.log(transactions[transactions.length - 1]);
|
|
};
|
|
|
|
main(argv.budgetName, argv.accountName);
|