from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.deps import get_current_user from app.models.profile import Profile from app.models.user import User from app.schemas.profile import ProfileRead, ProfileUpdate router = APIRouter() async def _get_or_create_profile(user: User, db: AsyncSession) -> Profile: """Return the user's profile, creating an empty one on first access.""" result = await db.execute(select(Profile).where(Profile.user_id == user.id)) profile = result.scalar_one_or_none() if profile is None: profile = Profile(user_id=user.id) db.add(profile) await db.commit() await db.refresh(profile) return profile @router.get("/me", response_model=ProfileRead) async def get_my_profile( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ) -> Profile: return await _get_or_create_profile(current_user, db) @router.put("/me", response_model=ProfileRead) async def update_my_profile( body: ProfileUpdate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ) -> Profile: profile = await _get_or_create_profile(current_user, db) # Only update fields that were explicitly provided in the request body. for field, value in body.model_dump(exclude_unset=True).items(): setattr(profile, field, value) await db.commit() await db.refresh(profile) return profile