diff --git a/db/expense.json b/db/expense.json index 1bc75a6..9e26dfe 100644 --- a/db/expense.json +++ b/db/expense.json @@ -1,5 +1 @@ -{ - "date": "2024-01-25", - "title": "Test Expense", - "amount": "100" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..c079b6c 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,131 @@ 'use strict'; +const http = require('node:http'); +const fs = require('node:fs'); +const path = require('node:path'); + function createServer() { - /* Write your code here */ - // Return instance of http.Server class + const server = new http.Server(); + const filePath = path.join(__dirname, '..', 'db', 'expense.json'); + + server.on('request', (req, res) => { + if (req.method === 'POST' && req.url === '/submit-expense') { + if (!fs.existsSync(path.dirname(filePath))) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + } + + if (!fs.existsSync(filePath)) { + fs.writeFileSync( + filePath, + JSON.stringify({ expenses: [] }, null, 2), + 'utf-8', + ); + } + + let fields = ''; + + req.on('data', (chunk) => { + fields += chunk.toString(); + }); + + req.on('end', () => { + const params = new URLSearchParams(fields); + const date = params.get('date'); + const title = params.get('title'); + const amount = params.get('amount'); + + if (!date || !title || !amount) { + res.statusCode = 400; + res.end('Missing fields'); + + return null; + } + + const newExpense = { + date, + title, + amount: parseFloat(amount), + }; + + fs.readFile(filePath, 'utf-8', (err, data) => { + if (err) { + res.statusCode = 500; + res.end('Error reading file'); + + return null; + } + + let expenseData; + + try { + expenseData = JSON.parse(data); + + if (!Array.isArray(expenseData.expenses)) { + expenseData.expenses = []; + } + } catch { + expenseData = { expenses: [] }; + } + + expenseData.expenses.push(newExpense); + + fs.writeFile( + filePath, + JSON.stringify(expenseData, null, 2), + 'utf-8', + (error) => { + if (error) { + res.statusCode = 500; + res.end('Failed to write file'); + + return null; + } + + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + + res.end( + JSON.stringify( + expenseData.expenses[expenseData.expenses.length - 1], + null, + 2, + ), + ); + }, + ); + }); + }); + } else if (req.url === '/') { + res.statusCode = 200; + res.setHeader('Content-Type', 'text/html'); + + res.end(` +