| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- from datetime import date, timedelta
- from typing import Callable, TYPE_CHECKING
- from fastapi import APIRouter, BackgroundTasks
- from pydantic import BaseModel
- from room_cal.store import DEFAULT_CALENDAR_NAME
- from room_cal.closed import Closed, ClosedData
- 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')
- _SOURCE = API_SOURCE
- class SetClosedBody(BaseModel):
- services: list[str] = []
- async def set_closed(
- target_date: date,
- services: list[str],
- *,
- source: dict = _SOURCE,
- schedule: Callable | None = None,
- ) -> None:
- await Closed(DEFAULT_CALENDAR_NAME).set(target_date, ClosedData(services=services, source=source))
- await _push(push_closed(target_date, target_date), schedule)
- async def delete_closed(
- target_date: date,
- *,
- source: dict = _SOURCE,
- schedule: Callable | None = None,
- ) -> None:
- await Closed(DEFAULT_CALENDAR_NAME).set(target_date, ClosedData(services=[], source=source))
- await _push(push_closed(target_date, target_date), schedule)
- async def sync_closed(
- start_date: date,
- end_date: date,
- *,
- schedule: Callable | None = None,
- ) -> None:
- result = await fetch_closed(start_date, end_date)
- if result.changed:
- await _push(push_closed(start_date, end_date), schedule)
- @router.post('/closed/{target_date}', status_code=204)
- async def workflow_set_closed(target_date: date, body: SetClosedBody, bg: BackgroundTasks):
- await set_closed(target_date, body.services, schedule=lambda c: bg.add_task(_bg, c))
- @router.delete('/closed/{target_date}', status_code=204)
- async def workflow_delete_closed(target_date: date, bg: BackgroundTasks):
- await delete_closed(target_date, schedule=lambda c: bg.add_task(_bg, c))
- @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))
|