from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, status from fastapi.responses import StreamingResponse from PIL import Image from ..core.calendar_config import CalendarConfig, DoorsSaved, get_calendar_config from ..core.depends import get_all_event_days, get_day_image from ..core.helpers import EventDays, api_return_image, load_image from ._security import user_can_view_day, user_is_admin router = APIRouter(prefix="/user", tags=["user"]) @router.get( "/background_image", response_class=StreamingResponse, ) async def get_background_image( cal_cfg: CalendarConfig = Depends(get_calendar_config), ) -> StreamingResponse: """ Hintergrundbild laden """ return await api_return_image(await load_image(f"files/{cal_cfg.background}")) @router.get( "/image_{day}", response_class=StreamingResponse, ) async def get_image_for_day( image: Image.Image = Depends(get_day_image), can_view: bool = Depends(user_can_view_day), is_admin: bool = Depends(user_is_admin), ) -> StreamingResponse: """ Bild für einen Tag erstellen """ if not (can_view or is_admin): raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Wie unhöflich!!!") return await api_return_image(image) @router.get("/doors") async def get_doors( cal_cfg: CalendarConfig = Depends(get_calendar_config), ) -> DoorsSaved: """ User-sichtbare Türchen lesen """ return [door for door in cal_cfg.doors if await user_can_view_day(door.day)] @router.get("/next_door") async def get_next_door( event_days: EventDays = Depends(get_all_event_days), ) -> int | None: """ Zeit in ms, bis das nächste Türchen öffnet """ if event_days.next is None: return None dt = datetime.combine(event_days.next, datetime.min.time()) td = dt - datetime.now() return int(td.total_seconds() * 1000)