From 1daf7154e9c31332c00a5b8a99c19df479d9a79f Mon Sep 17 00:00:00 2001 From: Dmitrii Damyan Date: Fri, 24 Apr 2026 18:17:21 +0300 Subject: [PATCH 1/2] solution --- src/createServer.js | 63 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..2e00379 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,67 @@ 'use strict'; +/* eslint-disable no-console */ + +const { Server } = require('node:http'); +const fs = require('node:fs'); +const { pipeline } = require('node:stream'); function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = new Server(); + + server.on('request', async (req, res) => { + const url = req.url; + const method = req.method; + + if (method === 'GET' && url === '/') { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html; charset=utf-8'); + + const file = fs.createReadStream('public/index.html'); + + file.on('error', () => { + res.statusCode = 404; + res.end('No such file'); + }); + + file.on('close', () => { + console.log('connection close'); + file.destroy(); + }); + + pipeline(file, res, (err) => { + if (err) { + res.end(); + } + }); + } else if (method === 'POST') { + let body = ''; + + req.on('data', (chunk) => { + body += chunk; + }); + + req.on('end', () => { + const params = new URLSearchParams(body); + + const expense = { + date: params.get('date'), + title: params.get('title'), + amount: params.get('amount'), + }; + + const jsonData = JSON.stringify(expense); + + fs.writeFileSync('db/expense.json', jsonData); + + res.end(); + }); + } else { + res.statusCode = 404; + res.end(); + } + }); + + return server; } module.exports = { From 1fd175bbbf65dbcb68cf007a12127bd7646d7e91 Mon Sep 17 00:00:00 2001 From: Dmitrii Damyan Date: Fri, 24 Apr 2026 19:18:20 +0300 Subject: [PATCH 2/2] add solution --- src/createServer.js | 59 +++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 2e00379..ed84031 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -3,7 +3,6 @@ const { Server } = require('node:http'); const fs = require('node:fs'); -const { pipeline } = require('node:stream'); function createServer() { const server = new Server(); @@ -12,28 +11,18 @@ function createServer() { const url = req.url; const method = req.method; + const template = fs.readFileSync('public/index.html', 'utf-8'); + const dbData = fs.readFileSync('db/expense.json', 'utf-8'); + if (method === 'GET' && url === '/') { res.statusCode = 200; res.setHeader('Content-Type', 'text/html; charset=utf-8'); - const file = fs.createReadStream('public/index.html'); - - file.on('error', () => { - res.statusCode = 404; - res.end('No such file'); - }); - - file.on('close', () => { - console.log('connection close'); - file.destroy(); - }); + const formattedJson = JSON.stringify(JSON.parse(dbData), null, 2); + const html = template.replace('{{jsonData}}', formattedJson); - pipeline(file, res, (err) => { - if (err) { - res.end(); - } - }); - } else if (method === 'POST') { + return res.end(html); + } else if (method === 'POST' && url === '/add-expense') { let body = ''; req.on('data', (chunk) => { @@ -41,19 +30,37 @@ function createServer() { }); req.on('end', () => { - const params = new URLSearchParams(body); + const contentType = req.headers['content-type']; + let expense; + + if (contentType === 'application/json') { + expense = JSON.parse(body); + } else { + const params = new URLSearchParams(body); + + expense = { + date: params.get('date'), + title: params.get('title'), + amount: params.get('amount'), + }; + } + + if (!expense.date || !expense.title || !expense.amount) { + res.statusCode = 400; - const expense = { - date: params.get('date'), - title: params.get('title'), - amount: params.get('amount'), - }; + return res.end('Missing parameters'); + } + + const jsonData = JSON.stringify(expense, null, 2); - const jsonData = JSON.stringify(expense); + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html; charset=utf-8'); fs.writeFileSync('db/expense.json', jsonData); - res.end(); + const newHtml = template.replace('{{jsonData}}', jsonData); + + res.end(newHtml); }); } else { res.statusCode = 404;