From bcb4724b135e417efb271de450bb9e9ac6f84795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andri=C3=AF=20Zakhartchenko?= Date: Sun, 22 Mar 2026 17:52:39 +0100 Subject: [PATCH 1/3] solution --- src/createServer.js | 63 +++++++++++++++++++++++++++++++++++++++++++-- src/index.html | 19 ++++++++++++++ 2 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/index.html diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..5383ad6 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,67 @@ 'use strict'; +const fs = require('fs'); +const http = require('http'); +const path = require('path'); +const formidable = require('formidable'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = new http.Server(); + + server.on('request', (req, res) => { + if (req.url === '/' && req.method === 'GET') { + const filePath = path.resolve(__dirname, 'index.html'); + const stream = fs.createReadStream(filePath); + + stream.on('error', () => { + res.statusCode = 500; + + return res.end('Cannot read index.html'); + }); + + res.writeHead(200, { 'Content-Type': 'text/html' }); + + return stream.pipe(res); + } + + if (req.method === 'POST' && req.url.startsWith('/add-expense')) { + const form = new formidable.IncomingForm({ multiples: false }); + + form.parse(req, (err, fields, files) => { + if (err) { + res.statusCode = 500; + + return res.end('Error parsing the form'); + } + + const { date, title, amount } = fields || {}; + + if (!date || !title || !amount) { + res.statusCode = 400; + + return res.end('Missing fields'); + } + + const filePath = path.resolve(__dirname, '../db/expense.json'); + let expenses = {}; + + expenses = { date, title, amount }; + + fs.writeFileSync(filePath, JSON.stringify(expenses, null, 2)); + + res.writeHead(200, { 'Content-Type': 'application/json' }); + + return res.end(JSON.stringify(expenses)); + }); + + return; + } + + res.statusCode = 404; + res.end('Not Found'); + }); + + return server; } module.exports = { diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..6f1dc88 --- /dev/null +++ b/src/index.html @@ -0,0 +1,19 @@ + + + + + + Document + + +
+ + + + +
+ + \ No newline at end of file From c6e9336ce44dd4152be46e0a0de8aca527eb2844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andri=C3=AF=20Zakhartchenko?= Date: Sun, 22 Mar 2026 21:15:25 +0100 Subject: [PATCH 2/3] solution --- src/createServer.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 5383ad6..e3b1d05 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -43,15 +43,31 @@ function createServer() { } const filePath = path.resolve(__dirname, '../db/expense.json'); - let expenses = {}; + let expenses = []; + + try { + const content = fs.readFileSync(filePath, 'utf-8').trim(); + + if (content) { + const parsed = JSON.parse(content); + + if (Array.isArray(parsed)) { + expenses = parsed; + } else { + expenses = []; + } + } + } catch (e) { + expenses = []; + } - expenses = { date, title, amount }; + expenses.push({ date, title, amount }); fs.writeFileSync(filePath, JSON.stringify(expenses, null, 2)); res.writeHead(200, { 'Content-Type': 'application/json' }); - return res.end(JSON.stringify(expenses)); + return res.end(`
${JSON.stringify(expenses)}
`); }); return; From 21be6095f80fd7322d63f23b0a110ec18d5c3b6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andri=C3=AF=20Zakhartchenko?= Date: Sun, 22 Mar 2026 21:19:01 +0100 Subject: [PATCH 3/3] solution --- src/createServer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/createServer.js b/src/createServer.js index e3b1d05..2d58f4a 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -65,7 +65,7 @@ function createServer() { fs.writeFileSync(filePath, JSON.stringify(expenses, null, 2)); - res.writeHead(200, { 'Content-Type': 'application/json' }); + res.writeHead(200, { 'Content-Type': 'text/html' }); return res.end(`
${JSON.stringify(expenses)}
`); });