This commit is contained in:
root
2026-10-16 13:51:00 +08:00
parent 6bf949949c
commit 8fc899d0a9
3830 changed files with 11228 additions and 188377 deletions
+89
View File
@@ -0,0 +1,89 @@
"""用户模块路由(/users/*,对应《03-接口文档》第 4 章)"""
import redis.asyncio as aioredis
from fastapi import APIRouter, Depends, Query, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.response import ok
from app.database import get_db
from app.deps import Identity, get_identity, require_user
from app.redis_client import get_redis
from app.schemas.user import DeactivateReq, UpdateMeReq
from app.services import interaction_service, storage_service, user_service, video_service
router = APIRouter(prefix="/users", tags=["用户"])
# 注意:/users/me 系列须先于 /users/{user_id} 注册,避免 "me" 被路径参数匹配
@router.get("/me")
async def get_me(db: AsyncSession = Depends(get_db), identity: Identity = Depends(require_user)):
return ok(await user_service.get_me(db, identity.user_id))
@router.put("/me")
async def update_me(req: UpdateMeReq, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok(await user_service.update_me(db, redis, identity.user_id, req))
@router.post("/me/avatar")
async def upload_avatar(file: UploadFile, db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
url = await storage_service.save_avatar(file, identity.user_id)
return ok(await user_service.set_avatar(db, identity.user_id, url))
@router.get("/me/wallet")
async def get_wallet(db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok(await user_service.get_wallet(db, redis, identity.user_id))
@router.get("/me/points/records")
async def get_points_records(page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50),
biz_type: int | None = Query(None),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
return ok(await user_service.get_points_records(db, identity.user_id, page, page_size, biz_type))
@router.post("/me/deactivate")
async def deactivate(req: DeactivateReq, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok(await user_service.deactivate(db, redis, identity.user_id, req.password))
@router.get("/me/favorites")
async def get_my_favorites(page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
return ok(await interaction_service.list_my_favorites(db, identity.user_id, page, page_size))
@router.get("/me/history")
async def get_my_history(page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
return ok(await interaction_service.list_my_history(db, identity.user_id, page, page_size))
@router.get("/me/videos")
async def get_my_videos(page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50),
status: int | None = Query(None, ge=0, le=5),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
return ok(await video_service.list_my_videos(db, identity.user_id, page, page_size, status))
@router.get("/{user_id}")
async def get_public_profile(user_id: int, db: AsyncSession = Depends(get_db)):
return ok(await user_service.get_public_profile(db, user_id))
@router.get("/{user_id}/videos")
async def get_user_videos(user_id: int, page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=50),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(get_identity)):
return ok(await user_service.get_user_videos(db, user_id, page, page_size, identity.user_id))