from datetime import date from fastapi import APIRouter, Depends, HTTPException, Query, status from sqlalchemy.orm import Session from app.auth.dependencies import get_current_user from app.database import get_db from app.models.calendar import CalendarEvent from app.models.user import User from app.schemas.calendar import CalendarEventCreate, CalendarEventUpdate, CalendarEventOut router = APIRouter(prefix="/calendar", tags=["calendar"]) @router.get("", response_model=list[CalendarEventOut]) def list_events( date_from: date | None = None, date_to: date | None = None, is_completed: bool | None = None, category_id: int | None = None, limit: int = Query(100, le=500), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): q = db.query(CalendarEvent).filter(CalendarEvent.user_id == current_user.id) if date_from: q = q.filter(CalendarEvent.event_date >= date_from) if date_to: q = q.filter(CalendarEvent.event_date <= date_to) if is_completed is not None: q = q.filter(CalendarEvent.is_completed == is_completed) if category_id: q = q.filter(CalendarEvent.category_id == category_id) return q.order_by(CalendarEvent.event_date, CalendarEvent.event_time).limit(limit).all() @router.get("/{event_id}", response_model=CalendarEventOut) def get_event(event_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user)): obj = db.get(CalendarEvent, event_id) if not obj or obj.user_id != current_user.id: raise HTTPException(status_code=404, detail="Event not found") return obj @router.post("", response_model=CalendarEventOut, status_code=status.HTTP_201_CREATED) def create_event(body: CalendarEventCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user)): obj = CalendarEvent(**body.model_dump(), user_id=current_user.id) db.add(obj) db.commit() db.refresh(obj) return obj @router.patch("/{event_id}", response_model=CalendarEventOut) def update_event( event_id: int, body: CalendarEventUpdate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): obj = db.get(CalendarEvent, event_id) if not obj or obj.user_id != current_user.id: raise HTTPException(status_code=404, detail="Event not found") for field, value in body.model_dump(exclude_none=True).items(): setattr(obj, field, value) db.commit() db.refresh(obj) return obj @router.delete("/{event_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_event(event_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user)): obj = db.get(CalendarEvent, event_id) if not obj or obj.user_id != current_user.id: raise HTTPException(status_code=404, detail="Event not found") db.delete(obj) db.commit()