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) calendar = caldav_principal().calendar(name=calendar_names[0]) events = [] search_results = calendar.date_search( start=datetime.now(), end=datetime.now() + timedelta(days=365), expand=True, ) for event in search_results: for vevent in event.vobject_instance.contents["vevent"]: events.append(vevent.summary.value) events.append(vevent.description.value) events.append(str(vevent.dtstart.value)) events.append(str(vevent.dtend.value)) return events