|
|
@@ -1,5 +1,5 @@
|
|
|
-from datetime import date
|
|
|
-from typing import Callable
|
|
|
+from datetime import date, timedelta
|
|
|
+from typing import Callable, TYPE_CHECKING
|
|
|
from fastapi import APIRouter, BackgroundTasks
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
@@ -9,6 +9,11 @@ from room_cal.actions.fetch_closed import fetch_closed
|
|
|
from room_cal.actions.push_closed import push_closed
|
|
|
from room_cal.workflows import _bg, _push
|
|
|
from room_cal._api_source import API_SOURCE
|
|
|
+from room_cal._periodic import register_periodic
|
|
|
+from room_cal._utils import local_today, get_config
|
|
|
+
|
|
|
+if TYPE_CHECKING:
|
|
|
+ from room_cal.service_api import ServiceAPI
|
|
|
|
|
|
router = APIRouter(prefix='/workflow')
|
|
|
|
|
|
@@ -64,3 +69,19 @@ async def workflow_delete_closed(target_date: date, bg: BackgroundTasks):
|
|
|
@router.post('/closed/{start_date}/{end_date}', status_code=204)
|
|
|
async def workflow_sync_closed(start_date: date, end_date: date, bg: BackgroundTasks):
|
|
|
await sync_closed(start_date, end_date, schedule=lambda c: bg.add_task(_bg, c))
|
|
|
+
|
|
|
+
|
|
|
+async def _periodic_push_short(api: 'ServiceAPI') -> None:
|
|
|
+ start = local_today()
|
|
|
+ window = get_config().global_.reservation_window_days
|
|
|
+ await push_closed(start, start + timedelta(days=window), api=api)
|
|
|
+
|
|
|
+
|
|
|
+async def _periodic_push_long(api: 'ServiceAPI') -> None:
|
|
|
+ start = local_today()
|
|
|
+ window = get_config().global_.long_window_days
|
|
|
+ await push_closed(start, start + timedelta(days=window), api=api)
|
|
|
+
|
|
|
+
|
|
|
+register_periodic(_periodic_push_short, timedelta(hours=6))
|
|
|
+register_periodic(_periodic_push_long, timedelta(days=1))
|