Ctrl K
ComunidadGuías…

server/controllers/recurring-transactions.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import type express from 'express';
import { asString, asyncErr, KError } from '../helpers';
import { Account, RecurringTransaction } from '../models';
import { hasForbiddenOrMissingField } from '../shared/validators';
import type { IdentifiedRequest, PreloadedRequest } from './routes';

export async function preload(
    req: IdentifiedRequest<RecurringTransaction>,
    res: express.Response,
    nextHandler: () => void,
    recurringTransactionId: number
) {
    try {
        const { id: userId } = req.user;
        const recurringTransaction = await RecurringTransaction.find(
            userId,
            recurringTransactionId
        );
        if (!recurringTransaction) {
            throw new KError('Recurring Transaction not found', 404);
        }
        req.preloaded = { recurringTransaction };
        nextHandler();
    } catch (err) {
        asyncErr(res, err, 'when preloading a recurringTransaction');
    }
}

export async function getByAccountId(req: IdentifiedRequest<any>, res: express.Response) {
    try {
        const userId = req.user.id;
        const accountId = parseInt(asString(req.params.accountId), 10);
        if (isNaN(accountId)) {
            throw new KError('Invalid account id', 400);
        }

        const accountExists = await Account.exists(userId, accountId);
        if (!accountExists) {
            throw new KError(`Account ${accountId} not found`, 404);
        }

        const recurringTransactions = await RecurringTransaction.byAccountId(userId, accountId);
        res.status(200).json(recurringTransactions);
    } catch (err) {
        asyncErr(res, err, 'when retrieving recurringTransactions');
    }
}

export async function create(req: IdentifiedRequest<any>, res: express.Response) {
    try {
        const userId = req.user.id;
        const accountId = parseInt(asString(req.params.accountId), 10);
        if (isNaN(accountId)) {
            throw new KError('Invalid account id', 400);
        }
        const error = hasForbiddenOrMissingField(req.body, [
            'label',
            'type',
            'amount',
            'dayOfMonth',
            'listOfMonths',
        ]);
        if (error) {
            throw new KError(error, 400);
        }

        if (!RecurringTransaction.isValidListOfMonths(req.body.listOfMonths)) {
            throw new KError('Invalid listOfMonths attribute', 400);
        }

        const recurringTransaction = {
            ...req.body,
            accountId,
        };

        const created = await RecurringTransaction.create(userId, recurringTransaction);
        res.status(200).json(created);
    } catch (err) {
        asyncErr(res, err, 'when creating a recurringTransaction');
    }
}

export async function update(req: PreloadedRequest<RecurringTransaction>, res: express.Response) {
    try {
        const { id: userId } = req.user;
        const { recurringTransaction } = req.preloaded;
        const newAccountRecurringTransaction = await RecurringTransaction.update(
            userId,
            recurringTransaction.id,
            req.body
        );

        res.status(200).json(newAccountRecurringTransaction);
    } catch (err) {
        asyncErr(res, err, 'when updating a recurringTransaction');
    }
}

export async function destroy(req: PreloadedRequest<RecurringTransaction>, res: express.Response) {
    try {
        const { id: userId } = req.user;
        const { recurringTransaction } = req.preloaded;
        await RecurringTransaction.destroy(userId, recurringTransaction.id);
        res.status(200).end();
    } catch (err) {
        asyncErr(res, err, 'when deleting a recurringTransaction');
    }
}