feat(agenda-bridge): /numeros-internos p/ guard anti-leak da Secretária

Lista os dígitos dos números de pessoa_comunicacao da clínica (dentistas/equipe) p/
o motor não tratar um número interno como paciente.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-07-08 07:15:31 +02:00
parent 6f8bd4162f
commit 6087846556
+17
View File
@@ -549,6 +549,23 @@ export function createAgendaBridge(pool) {
} catch (e) { res.status(500).json({ error: e.message }); }
});
// ── GET /numeros-internos ───────────────────────────────────────────────────────
// Só os dígitos dos números de pessoa_comunicacao da clínica (dentistas/equipe). O
// motor usa p/ NÃO tratar um número interno como paciente (anti-loop/leak).
router.get('/numeros-internos', async (req, res) => {
const clinicaId = String(req.query.clinica_id || '');
if (!clinicaId) return res.status(400).json({ error: 'clinica_id obrigatório' });
try {
const { rows } = await pool.query('SELECT numeros FROM pessoa_comunicacao WHERE clinica_id = $1', [clinicaId]);
const set = new Set();
for (const r of rows) for (const n of (Array.isArray(r.numeros) ? r.numeros : [])) {
const d = String(n?.numero || '').replace(/\D/g, '');
if (d.length >= 8) set.add(d);
}
res.json({ numeros: [...set] });
} catch (e) { res.status(500).json({ error: e.message }); }
});
// ── GET /contatos ─────────────────────────────────────────────────────────────
// "Agenda de contatos internos" p/ roteamento por SITUAÇÃO. Lista todas as pessoas da
// clínica (dono/dentista/funcionário) com o papel, as situações de cada número e se pode