Files
life-echo/api/app/features/user/router.py
2026-03-19 14:36:40 +08:00

104 lines
3.2 KiB
Python

from app.core.logging import get_logger
import uuid
from fastapi import APIRouter, Depends, HTTPException, status
from app.core.config import settings
from app.core.dependencies import get_current_user
from app.features.user.deps import get_user_service
from app.features.user.models import User
from app.features.user.schemas import (
FeedbackResponse,
SubmitFeedbackRequest,
TestSubscriptionRequest,
TestSubscriptionResponse,
UpdateUserProfileRequest,
UserProfileResponse,
)
from app.features.user.service import UserService
logger = get_logger(__name__)
_SHARED_RESPONSES = {
401: {"description": "认证失败"},
403: {"description": "权限不足"},
404: {"description": "资源不存在"},
}
router = APIRouter(
prefix="/api/user",
tags=["user"],
responses=_SHARED_RESPONSES,
)
feedback_router = APIRouter(
prefix="/api/feedback",
tags=["feedback"],
responses=_SHARED_RESPONSES,
)
@router.get("/profile", response_model=UserProfileResponse)
async def get_user_profile(
current_user: User = Depends(get_current_user),
):
return UserProfileResponse(
id=current_user.id,
phone=current_user.phone,
email=current_user.email,
nickname=current_user.nickname,
avatar_url=current_user.avatar_url,
subscription_type=current_user.subscription_type,
created_at=current_user.created_at.isoformat(),
birth_year=current_user.birth_year,
birth_place=current_user.birth_place,
grew_up_place=current_user.grew_up_place,
occupation=current_user.occupation,
)
@router.put("/profile", response_model=UserProfileResponse)
async def update_user_profile(
body: UpdateUserProfileRequest,
current_user: User = Depends(get_current_user),
service: UserService = Depends(get_user_service),
):
return await service.update_profile(current_user.id, body)
@router.post("/test-subscription", response_model=TestSubscriptionResponse)
async def test_subscription(
body: TestSubscriptionRequest,
current_user: User = Depends(get_current_user),
service: UserService = Depends(get_user_service),
):
if not settings.enable_test_subscription:
raise HTTPException(status_code=404, detail="测试订阅功能未开放")
if body.action == "activate" and body.plan_id not in ("pro", "pro_plus"):
raise HTTPException(status_code=400, detail="plan_id 仅支持 pro 或 pro_plus")
return await service.toggle_test_subscription(
current_user.id, body.action, body.plan_id
)
@feedback_router.post(
"", response_model=FeedbackResponse, status_code=status.HTTP_201_CREATED
)
async def submit_feedback(
request: SubmitFeedbackRequest,
current_user: User = Depends(get_current_user),
):
"""提交用户反馈。用户可通过此接口提交反馈意见或联系客服。"""
feedback_id = str(uuid.uuid4())
logger.info(
"用户反馈 - ID: %s, 用户ID: %s, 内容: %s..., 联系方式: %s",
feedback_id,
current_user.id,
request.content[:100] if len(request.content) > 100 else request.content,
request.contact or "未提供",
)
return FeedbackResponse(
id=feedback_id,
message="反馈已提交,我们会尽快处理",
)