/** * GET /api/mail/lead-emails/message?leadId=&account=&folder=&uid= (IMAP) * GET /api/mail/lead-emails/message?leadId=&account=archive&uid= (mailpiler) * Partner mode (admin roles): `partnerId=&address=` instead of `leadId`. * Content of one e-mail of the lead's history: { status, message: { html, text, * from, to, cc, attachments, … } }. The message must involve the lead's address * (checked server-side), otherwise 404. Staff only. Never throws to the client. */ import { gateFromEvent } from '../../../utils/chatAccess' import { listMailAccounts, fetchMessage } from '../../../utils/mail/leadMailbox' import { fetchArchiveMessage } from '../../../utils/mail/mailArchive' import { resolveMailTarget } from '../../../utils/mail/leadEmailAddress' export default defineEventHandler(async (event) => { let token = '' try { token = (await gateFromEvent(event)).token } catch (err: any) { return { status: err?.statusCode || 403, message: 'Forbidden' } } const q = getQuery(event) const leadId = Number(q.leadId) || 0 const partnerId = Number(q.partnerId) || 0 const isArchive = String(q.account) === 'archive' const index = Number(q.account) const folder = String(q.folder || '') const uid = Number(q.uid) || 0 if ((!leadId && !partnerId) || !uid) return { status: 400, message: 'Missing parameters' } if (!isArchive && (!Number.isInteger(index) || !listMailAccounts()[index] || !folder)) return { status: 400, message: 'Missing parameters' } try { const { email } = await resolveMailTarget(event, q, token) if (!email) return { status: 404, message: 'No e-mail address' } const started = Date.now() const message = isArchive ? await fetchArchiveMessage(uid, email) : await fetchMessage(index, folder, uid, email) if (!message) return { status: 404, message: 'Message not found' } return { status: 200, message, ms: Date.now() - started } } catch (err: any) { if (err?.statusCode === 403) return { status: 403, message: 'Forbidden' } console.warn('[lead-emails] message failed:', err?.message || err) return { status: 502, message: err?.message || 'Mailbox unavailable' } } })