HR-ATS-Portal/backend/cron_schdule/tasks.py

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}