from datetime import datetime, timedelta from typing import Iterator from fastapi import APIRouter, Depends, HTTPException, status from .. import caldav_principal from ._common import CalendarNameLister, PrefixFinder router = APIRouter(prefix="/calendar", tags=["calendar"]) _lister = CalendarNameLister() _finder = PrefixFinder(_lister) @router.get("/list", response_model=list[str]) async def list_calendars( calendar_names: Iterator[str] = Depends(_lister), ) -> list[str]: return list(calendar_names) @router.get("/find/{prefix}", response_model=list[str]) async def find_calendars( calendar_names: Iterator[str] = Depends(_finder), ) -> list[str]: return list(calendar_names) @router.get("/get/{prefix}", response_model=list[str]) async def get_calendar( calendar_names: Iterator[str] = Depends(_finder), ) -> list[str]: calendar_names = list(calendar_names) if not (calendar_names): raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) elif len(calendar_names) > 1: raise HTTPException(status_code=status.HTTP_409_CONFLICT) principal = await caldav_principal() calendar = principal.calendar(name=calendar_names[0]) events = calendar.date_search( start=datetime.now(), end=datetime.now() + timedelta(days=365), expand=True, ) return list( str(child.contents['summary'][0].value) for event in events for child in event.vobject_instance.contents['vevent'] )