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:
@@ -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) ───
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user