62 lines
2.1 KiB
JavaScript
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));
|