privet-ya-tut-hotel-sozdat-p/server.js

62 lines
2.1 KiB
JavaScript

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));