diff --git a/manager/components/PreMatricula.tsx b/manager/components/PreMatricula.tsx index 2ce51c5..1acf160 100644 --- a/manager/components/PreMatricula.tsx +++ b/manager/components/PreMatricula.tsx @@ -229,14 +229,10 @@ const PreMatricula: React.FC = ({ data, onConvert }) => {
- /pre-matricula- + / { - const val = e.target.value.replace(/[^a-z0-9-]/g, ''); - const newSlug = val ? `pre-matricula-${val}` : 'pre-matricula'; - setConfig(prev => prev ? { ...prev, slug: newSlug } : prev); - }} + value={config?.slug || ''} + onChange={e => setConfig(prev => prev ? { ...prev, slug: e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, '') } : prev)} />
diff --git a/manager/server.selfhosted.js b/manager/server.selfhosted.js index 8b9d7ba..714bb13 100644 --- a/manager/server.selfhosted.js +++ b/manager/server.selfhosted.js @@ -3031,20 +3031,29 @@ async function startServer() { // Rota com slug explícito app.get('/api/prematricula/public/:slug', (req, res) => handlePublicPreMatricula(req, res, req.params.slug)); - // Rota que serve a página HTML pública do formulário de pré-matrícula - app.get('/pre-matricula', async (req, res) => { - try { - const { rows } = await pool.query('SELECT slug FROM prematricula_config WHERE id = 1'); - const slug = rows[0]?.slug || 'pre-matricula'; - res.send(getPreMatriculaHTML(slug)); - } catch (e) { - res.send(getPreMatriculaHTML('pre-matricula')); + // Middleware para servir a página HTML pública de forma 100% dinâmica baseada na slug do banco + app.use(async (req, res, next) => { + // Ignorar APIs, Storage ou arquivos de assets estáticos (com extensão) + if (req.path.startsWith('/api') || req.path.startsWith('/storage') || req.path.includes('.')) { + return next(); } - }); + const slug = req.path.substring(1); // Remove a primeira barra + if (!slug) return next(); - app.get('/pre-matricula-:slug', (req, res) => { - const { slug } = req.params; - res.send(getPreMatriculaHTML('pre-matricula-' + slug)); + try { + // Verifica se a slug atual corresponde a alguma configuração de pré-matrícula publicada + const { rows } = await pool.query( + 'SELECT slug FROM prematricula_config WHERE slug = $1 AND status = $2 LIMIT 1', + [slug, 'published'] + ); + if (rows.length > 0) { + // Se bater, serve a página pública renderizando a slug dinâmica! + return res.send(getPreMatriculaHTML(slug)); + } + } catch (e) { + console.error('[PreMatricula:Router] Erro de roteamento dinâmico:', e); + } + next(); }); // ===================================================