const http = require('http'); const fs = require('fs'); const path = require('path'); const PORT = process.env.PORT || 3000; const DATA_FILE = path.join(__dirname, 'data.json'); function loadData() { try { return JSON.parse(fs.readFileSync(DATA_FILE, 'utf8')); } catch (_) { return { en: [], kz: [], et: [] }; } } function saveData(data) { fs.writeFileSync(DATA_FILE, JSON.stringify(data, null, 2)); } function parseBody(req) { return new Promise(resolve => { let s = ''; req.on('data', chr => s += chr); req.on('end', () => { try { resolve(JSON.parse(s || '{}')); } catch (_) { resolve({}); } }); }); } http.createServer(async (req, res) => { const url = req.url.split('?')[0]; // API: get terms for language if (req.method === 'GET' && url.startsWith('/api/terms/')) { const lang = url.split('/').pop(); const data = loadData(); const terms = data[lang] || []; res.writeHead(200, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify(terms)); } // API: add term if (req.method === 'POST' && url.startsWith('/api/terms/')) { const lang = url.split('/').pop(); const { term, definition } = await parseBody(req); const data = loadData(); if (!data[lang]) data[lang] = []; data[lang].push({ id: Date.now(), term, definition }); saveData(data); res.writeHead(200, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify({ ok: true })); } // Serve static files let filePath = url === '/' ? '/index.html' : url; const fullPath = path.join(__dirname, filePath); if (fullPath.startsWith(__dirname) && fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) { const ext = path.extname(fullPath); const mime = { '.html': 'text/html', '.css': 'text/css', '.js': 'application/javascript' }[ext] || 'application/octet-stream'; res.writeHead(200, { 'Content-Type': mime + '; charset=utf-8' }); return res.end(fs.readFileSync(fullPath)); } res.writeHead(404); res.end('Not found'); }).listen(PORT, () => console.log('Server listening on port ' + PORT));