/**
* 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;