85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
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)
|