const express = require('express'); const vhostService = require('../services/vhostService'); const router = express.Router(); const validateFilename = (req, res, next) => { const { filename } = req.params; if (!/^[a-zA-Z0-9._-]+$/.test(filename) || filename.includes('..') || filename.includes('/')) { return res.status(400).json({ success: false, error: 'Invalid filename' }); } next(); }; /** * GET /api/v1/vhosts */ router.get('/', (req, res) => { try { const vhosts = vhostService.listVHosts(); res.json({ success: true, vhosts }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); /** * POST /api/v1/vhosts * Creates a new virtual host configuration. */ router.post('/', (req, res) => { try { const { domain, root, port, type } = req.body; if (!domain || !root || !port || !type) { return res.status(400).json({ success: false, error: 'Missing required fields (domain, root, port, type)' }); } const filename = vhostService.createVHost(domain, root, port, type); res.json({ success: true, filename }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); /** * POST /api/v1/vhosts/:filename/enable */ router.post('/:filename/enable', validateFilename, (req, res) => { try { const { filename } = req.params; const newFilename = vhostService.toggleVHost(filename, true); vhostService.reloadNginx(); res.json({ success: true, filename: newFilename }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); /** * POST /api/v1/vhosts/:filename/disable */ router.post('/:filename/disable', validateFilename, (req, res) => { try { const { filename } = req.params; const newFilename = vhostService.toggleVHost(filename, false); vhostService.reloadNginx(); res.json({ success: true, filename: newFilename }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); /** * POST /api/v1/vhosts/reload */ router.post('/reload', (req, res) => { try { vhostService.reloadNginx(); res.json({ success: true }); } catch (err) { res.status(500).json({ success: false, error: err.message }); } }); module.exports = router;