from dataclasses import dataclass, field from app.services.handoff_email_templates import ( build_mirror_handoff_html, build_mirror_handoff_text, build_mirror_update_html, build_mirror_update_text, format_sender_line, ) from app.services.html_sanitizer import plain_text_to_html, sanitize_email_html from app.services.mime_body_extractor import ExtractedMimePart, MirroredMimeContent, extract_mirror_content from app.services.raw_mime_storage import get_raw_mime_storage @dataclass class HandoffMirrorPayload: body_text: str body_html: str | None inline_parts: list[ExtractedMimePart] = field(default_factory=list) file_attachments: list[ExtractedMimePart] = field(default_factory=list) async def load_mirror_payload(external_message: dict) -> HandoffMirrorPayload: sender = external_message.get("sender") or {} sender_line = format_sender_line(sender) external_subject = external_message.get("subject", "") agent_email = external_message.get("_agent_email", "") body_text = (external_message.get("body_text") or external_message.get("snippet") or "").strip() body_html = external_message.get("body_html") inline_parts: list[ExtractedMimePart] = [] file_attachments: list[ExtractedMimePart] = [] if external_message.get("raw_mime"): try: raw = await get_raw_mime_storage().get(external_message["raw_mime"]) extracted: MirroredMimeContent = extract_mirror_content(raw) if extracted.body_text: body_text = extracted.body_text if extracted.body_html: body_html = extracted.body_html inline_parts = extracted.inline_parts file_attachments = extracted.file_attachments except Exception: pass if body_html: original_html = sanitize_email_html(body_html) elif body_text: original_html = plain_text_to_html(body_text) else: original_html = plain_text_to_html("(No message body)") if not body_text: body_text = external_message.get("snippet") or "(No message body)" return HandoffMirrorPayload( body_text=build_mirror_handoff_text( sender_line=sender_line, external_subject=external_subject, original_body_text=body_text, agent_email=agent_email, ), body_html=build_mirror_handoff_html( sender_line=sender_line, external_subject=external_subject, original_html=original_html, agent_email=agent_email, ), inline_parts=inline_parts, file_attachments=file_attachments, ) async def load_mirror_update_payload( external_message: dict, *, agent_email: str, ) -> HandoffMirrorPayload: external_message = {**external_message, "_agent_email": agent_email} payload = await load_mirror_payload(external_message) sender = external_message.get("sender") or {} sender_line = format_sender_line(sender) external_subject = external_message.get("subject", "") body_text = (external_message.get("body_text") or external_message.get("snippet") or "").strip() body_html = external_message.get("body_html") if body_html: original_html = sanitize_email_html(body_html) else: original_html = plain_text_to_html(body_text or "(No message body)") return HandoffMirrorPayload( body_text=build_mirror_update_text( sender_line=sender_line, external_subject=external_subject, original_body_text=body_text, agent_email=agent_email, ), body_html=build_mirror_update_html( sender_line=sender_line, external_subject=external_subject, original_html=original_html, agent_email=agent_email, ), inline_parts=payload.inline_parts, file_attachments=payload.file_attachments, )