from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from app.database import get_db from app.deps import get_current_user from app.models.group import Group, GroupMembership from app.models.user import User from app.schemas.user import ColorModeUpdate, DashboardPrefsOut, DashboardPrefsUpdate, UserGroupOut, UserOut router = APIRouter() @router.get("/me", response_model=UserOut) async def get_me(current_user: User = Depends(get_current_user)): return current_user @router.get("/me/preferences", response_model=DashboardPrefsOut) async def get_preferences(current_user: User = Depends(get_current_user)): return DashboardPrefsOut(app_ids=current_user.dashboard_app_ids or []) @router.patch("/me/preferences", response_model=DashboardPrefsOut) async def update_preferences( body: DashboardPrefsUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): current_user.dashboard_app_ids = body.app_ids await db.commit() await db.refresh(current_user) return DashboardPrefsOut(app_ids=current_user.dashboard_app_ids or []) @router.get("/me/groups", response_model=list[UserGroupOut]) async def get_my_groups( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): """Return all groups the current user belongs to.""" result = await db.execute( select(Group) .join(GroupMembership, GroupMembership.group_id == Group.id) .where(GroupMembership.user_id == current_user.id) .order_by(Group.name) ) return result.scalars().all() @router.patch("/me/color-mode", response_model=UserOut) async def update_color_mode( body: ColorModeUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): current_user.color_mode = body.color_mode await db.commit() await db.refresh(current_user) return current_user