handoff fixes
This commit is contained in:
parent
6c52cd19cb
commit
89ddebdb60
15 changed files with 991 additions and 271 deletions
108
backend/app/services/handoff_mirror.py
Normal file
108
backend/app/services/handoff_mirror.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
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,
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue