/** * Email Migration UI — Spec 019 */ const DeskEmailMigration = (() => { const API = '/api'; function esc(s) { return String(s ?? '').replace(/&/g, '&').replace(//g, '>'); } async function api(path, options = {}) { const res = await fetch(`${API}${path}`, { ...options, headers: { ...authHeaders(), 'Content-Type': 'application/json', ...(options.headers || {}) }, }); if (!res.ok) throw new Error((await res.json().catch(() => ({}))).detail || res.statusText); return res.json(); } function gateClass(g) { if (g === 'ready_for_dns') return 'migration-gate-ready'; if (g === 'warning') return 'migration-gate-warning'; return 'migration-gate-blocked'; } function jobRow(j) { return `
${esc(j.domain)}
${esc(j.phase)} · gate ${esc(j.migration_gate)}
`; } async function renderPage() { const el = document.getElementById('email-migration-content'); if (!el) return; el.innerHTML = '

Carregando migrações…

'; try { const data = await api('/v1/migration/jobs'); const jobs = data.jobs || []; el.innerHTML = `

Migração E-mail (Spec 019)

Legado → Carbonio VM112 · Gate DNS antes de MX

${jobs.length ? jobs.map(jobRow).join('') : '

Nenhum job — crie um para iniciar

'}
`; el.querySelector('#mig-new-job')?.addEventListener('click', async () => { const domain = prompt('Domínio a migrar:'); if (!domain) return; const email = prompt('Mailbox principal (email):', `admin@${domain}`); await api('/v1/migration/jobs', { method: 'POST', body: JSON.stringify({ domain, dest_imap_host: `mail.${domain}`, mailboxes: [{ email: email || `admin@${domain}`, source_host: prompt('IMAP origem (host):') || '' }], }), }); await renderPage(); }); el.querySelectorAll('[data-mig-preflight]').forEach((b) => b.addEventListener('click', async () => { await api(`/v1/migration/jobs/${b.dataset.migPreflight}/preflight`, { method: 'POST' }); await renderPage(); })); el.querySelectorAll('[data-mig-sync]').forEach((b) => b.addEventListener('click', async () => { await api(`/v1/migration/jobs/${b.dataset.migSync}/sync?run_type=initial`, { method: 'POST' }); await renderPage(); })); el.querySelectorAll('[data-mig-verify]').forEach((b) => b.addEventListener('click', async () => { const r = await api(`/v1/migration/jobs/${b.dataset.migVerify}/verify`); alert(`Verify: ${r.avg_sync_percent}% · gate ${r.gate}`); await renderPage(); })); el.querySelectorAll('[data-mig-approve]').forEach((b) => b.addEventListener('click', async () => { await api(`/v1/migration/jobs/${b.dataset.migApprove}/approve-gate`, { method: 'POST', body: '{}' }); await renderPage(); })); } catch (e) { el.innerHTML = `

Erro: ${esc(e.message)}

`; } } return { renderPage }; })(); window.DeskEmailMigration = DeskEmailMigration;