diff --git a/backend/inbox/plugins.py b/backend/inbox/plugins.py index 8b13789..b0795ed 100644 --- a/backend/inbox/plugins.py +++ b/backend/inbox/plugins.py @@ -1 +1,32 @@ +"""Inbox helpers — attachment loading and other non-routing checks.""" +from __future__ import annotations + +import base64 +from pathlib import Path + +from inbox.models import Inbox_Messages + + +def load_message_files(message: Inbox_Messages) -> list[dict]: + """Read files from file_path when they exist on disk.""" + if not message.file_path: + return [] + + files: list[dict] = [] + for path_str in message.file_path.split(","): + path = Path(path_str.strip()) + if not path.is_file(): + continue + try: + raw = path.read_bytes() + except OSError: + continue + files.append( + { + "file_name": path.name, + "content_base64": base64.b64encode(raw).decode("ascii"), + "size": len(raw), + } + ) + return files diff --git a/backend/inbox/serializers.py b/backend/inbox/serializers.py index 689e796..712db4b 100644 --- a/backend/inbox/serializers.py +++ b/backend/inbox/serializers.py @@ -17,8 +17,10 @@ def serialize_message(message: Inbox_Messages) -> dict: sender_name = name attachment_name = None - if message.file_path: - attachment_name = Path(message.file_path).name + if message.file_name: + attachment_name = message.file_name.split(",")[0].strip() or None + elif message.file_path: + attachment_name = Path(message.file_path.split(",")[0].strip()).name or None return { "id": str(message.id), @@ -31,6 +33,7 @@ def serialize_message(message: Inbox_Messages) -> dict: "unread": not message.message_read, "attachment": message.attachment, "attachment_name": attachment_name, + "file_name": message.file_name, "message_to": message.message_to, "message_cc": message.message_cc, "message_bcc": message.message_bcc, diff --git a/backend/inbox/views.py b/backend/inbox/views.py index b8efa43..e561a44 100644 --- a/backend/inbox/views.py +++ b/backend/inbox/views.py @@ -1,13 +1,12 @@ -import httpx,os,uuid +import httpx,os from fastapi import HTTPException from inbox.models import Inbox_Messages from inbox.file_decoder import decode_attachment, AttachmentDecodeError from inbox.serializers import serialize_message +from inbox.plugins import load_message_files from dotenv import load_dotenv load_dotenv() from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy import func,or_ -from sqlmodel import select from pydantic import BaseModel class Email: @@ -48,13 +47,24 @@ class Email: async def get_inbox_messages(self,top,skip,search=None): messages=await Inbox_Messages.get_inbox_messages(self.session,top,skip,search) - return [serialize_message(m) for m in messages] + items=[] + for m in messages: + item=serialize_message(m) + files=load_message_files(m) + if files: + item["files"]=files + items.append(item) + return items async def get_inbox_message_by_id(self,record_id): message=await Inbox_Messages.get_inbox_message_by_id(self.session,record_id) if not message: raise HTTPException(status_code=404,detail="Message not found") - return serialize_message(message) + item=serialize_message(message) + files=load_message_files(message) + if files: + item["files"]=files + return item async def count_inbox_messages(self,search=None): return await Inbox_Messages.count_inbox_messages(self.session,search)