From 22269b5ae920b8797141c9f80a9c3b5169a1c12d Mon Sep 17 00:00:00 2001 From: Taras Demianiuk Date: Thu, 16 Apr 2026 12:05:30 +0300 Subject: [PATCH 1/3] added solution --- src/createServer.js | 243 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 242 insertions(+), 1 deletion(-) diff --git a/src/createServer.js b/src/createServer.js index 5b405372..b1add6a4 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,11 +1,252 @@ 'use strict'; -// const express = require('express'); +const express = require('express'); +const cors = require('cors'); + +let users = []; +let expenses = []; function createServer() { + users = []; + expenses = []; + + const app = express(); + + app.use(express.json()); + app.use(cors()); + + app.get('/users', (req, res) => { + res.json(users); + }); + + app.post('/users', (req, res) => { + const { name } = req.body; + + if (!name) { + res.sendStatus(400); + + return; + } + + const user = { id: users.length + 1, name }; + + users.push(user); + + res.statusCode = 201; + + res.send(user); + }); + + app.get('/users/:id', (req, res) => { + const { id } = req.params; + + const user = users.find((userId) => userId.id === Number(id)); + + if (!user) { + res.sendStatus(404); + + return; + } + + res.statusCode = 200; + + res.send(user); + }); + + app.delete('/users/:id', (req, res) => { + const { id } = req.params; + + const userForDelete = users.find((user) => user.id === Number(id)); + + if (!userForDelete) { + res.sendStatus(404); + + return; + } + + const newUsers = users.filter((userId) => userId.id !== Number(id)); + + users = newUsers; + + res.sendStatus(204); + }); + + app.patch('/users/:id', (req, res) => { + const { id } = req.params; + const { name } = req.body; + + const userForUpdate = users.find((user) => user.id === Number(id)); + + if (!userForUpdate) { + res.sendStatus(404); + + return; + } + + if (!name) { + res.sendStatus(400); + + return; + } + + userForUpdate.name = name; + + res.statusCode = 200; + + res.send(userForUpdate); + }); + + app.get('/expenses', (req, res) => { + let result = expenses; + + if (req.query.userId) { + const userId = Number(req.query.userId); + + result = result.filter((expense) => expense.userId === userId); + } + + if (req.query.categories) { + result = result.filter( + (expense) => expense.category === req.query.categories, + ); + } + + if (req.query.from) { + const fromDate = new Date(req.query.from); + + result = result.filter( + (expense) => new Date(expense.spentAt) >= fromDate, + ); + } + + if (req.query.to) { + const toDate = new Date(req.query.to); + + result = result.filter((expense) => new Date(expense.spentAt) <= toDate); + } + + return res.send(result); + }); + + app.post('/expenses', (req, res) => { + const { userId, spentAt, title, amount, category, note } = req.body; + + if ( + userId == null || + title == null || + amount == null || + category == null || + note == null + ) { + res.sendStatus(400); + + return; + } + + const userExist = users.find((user) => user.id === userId); + + if (!userExist) { + res.sendStatus(400); + + return; + } + + const expense = { + id: expenses.length + 1, + userId: Number(userId), + spentAt: spentAt || new Date().toISOString(), + title: title, + amount: amount, + category: category, + note: note, + }; + + expenses.push(expense); + + res.statusCode = 201; + + res.send(expense); + }); + + app.get('/expenses/:id', (req, res) => { + const { id } = req.params; + + const expenseById = expenses.find((expense) => expense.id === Number(id)); + + if (!expenseById) { + res.sendStatus(404); + + return; + } + + res.statusCode = 200; + + res.send(expenseById); + }); + + app.delete('/expenses/:id', (req, res) => { + const { id } = req.params; + + const expenseForDelete = expenses.find( + (expense) => expense.id === Number(id), + ); + + if (!expenseForDelete) { + res.sendStatus(404); + + return; + } + + const newExpenses = expenses.filter((expense) => expense.id !== Number(id)); + + expenses = newExpenses; + + res.sendStatus(204); + }); + + app.patch('/expenses/:id', (req, res) => { + const { id } = req.params; + const { spentAt, title, amount, category, note } = req.body; + + const expenseForUpdate = expenses.find( + (expense) => expense.id === Number(id), + ); + + if (!expenseForUpdate) { + res.sendStatus(404); + + return; + } + + if (spentAt !== undefined) { + expenseForUpdate.spentAt = spentAt; + } + + if (title !== undefined) { + expenseForUpdate.title = title; + } + + if (amount !== undefined) { + expenseForUpdate.amount = amount; + } + + if (category !== undefined) { + expenseForUpdate.category = category; + } + + if (note !== undefined) { + expenseForUpdate.note = note; + } + + res.statusCode = 200; + + res.send(expenseForUpdate); + }); // Use express to create a server // Add a routes to the server // Return the server (express app) + + return app; } module.exports = { From bbb31c759741b8e93f5851d68fd55e1723edb41a Mon Sep 17 00:00:00 2001 From: Taras Demianiuk Date: Thu, 16 Apr 2026 12:17:27 +0300 Subject: [PATCH 2/3] added changes from comments --- src/createServer.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index b1add6a4..eb9a3788 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -131,19 +131,13 @@ function createServer() { app.post('/expenses', (req, res) => { const { userId, spentAt, title, amount, category, note } = req.body; - if ( - userId == null || - title == null || - amount == null || - category == null || - note == null - ) { + if (userId == null || title == null || amount == null || category == null) { res.sendStatus(400); return; } - const userExist = users.find((user) => user.id === userId); + const userExist = users.find((user) => user.id === Number(userId)); if (!userExist) { res.sendStatus(400); From a309c5f2967b2bc6f69b23ee45e543427e4d577b Mon Sep 17 00:00:00 2001 From: Taras Demianiuk Date: Thu, 16 Apr 2026 12:24:29 +0300 Subject: [PATCH 3/3] added changes --- src/createServer.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index eb9a3788..d5cf1bca 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -191,9 +191,11 @@ function createServer() { return; } - const newExpenses = expenses.filter((expense) => expense.id !== Number(id)); + const newListOfExpenses = expenses.filter( + (expense) => expense.id !== Number(id), + ); - expenses = newExpenses; + expenses = newListOfExpenses; res.sendStatus(204); });