54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
"""Daily Sync Inbox cron — 05:00 AM PKT via httpx POST /email/sync.
|
|
|
|
Worker: taskiq worker taskiq_management.broker_setup:broker cron_schdule.tasks
|
|
Scheduler: taskiq scheduler taskiq_management.broker_setup:scheduler cron_schdule.tasks
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
|
|
import httpx
|
|
from dotenv import load_dotenv
|
|
|
|
from cron_schdule.plugins import call_inbox_sync_api
|
|
from taskiq_management.broker_setup import broker
|
|
|
|
load_dotenv()
|
|
|
|
logger=logging.getLogger("cron_schdule.inbox_sync")
|
|
|
|
# 05:00 Asia/Karachi (PKT, UTC+5, no DST). Override the expression or zone in .env.
|
|
INBOX_SYNC_CRON=os.getenv("INBOX_SYNC_CRON","0 5 * * *")
|
|
INBOX_SYNC_CRON_TZ=os.getenv("INBOX_SYNC_CRON_TZ","Asia/Karachi")
|
|
INBOX_SYNC_TOP=int(os.getenv("INBOX_SYNC_TOP","100"))
|
|
INBOX_SYNC_SKIP=int(os.getenv("INBOX_SYNC_SKIP","0"))
|
|
INBOX_SYNC_TEST_ON=os.getenv("INBOX_SYNC_TEST_ON","true").strip().lower() not in ("0","false","no")
|
|
|
|
|
|
@broker.task(
|
|
task_name="cron_schdule.sync_inbox",
|
|
schedule=[{"cron":INBOX_SYNC_CRON,"cron_offset":INBOX_SYNC_CRON_TZ}],
|
|
)
|
|
async def sync_inbox_daily() -> dict:
|
|
"""Enqueue Outlook mailbox sync the same way the Inbox UI button does."""
|
|
try:
|
|
payload=await call_inbox_sync_api(
|
|
top=INBOX_SYNC_TOP,
|
|
skip=INBOX_SYNC_SKIP,
|
|
test_on=INBOX_SYNC_TEST_ON,
|
|
)
|
|
except RuntimeError as e:
|
|
logger.warning("daily inbox sync skipped: %s",e)
|
|
return {"error":"not_configured","detail":str(e)}
|
|
except httpx.ConnectError as e:
|
|
logger.warning("daily inbox sync unreachable: %s",e)
|
|
return {"error":"unreachable","detail":str(e)}
|
|
except httpx.HTTPStatusError as e:
|
|
status=e.response.status_code if e.response is not None else None
|
|
logger.warning("daily inbox sync HTTP %s",status)
|
|
return {"error":"http_error","status_code":status}
|
|
data=payload.get("data") if isinstance(payload,dict) else None
|
|
return {"status":"ok","data":data}
|