fix(express): reemplazar wildcard /settings/* por rutas explicitas compatibles con Express 5

This commit is contained in:
2026-09-23 16:48:25 -03:00
parent 6907134c5e
commit 7be57aeeb2
+16 -7
View File
@@ -1346,7 +1346,7 @@ const handleGlobalSettings = async (req, res) => {
router.get(['/settings', '/global-config', '/config'], handleGlobalSettings); router.get(['/settings', '/global-config', '/config'], handleGlobalSettings);
// Endpoint específico para alternar modo demo y cuentas default // Endpoint específico para alternar modo demo y cuentas default
router.post(['/settings/demo-mode', '/demo-mode'], async (req, res) => { router.post('/settings/demo-mode', async (req, res) => {
try { try {
const resp = await req.apiClient.post('/settings/demo-mode', req.body); const resp = await req.apiClient.post('/settings/demo-mode', req.body);
return res.status(resp.status || 200).json(resp.data); return res.status(resp.status || 200).json(resp.data);
@@ -1359,24 +1359,33 @@ router.post(['/settings/demo-mode', '/demo-mode'], async (req, res) => {
} }
}); });
// Proxy para cualquier subruta de configuración (smtp, google-oauth, moodle, etc.) // Función forwarder para acciones de configuración hacia Flask
router.all('/settings/*', async (req, res) => { const forwardSettingsAction = async (req, res) => {
try { try {
const subPath = req.params[0]; const relativeUrl = req.originalUrl.replace(/^\/admin/, '');
const resp = await req.apiClient({ const resp = await req.apiClient({
method: req.method, method: req.method,
url: `/settings/${subPath}`, url: relativeUrl,
data: req.body, data: req.body,
params: req.query params: req.query
}); });
return res.status(resp.status).json(resp.data); return res.status(resp.status).json(resp.data);
} catch (err) { } catch (err) {
console.error(`Error in /admin/settings/${req.params[0]}:`, err.response?.data || err.message); console.error(`Error in settings proxy (${req.method} ${req.originalUrl}):`, err.response?.data || err.message);
return res.status(err.response?.status || 500).json(err.response?.data || { return res.status(err.response?.status || 500).json(err.response?.data || {
status: 'error', status: 'error',
message: err.response?.data?.message || err.message message: err.response?.data?.message || err.message
}); });
} }
}); };
router.post('/settings/smtp', forwardSettingsAction);
router.post('/settings/smtp/test', forwardSettingsAction);
router.post('/settings/auth-providers', forwardSettingsAction);
router.post('/settings/google-oauth', forwardSettingsAction);
router.post('/settings/moodle', forwardSettingsAction);
router.post('/settings/moodle/test', forwardSettingsAction);
router.post('/settings/moodle/sync', forwardSettingsAction);
router.get('/settings/moodle/stats', forwardSettingsAction);
module.exports = router; module.exports = router;