104 lines
3.2 KiB
Python
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="反馈已提交,我们会尽快处理",
|
|
)
|