feat: live IMAP sync on folder select + 60s auto-sync interval

- New imap_sync_folder function: syncs single folder quickly for live use
- New POST /mail/folders/{folder_id}/sync route
- Frontend: syncFolder API + called on every folder selection
- Auto-sync interval reduced from 300s to 60s
- Sent mail IMAP APPEND already uploads full body via msg.as_bytes()
This commit is contained in:
Agent Zero
2026-07-20 12:01:16 +02:00
parent c24a86bc90
commit 3313047577
5 changed files with 259 additions and 3 deletions
+26
View File
@@ -632,6 +632,32 @@ async def empty_folder(
return {"emptied_count": len(mails)}
# ─── Sync single folder (live sync when selecting a folder) ───
@router.post("/folders/{folder_id}/sync")
async def sync_folder(
folder_id: str,
db: AsyncSession = Depends(get_db),
current_user: dict = Depends(require_permission("mail:read")),
):
"""Sync a single folder from IMAP server immediately."""
tenant_id = uuid.UUID(current_user["tenant_id"])
user_id = uuid.UUID(current_user["user_id"])
f_id = _parse_uuid(folder_id, "folder_id")
folder = (
await db.execute(
select(MailFolder).where(and_(MailFolder.id == f_id, MailFolder.tenant_id == tenant_id))
)
).scalar_one_or_none()
if not folder:
raise HTTPException(404, detail={"detail": "Folder not found", "code": "not_found"})
account = await _get_account(db, folder.account_id, tenant_id, user_id)
result = await mail_services.imap_sync_folder(db, f_id, tenant_id)
await db.flush()
return result
# ─── Attachment Upload (F-MAIL-04) ───