diff --git a/app.py b/app.py index 4740357b..7622d20e 100644 --- a/app.py +++ b/app.py @@ -211,3 +211,6 @@ app.include_router(msftRouter) from modules.routes.routeSecurityGoogle import router as googleRouter app.include_router(googleRouter) + +from modules.routes.routeJira import router as jiraRouter +app.include_router(jiraRouter) \ No newline at end of file diff --git a/modules/routes/routeJira.py b/modules/routes/routeJira.py index e49c3815..7874b181 100644 --- a/modules/routes/routeJira.py +++ b/modules/routes/routeJira.py @@ -1,16 +1,50 @@ # Configure logger import logging -from fastapi import APIRouter +from fastapi import APIRouter, FastAPI +from contextlib import asynccontextmanager +from zoneinfo import ZoneInfo + from modules.connectors.connectorTicketJira import ConnectorTicketJira from modules.connectors.connectorSharepoint import ConnectorSharepoint from modules.interfaces.interfaceTicketObjects import TicketSharepointSyncInterface +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from apscheduler.triggers.cron import CronTrigger + + logger = logging.getLogger(__name__) + +scheduler = AsyncIOScheduler(timezone=ZoneInfo("Europe/Zurich")) + + +@asynccontextmanager +async def router_lifespan(app: FastAPI): + # start scheduler when this router is mounted + scheduler.add_job( + perform_sync_jira_delta_group, + CronTrigger(minute="0"), # run at the top of every hour + id="jira_delta_group_sync", + replace_existing=True, + coalesce=True, + max_instances=1, + misfire_grace_time=1800, + ) + scheduler.start() + logger.info("APScheduler started (jira_delta_group_sync hourly)") + try: + yield + finally: + if scheduler.running: + scheduler.shutdown(wait=False) + logger.info("APScheduler stopped") + + router = APIRouter( prefix="/api/jira", tags=["JIRA Sync"], + lifespan=router_lifespan, )