// Customer-admin email-domain data + mutations, backed by platform-api's // /api/tenants/:slug/domains endpoints. Reads use useFetch (SSR-friendly list); // writes go through useApiFetch so a lapsed session refreshes silently instead // of redirecting away mid-action. Mirrors the read/write split in // pages/admin/security.vue. export type RecordStatus = 'ok' | 'warn' | 'bad' | 'pending' export type DomainStatus = 'pending' | 'verifying' | 'active' | 'error' export type RecordKind = 'ownership' | 'mx' | 'spf' | 'dkim' | 'dmarc' export type DmarcPolicy = 'none' | 'quarantine' | 'reject' export interface DomainRecordView { kind: RecordKind type: string host: string fqdn: string expected: string priority?: number observed?: string status: RecordStatus } export interface DomainView { id: string domain: string isPrimary: boolean status: DomainStatus ownershipVerified: boolean verificationToken: string dmarcPolicy: DmarcPolicy stalwartProvisioned: boolean stalwartError?: string mailboxes: number checks: Record<'ownership' | 'mx' | 'spf' | 'dkim' | 'dmarc', RecordStatus> records: DomainRecordView[] lastCheckedAt?: string } export function useDomains() { const { tenant } = useTenant() const slug = computed(() => tenant.value?.slug ?? '') const { request } = useApiFetch() const base = () => `/api/tenants/${slug.value}/domains` const one = (domain: string) => `${base()}/${encodeURIComponent(domain)}` const { data: domains, refresh, pending } = useFetch(base, { key: 'admin-domains', default: () => [], immediate: !!slug.value, watch: [slug], }) const add = (domain: string) => request(base(), { method: 'POST', body: { domain } }) const getOne = (domain: string) => request(one(domain)) const recheck = (domain: string) => request(`${one(domain)}/recheck`, { method: 'POST' }) const setDmarcPolicy = (domain: string, dmarcPolicy: DmarcPolicy) => request(`${one(domain)}/dmarc`, { method: 'PATCH', body: { dmarcPolicy } }) const remove = (domain: string) => request(one(domain), { method: 'DELETE' }) return { domains, pending, refresh, slug, add, getOne, recheck, setDmarcPolicy, remove } }