diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..703336d 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,10 +1,84 @@ 'use strict'; +const http = require('http'); +const fs = require('fs/promises'); +const path = require('path'); +const { text } = require('stream/consumers'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + return http.createServer(async (req, res) => { + const { method, url } = req; + + if (url === '/' && method === 'GET') { + await serveHomePage(res); + + return; + } + + if (url === '/add-expense' && method === 'POST') { + await processExpenseSubmission(req, res); + + return; + } + + sendErrorResponse(res, 404, 'Invalid URL'); + }); +} + +async function serveHomePage(res) { + const htmlFilePath = path.join(__dirname, 'public', 'index.html'); + + try { + const htmlContent = await fs.readFile(htmlFilePath, 'utf8'); + + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(htmlContent); + } catch (error) { + sendErrorResponse(res, 500, 'Error loading HTML'); + } +} + +async function processExpenseSubmission(req, res) { + try { + const requestBodyText = await text(req); + const expenseData = parseExpenseData(requestBodyText); + + const { date, title, amount } = expenseData; + + if (!date || !title || !amount) { + sendErrorResponse(res, 400, 'Missing required fields'); + + return; + } + + const databaseFilePath = path.join(__dirname, '..', 'db', 'expense.json'); + + await fs.writeFile(databaseFilePath, JSON.stringify(expenseData), 'utf8'); + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify(expenseData)); + } catch (error) { + sendErrorResponse(res, 500, 'Server Error'); + } +} + +function parseExpenseData(bodyText) { + try { + return JSON.parse(bodyText); + } catch { + const formData = new URLSearchParams(bodyText); + + return { + date: formData.get('date'), + title: formData.get('title'), + amount: formData.get('amount'), + }; + } +} + +function sendErrorResponse(res, statusCode, errorMessage) { + res.writeHead(statusCode, { 'Content-Type': 'text/plain' }); + res.end(errorMessage); } -module.exports = { - createServer, -}; +module.exports = { createServer }; diff --git a/src/public/index.html b/src/public/index.html new file mode 100644 index 0000000..95f8f3e --- /dev/null +++ b/src/public/index.html @@ -0,0 +1,87 @@ + + + + + + Form Data + + + +

Form Data

+
+ + +
+ + +
+ + +
+ +
+ +