diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..d128b01 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,91 @@ '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'); + + 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(expenses, 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)); + } + + 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'); + }); } module.exports = { diff --git a/tests/formDataServer.test.js b/tests/formDataServer.test.js index 0ee1766..8fa65de 100644 --- a/tests/formDataServer.test.js +++ b/tests/formDataServer.test.js @@ -39,8 +39,8 @@ describe('Form Data Server', () => { server.close(); }); - it('should save data for valid expense on "POST /submit-expense" request', async () => { - fs.writeFileSync(dataPath, JSON.stringify({})); + it('should save data for valid expense on "POST /add-expense" request', async () => { + fs.writeFileSync(dataPath, JSON.stringify([])); const expense = { date: '2024-01-25', @@ -53,7 +53,8 @@ describe('Form Data Server', () => { const savedData = JSON.parse(fs.readFileSync(dataPath)); - expect(savedData).toStrictEqual(expense); + expect(Array.isArray(savedData)).toBe(true); + expect(savedData).toContainEqual(expense); }); it('should reject request without all params on "POST /submit-expense" request', async () => {