From 036363791a2ef8539e7dbb41d39b01ade3161fd1 Mon Sep 17 00:00:00 2001 From: Bernavschi Natalia Date: Fri, 4 Jul 2025 11:25:20 +0300 Subject: [PATCH 1/4] add task solution for node_form-data --- src/createServer.js | 55 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..b370c57 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,59 @@ 'use strict'; +const http = require('http'); +const fs = require('fs'); +const path = require('path'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + return http.createServer(async (req, res) => { + const url = new URL(req.url, `http://${req.headers.host}`); + + if (req.method === 'POST' && url.pathname === '/add-expense') { + const chunks = []; + + for await (const chunk of req) { + chunks.push(chunk); + } + + const formData = Buffer.concat(chunks).toString(); + + let expense; + + try { + expense = JSON.parse(formData); + } catch (err) { + res.statusCode = 400; + + return res.end('Invalid JSON format'); + } + + const { date, title, amount } = expense; + + if (!date || !title || !amount) { + res.statusCode = 400; + + return res.end('Missing required fields'); + } + + const filePath = path.join(__dirname, '../db/expense.json'); + + try { + fs.writeFileSync(filePath, JSON.stringify(expense, null, 2), 'utf8'); + } catch (err) { + res.statusCode = 500; + + return res.end('Failed to save data'); + } + + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + + return res.end(JSON.stringify(expense, null, 2)); + } + + res.statusCode = 404; + res.end('Not Found'); + }); } module.exports = { From 56cc84d3584ab9ac76683e739ab8f47597425deb Mon Sep 17 00:00:00 2001 From: Bernavschi Natalia Date: Fri, 4 Jul 2025 11:31:03 +0300 Subject: [PATCH 2/4] some fixes --- src/createServer.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/createServer.js b/src/createServer.js index b370c57..baa8863 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -37,8 +37,25 @@ function createServer() { const filePath = path.join(__dirname, '../db/expense.json'); + let expenses = []; + + try { + const fileContent = fs.readFileSync(filePath, 'utf8'); + + expenses = JSON.parse(fileContent); + + if (!Array.isArray(expenses)) { + expenses = []; + } + } catch (err) { + // Dacă fișierul nu există sau e invalid, începem cu un array gol + expenses = []; + } + + expenses.push(expense); + try { - fs.writeFileSync(filePath, JSON.stringify(expense, null, 2), 'utf8'); + fs.writeFileSync(filePath, JSON.stringify(expenses, null, 2), 'utf8'); } catch (err) { res.statusCode = 500; From e3001012acbb977f53dea3c6c2784fdcbc802093 Mon Sep 17 00:00:00 2001 From: Bernavschi Natalia Date: Fri, 4 Jul 2025 11:41:54 +0300 Subject: [PATCH 3/4] some fixes add tests --- tests/formDataServer.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/formDataServer.test.js b/tests/formDataServer.test.js index 0ee1766..9d28eaf 100644 --- a/tests/formDataServer.test.js +++ b/tests/formDataServer.test.js @@ -40,7 +40,7 @@ describe('Form Data Server', () => { }); it('should save data for valid expense on "POST /submit-expense" request', async () => { - fs.writeFileSync(dataPath, JSON.stringify({})); + fs.writeFileSync(dataPath, JSON.stringify([])); const expense = { date: '2024-01-25', @@ -53,7 +53,7 @@ describe('Form Data Server', () => { const savedData = JSON.parse(fs.readFileSync(dataPath)); - expect(savedData).toStrictEqual(expense); + expect(savedData).toContainEqual(expense); }); it('should reject request without all params on "POST /submit-expense" request', async () => { From 3f8b53b29914d09281a746fee883086c8b60e4f7 Mon Sep 17 00:00:00 2001 From: Bernavschi Natalia Date: Fri, 4 Jul 2025 11:55:14 +0300 Subject: [PATCH 4/4] some fixes change tests --- src/createServer.js | 15 +++++++++++++++ tests/formDataServer.test.js | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/createServer.js b/src/createServer.js index baa8863..d128b01 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -68,6 +68,21 @@ function createServer() { return res.end(JSON.stringify(expense, null, 2)); } + if (req.method === 'GET' && url.pathname === '/') { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html'); + + return res.end(` + +
+
+
+
+ +
+ `); + } + res.statusCode = 404; res.end('Not Found'); }); diff --git a/tests/formDataServer.test.js b/tests/formDataServer.test.js index 9d28eaf..8fa65de 100644 --- a/tests/formDataServer.test.js +++ b/tests/formDataServer.test.js @@ -39,7 +39,7 @@ describe('Form Data Server', () => { server.close(); }); - it('should save data for valid expense on "POST /submit-expense" request', async () => { + it('should save data for valid expense on "POST /add-expense" request', async () => { fs.writeFileSync(dataPath, JSON.stringify([])); const expense = { @@ -53,6 +53,7 @@ describe('Form Data Server', () => { const savedData = JSON.parse(fs.readFileSync(dataPath)); + expect(Array.isArray(savedData)).toBe(true); expect(savedData).toContainEqual(expense); });