/** * Spec 037-DNS-VIEWER — painel DNS unificado (Desk) * Depende de: auth.js (api, esc) */ (function () { function dnsPurposeLabel(purpose) { return { mx: 'MX', spf: 'SPF', dkim: 'DKIM', dmarc: 'DMARC', 'mail-host': 'Mail host', autodiscover: 'Autodiscover', 'mail-alias': 'Alias', other: 'Outro', }[purpose] || purpose || '—'; } function sourceLabel(source) { return { cf_ligbox: 'CF Ligbox', cf_byo: 'CF cliente', public_resolver: 'Público', planned_ligbox: 'Planeado', openpanel_bind: 'OpenPanel', }[source] || source || '—'; } function checkIcon(c) { if (!c) return '—'; if (c.ok) return '✅'; if (c.warn) return '⚠'; return '❌'; } async function fetchDnsViewer(domain, emailService) { const q = new URLSearchParams(); if (emailService != null) q.set('email_service', emailService ? 'true' : 'false'); const qs = q.toString(); return api(`/v1/dns/viewer/${encodeURIComponent(domain)}${qs ? `?${qs}` : ''}`); } async function fetchDomainDns(domain, emailService) { try { const viewer = await fetchDnsViewer(domain, emailService); if (viewer && viewer.domain) return { ...viewer, _viewer: true }; } catch (e) { if (e?.status === 404) { /* DNS_VIEWER_ENABLED=0 — legado */ } else if (e?.status !== 403) { console.warn('DnsViewer fallback:', e?.message || e); } } try { const legacy = await api( `/v1/dns/cloudflare/records?domain=${encodeURIComponent(domain)}&email_service=${emailService ? 'true' : 'false'}` ); return legacy; } catch (e) { return { domain, records: [], email_records: [], summary: { total: 0, email_related: 0 }, error: e.message || 'Falha ao carregar DNS', }; } } function publicChecksRow(checks) { if (!checks || !Object.keys(checks).length) return ''; const parts = ['mx', 'spf', 'dkim', 'dmarc'].map( (k) => `${k.toUpperCase()} ${checkIcon(checks[k])}` ); return `

Verificação pública: ${parts.join(' · ')}

`; } function nsRow(data) { const ns = data.nameservers || {}; const current = ns.current_public || []; if (!current.length) return ''; const match = ns.match_ligbox; const warn = data.display_mode === 'planned' || (data.dns_mode?.startsWith('ligbox_cf') && !match); return `

NS actuais: ${current.map((n) => esc(n)).join(' · ')}${warn ? ' · ⚠ delegação Ligbox pendente' : match ? ' · ✅ Cloudflare' : ''}

`; } function recordRows(records, compact) { return (records || []).map((r) => { const src = r.source ? `${esc(sourceLabel(r.source))}` : ''; const state = r.status === 'planned' ? ' planeado' : ''; if (compact) { return ` ${esc(dnsPurposeLabel(r.purpose))} ${esc(r.name)} ${esc(r.type)} ${esc(r.content)} `; } return ` ${esc(dnsPurposeLabel(r.purpose))} ${esc(r.name)} ${esc(r.type)}${r.priority != null ? ` prio ${r.priority}` : ''} ${esc(r.content)} ${src}${state}${r.proxied != null ? (r.proxied ? ' · proxy' : ' · DNS only') : ''} `; }).join(''); } function editLinksHtml(links, domain) { const parts = []; if (typeof canReadDnsViewer === 'function' && canReadDnsViewer() && domain) { parts.push( ``, ); } if (links?.length) { parts.push( ...links.map( (l) => `${esc(l.label)} ↗`, ), ); } if (!parts.length) return ''; return `
${parts.join(' ')}
`; } function renderDnsPanel(data, { compact = false, title = 'DNS do domínio' } = {}) { if (!data) { return compact ? '

Dados DNS indisponíveis.

' : ``; } const isViewer = data._viewer || data.dns_mode; if (!isViewer) { return compact ? legacyInline(data) : legacyCard(data, title); } const summary = data.summary || {}; const zone = data.zone || {}; const rows = recordRows(data.records, compact); const planned = (data.planned_records || []).length ? `
Planeados (após NS)
${compact ? '' : ''}${recordRows(data.planned_records, compact) || ''}
FunçãoNomeTipoConteúdoOrigem
` : ''; const badgeCls = data.display_mode === 'planned' ? 'review' : data.dns_mode?.startsWith('ligbox_cf') ? 'onboard' : 'open'; const inner = `
${esc(data.mode_label || data.dns_mode || 'DNS')} ${data.email_service ? 'E-mail' : ''}
${data.mode_message ? `

${esc(data.mode_message)}

` : ''} ${nsRow(data)}
${summary.total || 0}registos
${summary.email_related || 0}e-mail
${summary.planned ? `
${summary.planned}planeados
` : ''}
${zone.name ? `

Zona CF ${esc(zone.name)}

` : ''} ${publicChecksRow(data.public_checks)}
${compact ? '' : ''}${rows || ''}
FunçãoNomeTipoConteúdoOrigem
Sem registos para este domínio.
${planned} ${editLinksHtml(data.edit_links, data.domain)} ${data.errors?.length ? `

${esc(data.errors.join(' · '))}

` : ''}`; if (compact) return inner; return ` `; } function legacyInline(dns) { if (dns.error && !dns.records?.length) { return `

${esc(dns.error)}

`; } const rows = recordRows(dns.records, true); const summary = dns.summary || {}; return `
${summary.total || 0}registos na zona
${summary.email_related || 0}para e-mail
${rows || ''}
FunçãoNomeTipoConteúdo
Sem registos.
`; } function legacyCard(dns, title) { return ` `; } window.DnsViewer = { fetch: fetchDnsViewer, fetchDomainDns, renderPanel: renderDnsPanel, dnsPurposeLabel, }; })();