127.0.0.1:8000 budget / master server / routes / api / budget.js
master

Tree @master (Download .tar.gz)

budget.js @masterraw · history · blame

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());
        }
    }
};