diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..634f3f1 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,10 +1,109 @@ 'use strict'; +const http = require('http'); +const fs = require('fs/promises'); +const path = require('path'); + +const dataPath = path.resolve(__dirname, '../db/expense.json'); + 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 (url.pathname === '/' && req.method === 'GET') { + res.setHeader('Content-Type', 'text/html'); + + return res.end(` + + + + + + Document + + +
+

Add Expense

+
+ + + + +
+
+ + + `); + } + + // Обробляємо тільки POST /add-expense + if (url.pathname === '/add-expense' && req.method === 'POST') { + const chunks = []; + + try { + for await (const chunk of req) { + chunks.push(chunk); + } + + const body = Buffer.concat(chunks).toString(); + let expense; + + try { + expense = JSON.parse(body); + } catch { + // Якщо браузер шле форму, вона прийде як date=...&title=... + const { parse } = require('querystring'); + + expense = parse(body); + } + + // ВАЛІДАЦІЯ: перевіряємо наявність усіх полів + if (!expense.date || !expense.title || !expense.amount) { + res.statusCode = 400; // Або інший код помилки + + return res.end('Missing required fields'); + } + + // ЗБЕРЕЖЕННЯ: перезаписуємо файл + await fs.writeFile(dataPath, JSON.stringify(expense, null, 2)); + + // Перевіряємо, чого хоче клієнт: HTML чи JSON? + const acceptHeader = req.headers.accept || ''; + + if (acceptHeader.includes('text/html')) { + // Відповідь для МЕНТОРА (браузер) + res.setHeader('Content-Type', 'text/html'); + + return res.end(` + + +

Expense Saved!

+
+                  ${JSON.stringify(expense, null, 2)}
+                
+ Back to form + + + `); + } else { + // Відповідь для ТЕСТІВ (axios) + res.setHeader('Content-Type', 'application/json'); + + return res.end(JSON.stringify(expense)); + } + } catch (err) { + res.statusCode = 400; + + return res.end('Error processing request'); + } + } + + // Всі інші маршрути — 404 + res.statusCode = 404; + res.end('Not Found'); + }); } -module.exports = { - createServer, -}; +module.exports = { createServer };