const utils = require('../../utils');
const budget = require('../../utils/budget');
module.exports = {
get: {
"chart_data": async function(req, res) {
const chart_data = await budget.get_chart_data();
res.send(utils.ok({
chart_data
}));
},
"balance": async function(req, res) {
const [balance] = await utils.query("SELECT value FROM balance");
res.send(utils.ok({
data: balance.value
}));
},
"incomes": async function(req, res) {
const incomes = await utils.query("SELECT * FROM incomes");
res.send(utils.ok({
incomes
}));
},
"withdrawals": async function(req, res) {
const withdrawals = await utils.query("SELECT * FROM withdrawals");
res.send(utils.ok({
withdrawals
}));
},
"credit_cards": async function(req, res) {
const credit_cards = await utils.query("SELECT id, name, billing_date, statement_date FROM credit_cards");
res.send(utils.ok({
credit_cards
}));
},
"card_payments": async function(req, res) {
const card_payments = await budget.get_card_payments();
res.send(utils.ok(card_payments));
},
"transactions": async function(req, res) {
const transactions = await utils.query(
"SELECT id, value, description, credit_card, DATE_FORMAT(date, '%Y-%m-%d') as date FROM transactions"
);
res.send(utils.ok({
transactions
}));
},
"savings": {
"": async function(req, res) {
const savings = await utils.query(
"SELECT id, name, value, accumulated, DATE_FORMAT(target_date, '%Y-%m-%d') as target_date FROM savings_goals"
);
res.send(utils.ok({
savings
}));
},
"next": async function(req, res) {
const [next_savings_contribution] = await utils.query(
"SELECT value, DATE_FORMAT(date, '%Y-%m-%d') as date FROM savings_contributions"
);
res.send(utils.ok({
next_savings_contribution
}));
}
},
},
post: {
"balance": async function(req, res) {
await utils.query("UPDATE balance SET value=?", [req.body.value]);
await budget.recalculate_budget();
res.send(utils.ok({
message: `Available balance has been set to ${req.body.value}`
}));
},
"savings": {
"": async function(req, res) {
const result = await utils.query(
"INSERT INTO savings_goals (id, name, value, accumulated, target_date) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE " +
"name=VALUES(name), value=VALUES(value), accumulated=VALUES(accumulated), target_date=VALUES(target_date)",
[req.body.id, req.body.name, req.body.value, req.body.accumulated, req.body.target_date]
);
await budget.recalculate_budget();
res.send(utils.ok({
message: `${result.affectedRows === 1 ? "Created new" : "Edited"} savings goal "${req.body.name}"`
}));
},
"contribution": async function(req, res) {
await budget.contribute_to_savings(req.body.value);
res.send(utils.ok({
message: `Moved ${req.body.value} from available balance to savings`
}));
}
},
"transaction": async function(req, res) {
const result = await utils.query(
"INSERT INTO transactions (id, credit_card, value, date, description) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE " +
"credit_card=VALUES(credit_card), value=VALUES(value), date=VALUES(date), description=VALUES(description)",
[req.body.id, req.body.credit_card, req.body.value, req.body.date, req.body.description]
);
await budget.recalculate_card_payments();
res.send(utils.ok({
message: `${result.affectedRows === 1 ? "Created new" : "Edited"} transaction for $${req.body.value}`
}));
},
"credit-card": async function(req, res) {
const result = await utils.query(
"INSERT INTO credit_cards (id, name, billing_date, statement_date) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE " +
"name=VALUES(name), billing_date=VALUES(billing_date), statement_date=VALUES(statement_date)",
[req.body.id, req.body.name, req.body.billing_date, req.body.statement_date]
);
await budget.recalculate_card_payments();
res.send(utils.ok({
message: `${result.affectedRows === 1 ? "Created new" : "Edited"} credit card "${req.body.name}"`
}));
},
"withdrawal": async function(req, res) {
const result = await utils.query(
"INSERT INTO withdrawals (id, name, value, date, month) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE " +
"name=VALUES(name), value=VALUES(value), date=VALUES(date), month=VALUES(month)",
[req.body.id, req.body.name, req.body.value, req.body.date, req.body.month]
);
await budget.recalculate_budget();
res.send(utils.ok({
message: `${result.affectedRows === 1 ? "Created new" : "Edited"} withdrawal "${req.body.name}"`
}));
},
"income": async function(req, res) {
const result = await utils.query(
"INSERT INTO incomes (id, name, value, date, month) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE " +
"name=VALUES(name), value=VALUES(value), date=VALUES(date), month=VALUES(month)",
[req.body.id, req.body.name, req.body.value, req.body.date, req.body.month]
);
await budget.recalculate_budget();
res.send(utils.ok({
message: `${result.affectedRows === 1 ? "Created new" : "Edited"} income "${req.body.name}"`
}));
}
},
delete: {
"savings/:id": async function(req, res) {
await utils.query("DELETE FROM savings_goals WHERE id=?", [req.params.id]);
await budget.recalculate_budget();
res.send(utils.ok());
},
"transaction/:id": async function(req, res) {
await utils.query("DELETE FROM transactions WHERE id=?", [req.params.id]);
await budget.recalculate_card_payments();
res.send(utils.ok());
},
"credit-card/:id": async function(req, res) {
await utils.query("DELETE FROM credit_cards WHERE id=?", [req.params.id]);
await budget.recalculate_card_payments();
res.send(utils.ok());
},
"withdrawal/:id": async function(req, res) {
await utils.query("DELETE FROM withdrawals WHERE id=?", [req.params.id]);
await budget.recalculate_budget();
res.send(utils.ok());
},
"income/:id": async function(req, res) {
await utils.query("DELETE FROM incomes WHERE id=?", [req.params.id]);
await budget.recalculate_budget();
res.send(utils.ok());
}
}
};