from datetime import datetime, timezone from fastapi import APIRouter, Depends from app.middleware.auth import get_current_user from app.models.user import User from app.schemas.user import ( OnboardingRequest, UserProfileUpdate, UserProfileResponse, ) router = APIRouter() def _user_to_response(user: User) -> UserProfileResponse: return UserProfileResponse( id=str(user.id), name=user.name, phone=user.phone, age=user.age, height=user.height, pre_pregnancy_weight=user.pre_pregnancy_weight, current_weight=user.current_weight, blood_type=user.blood_type, allergies=user.allergies, medical_history=user.medical_history, last_period_date=user.last_period_date, due_date=user.due_date, pregnancy_week=user.pregnancy_week, pregnancy_day=user.pregnancy_day, multiple_pregnancy=user.multiple_pregnancy, pregnancy_count=user.pregnancy_count, emergency_contact=user.emergency_contact.model_dump() if user.emergency_contact else None, is_onboarded=user.is_onboarded, avatar_url=user.avatar_url, created_at=user.created_at, ) @router.get("/profile", response_model=UserProfileResponse) async def get_profile(user: User = Depends(get_current_user)): """获取用户信息""" return _user_to_response(user) @router.post("/onboarding", response_model=UserProfileResponse) async def complete_onboarding( req: OnboardingRequest, user: User = Depends(get_current_user) ): """完成用户画像设置""" user.name = req.name or user.name user.age = req.age user.height = req.height user.pre_pregnancy_weight = req.pre_pregnancy_weight user.current_weight = req.current_weight user.blood_type = req.blood_type user.allergies = req.allergies user.medical_history = req.medical_history user.last_period_date = req.last_period_date user.due_date = req.due_date user.pregnancy_week = req.pregnancy_week user.pregnancy_day = req.pregnancy_day user.multiple_pregnancy = req.multiple_pregnancy user.pregnancy_count = req.pregnancy_count if req.emergency_contact: user.emergency_contact = req.emergency_contact user.is_onboarded = True user.updated_at = datetime.now(timezone.utc) await user.save() return _user_to_response(user) @router.put("/profile", response_model=UserProfileResponse) async def update_profile( req: UserProfileUpdate, user: User = Depends(get_current_user) ): """更新用户信息""" update_data = req.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(user, field, value) user.updated_at = datetime.now(timezone.utc) await user.save() return _user_to_response(user)