97 lines
3.3 KiB
JavaScript
97 lines
3.3 KiB
JavaScript
const fs = require('fs').promises;
|
|
const pathModule = require('path');
|
|
const { logDebug, logError } = require('../../../infrastructure/logger');
|
|
|
|
async function handleStaticRoutes(req, res) {
|
|
const urlPath = req.urlPath || new URL(req.url, `https://${req.headers.host}`).pathname;
|
|
const method = req.method;
|
|
|
|
const tabs = ['domains', 'host', 'local-dns', 'entries', 'peers', 'certs', 'interfaces', 'logs', 'settings', 'stats'];
|
|
if (method === 'GET' && urlPath.startsWith('/') && tabs.includes(urlPath.substring(1))) {
|
|
res.writeHead(302, { 'Location': `/#${urlPath.substring(1)}` });
|
|
res.end();
|
|
return true;
|
|
}
|
|
|
|
if (method === 'GET' && urlPath === '/') {
|
|
logDebug('Admin', 'Serving admin panel HTML');
|
|
try {
|
|
const html = await fs.readFile(pathModule.join(__dirname, '..', '..', 'admin-frontend', 'index.html'), 'utf8');
|
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
res.end(html);
|
|
} catch (err) {
|
|
logError('Admin', `Failed to serve index.html: ${err.message}`);
|
|
res.writeHead(500);
|
|
res.end('Failed to load admin panel');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (method === 'GET' && urlPath === '/tailwind.css') {
|
|
try {
|
|
const css = await fs.readFile(pathModule.join(__dirname, '..', '..', '..', 'css', 'tailwind.css'), 'utf8');
|
|
res.writeHead(200, { 'Content-Type': 'text/css' });
|
|
res.end(css);
|
|
} catch (err) {
|
|
logError('Admin', `Failed to serve tailwind.css: ${err.message}`);
|
|
res.writeHead(500);
|
|
res.end('Failed to load Tailwind CSS');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (method === 'GET' && urlPath === '/styles.css') {
|
|
try {
|
|
const css = await fs.readFile(pathModule.join(__dirname, '..', '..', 'admin-frontend', 'styles.css'), 'utf8');
|
|
res.writeHead(200, { 'Content-Type': 'text/css' });
|
|
res.end(css);
|
|
} catch (err) {
|
|
logError('Admin', `Failed to serve styles.css: ${err.message}`);
|
|
res.writeHead(500);
|
|
res.end('Failed to load styles');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Serve frontend JavaScript files
|
|
if (method === 'GET' && (urlPath === '/admin.js' || urlPath === '/utils.js' || urlPath === '/ws-client.js')) {
|
|
try {
|
|
const fileName = urlPath.substring(1); // Remove leading '/'
|
|
const js = await fs.readFile(pathModule.join(__dirname, '..', '..', 'admin-frontend', fileName), 'utf8');
|
|
res.writeHead(200, { 'Content-Type': 'text/javascript' });
|
|
res.end(js);
|
|
} catch (err) {
|
|
logError('Admin', `Failed to serve ${urlPath}: ${err.message}`);
|
|
res.writeHead(500);
|
|
res.end('Failed to load script');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Serve UI module files
|
|
if (method === 'GET' && urlPath.startsWith('/ui/') && urlPath.endsWith('.js')) {
|
|
try {
|
|
const fileName = urlPath.substring(1); // Remove leading '/' -> 'ui/filename.js'
|
|
const js = await fs.readFile(pathModule.join(__dirname, '..', '..', 'admin-frontend', fileName), 'utf8');
|
|
res.writeHead(200, { 'Content-Type': 'text/javascript' });
|
|
res.end(js);
|
|
} catch (err) {
|
|
logError('Admin', `Failed to serve ${urlPath}: ${err.message}`);
|
|
res.writeHead(404);
|
|
res.end('Not Found');
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (urlPath === '/favicon.ico') {
|
|
res.writeHead(404);
|
|
res.end('Not Found');
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
module.exports = { handleStaticRoutes };
|
|
|