from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from typing import Optional, List from app.database import get_db from app.models.reminder import Reminder from app.schemas.reminder import ReminderCreate, ReminderUpdate, ReminderResponse from app.routers.auth import get_current_session from app.models.settings import Settings router = APIRouter() @router.get("/", response_model=List[ReminderResponse]) async def get_reminders( active: Optional[bool] = Query(None), dismissed: Optional[bool] = Query(None), db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Get all reminders with optional filters.""" query = select(Reminder) if active is not None: query = query.where(Reminder.is_active == active) if dismissed is not None: query = query.where(Reminder.is_dismissed == dismissed) query = query.order_by(Reminder.remind_at.asc()) result = await db.execute(query) reminders = result.scalars().all() return reminders @router.post("/", response_model=ReminderResponse, status_code=201) async def create_reminder( reminder: ReminderCreate, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Create a new reminder.""" new_reminder = Reminder(**reminder.model_dump()) db.add(new_reminder) await db.commit() await db.refresh(new_reminder) return new_reminder @router.get("/{reminder_id}", response_model=ReminderResponse) async def get_reminder( reminder_id: int, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Get a specific reminder by ID.""" result = await db.execute(select(Reminder).where(Reminder.id == reminder_id)) reminder = result.scalar_one_or_none() if not reminder: raise HTTPException(status_code=404, detail="Reminder not found") return reminder @router.put("/{reminder_id}", response_model=ReminderResponse) async def update_reminder( reminder_id: int, reminder_update: ReminderUpdate, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Update a reminder.""" result = await db.execute(select(Reminder).where(Reminder.id == reminder_id)) reminder = result.scalar_one_or_none() if not reminder: raise HTTPException(status_code=404, detail="Reminder not found") update_data = reminder_update.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(reminder, key, value) await db.commit() await db.refresh(reminder) return reminder @router.delete("/{reminder_id}", status_code=204) async def delete_reminder( reminder_id: int, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Delete a reminder.""" result = await db.execute(select(Reminder).where(Reminder.id == reminder_id)) reminder = result.scalar_one_or_none() if not reminder: raise HTTPException(status_code=404, detail="Reminder not found") await db.delete(reminder) await db.commit() return None @router.patch("/{reminder_id}/dismiss", response_model=ReminderResponse) async def dismiss_reminder( reminder_id: int, db: AsyncSession = Depends(get_db), current_user: Settings = Depends(get_current_session) ): """Dismiss a reminder.""" result = await db.execute(select(Reminder).where(Reminder.id == reminder_id)) reminder = result.scalar_one_or_none() if not reminder: raise HTTPException(status_code=404, detail="Reminder not found") reminder.is_dismissed = True await db.commit() await db.refresh(reminder) return reminder