Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions src/controllers/categories.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
const categoriesService = require('../services/categories.service');

const getAll = async (req, res) => {
const categories = await categoriesService.getAll();

res.send(categories);
};

const getOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const category = await categoriesService.getById(id);

if (!category) {
return res.sendStatus(404);
}

res.send(category);
};

const create = async (req, res) => {
const name = req.body.name;

if (!name || typeof name !== 'string') {
return res.sendStatus(400);
}

const category = await categoriesService.create(name);

res.status(201).json(category);
};

const deleteOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const category = await categoriesService.deleteById(id);

if (!category) {
return res.sendStatus(404);
}

res.sendStatus(204);
};

async function update(req, res) {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const { name } = req.body;

if (!name || typeof name !== 'string') {
return res.sendStatus(400);
}

const category = await categoriesService.update(id, name);

if (!category) {
return res.sendStatus(404);
}

res.send(category);
}

module.exports = {
getAll,
getOne,
create,
update,
deleteOne,
};
197 changes: 197 additions & 0 deletions src/controllers/expenses.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
const expensesService = require('../services/expenses.service');
const usersService = require('../services/users.service');

const getAll = async (req, res) => {
const expenses = await expensesService.getAll(req.query);

res
.status(200)
.send(expenses.map((expense) => expensesService.normalize(expense)));
};

const getOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const expense = await expensesService.getById(id);

if (!expense) {
return res.sendStatus(404);
}

res.status(200).send(expensesService.normalize(expense));
};

const create = async (req, res) => {
const required = ['userId', 'spentAt', 'title', 'amount'];

const hasMissingField = required.some(
(field) => req.body[field] === undefined,
);

if (hasMissingField) {
return res.sendStatus(400);
}

const { userId, spentAt, title, amount, category, note } = req.body;
const parsedUserId = Number(userId);

if (!Number.isInteger(parsedUserId) || parsedUserId < 1) {
return res.sendStatus(400);
}

const user = await usersService.getById(parsedUserId);

if (!user) {
return res.sendStatus(400);
}

if (
typeof spentAt !== 'string' ||
Number.isNaN(new Date(spentAt).getTime())
) {
return res.sendStatus(400);
}

if (typeof title !== 'string' || title.trim() === '') {
return res.sendStatus(400);
}

const parsedAmount = Number(amount);

if (!Number.isInteger(parsedAmount) || parsedAmount < 1) {
return res.sendStatus(400);
}

if (
category != null &&
(typeof category !== 'string' || category.trim() === '')
) {
return res.sendStatus(400);
}

if (note != null && typeof note !== 'string') {
return res.sendStatus(400);
}

const newExpense = await expensesService.create({
userId: parsedUserId,
spentAt: spentAt,
title: title.trim(),
amount: parsedAmount,
category: category?.trim() || null,
note: typeof note === 'string' ? note : null,
});

return res.status(201).send(newExpense);
};

const deleteOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const expense = await expensesService.deleteById(id);

if (!expense) {
return res.sendStatus(404);
}

res.sendStatus(204);
};

const update = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const expense = await expensesService.getById(id);

if (!expense) {
return res.sendStatus(404);
}

const { userId, spentAt, title, amount, category, note } = req.body;

const updateData = {};

if (userId !== undefined) {
const parsedUserId = Number(userId);

if (!Number.isInteger(parsedUserId) || parsedUserId < 1) {
return res.sendStatus(400);
}

updateData.userId = parsedUserId;
}

if (spentAt !== undefined) {
if (typeof spentAt !== 'string') {
return res.sendStatus(400);
}

const parsedDate = new Date(spentAt);

if (Number.isNaN(parsedDate.getTime())) {
return res.sendStatus(400);
}

updateData.spentAt = parsedDate;
}

if (title !== undefined) {
if (typeof title !== 'string' || title.trim() === '') {
return res.sendStatus(400);
}

updateData.title = title.trim();
}

if (amount !== undefined) {
const parsedAmount = Number(amount);

if (!Number.isInteger(parsedAmount) || parsedAmount < 1) {
return res.sendStatus(400);
}

updateData.amount = parsedAmount;
}

if (category !== undefined) {
if (
category !== null &&
(typeof category !== 'string' || category.trim() === '')
) {
return res.sendStatus(400);
}

updateData.category = category?.trim() || null;
}

if (note !== undefined) {
if (note !== null && typeof note !== 'string') {
return res.sendStatus(400);
}

updateData.note = note ?? null;
}

const updatedExpense = await expensesService.update(id, updateData);

return res.status(200).send(expensesService.normalize(updatedExpense));
};

module.exports = {
getAll,
getOne,
create,
update,
deleteOne,
};
81 changes: 81 additions & 0 deletions src/controllers/users.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
const usersService = require('../services/users.service');

const getAll = async (req, res) => {
const users = await usersService.getAll();

res.send(users);
};

const getOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const user = await usersService.getById(id);

if (!user) {
return res.sendStatus(404);
}

res.send(user);
};

const create = async (req, res) => {
const name = req.body.name;

if (!name || typeof name !== 'string') {
return res.sendStatus(400);
}

const user = await usersService.create(name);

res.status(201).json(user);
};

const deleteOne = async (req, res) => {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const user = await usersService.deleteById(id);

if (!user) {
return res.sendStatus(404);
}

res.sendStatus(204);
};

async function update(req, res) {
const id = Number(req.params.id);

if (!Number.isInteger(id) || id < 1) {
return res.sendStatus(400);
}

const { name } = req.body;

if (!name || typeof name !== 'string') {
return res.sendStatus(400);
}

const user = await usersService.update(id, name);

if (!user) {
return res.sendStatus(404);
}

res.send(user);
}

module.exports = {
getAll,
getOne,
create,
update,
deleteOne,
};
19 changes: 16 additions & 3 deletions src/createServer.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
'use strict';

const createServer = () => {
// your code goes here
};
const express = require('express');
const { usersRouter } = require('./routes/users.route');
const { expensesRouter } = require('./routes/expenses.route');
const { categoriesRouter } = require('./routes/categories.route');

function createServer() {
const app = express();

app.use(express.json());

app.use('/users', usersRouter);
app.use('/expenses', expensesRouter);
app.use('/categories', categoriesRouter);

return app;
}

module.exports = {
createServer,
Expand Down
Loading
Loading