Files
2026-10-15 20:36:59 +08:00

63 lines
3.0 KiB
Python

"""激励模块路由(/referral/* + /assets/*,对应《03-接口文档》第 9 章)"""
import redis.asyncio as aioredis
from fastapi import APIRouter, Depends, Query, Request
from sqlalchemy.ext.asyncio import AsyncSession
from app.core import ratelimit
from app.core.response import ok
from app.database import get_db
from app.deps import Identity, require_user
from app.redis_client import get_redis
from app.schemas.incentive import BindInviteReq, WithdrawReq
from app.services import incentive_service
router_referral = APIRouter(prefix="/referral", tags=["推荐"])
router_assets = APIRouter(prefix="/assets", tags=["资产"])
@router_referral.get("/me")
async def get_my_referral(db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok(await incentive_service.get_my_referral(db, redis, identity.user_id))
@router_referral.post("/bind")
async def bind_invite_code(req: BindInviteReq, request: Request, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
ip = request.client.host if request.client else ""
return ok(await incentive_service.bind_invite_code(
db, redis, identity.user_id, req.invite_code, identity.device_id, ip
))
@router_assets.get("/me")
async def get_my_assets(db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok(await incentive_service.get_my_assets(db, redis, identity.user_id))
@router_assets.get("/records")
async def list_asset_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 incentive_service.list_asset_records(db, identity.user_id, page, page_size, biz_type))
@router_assets.post("/withdraw")
async def apply_withdraw(req: WithdrawReq, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
await ratelimit.hit_subject(redis, identity.subject, "withdraw", 1, 60, "提现申请过于频繁,请稍后再试")
return ok(await incentive_service.apply_withdraw(
db, redis, identity.user_id, req.assets, req.channel, req.account
))
@router_assets.get("/withdraw/records")
async def list_withdraw_records(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 incentive_service.list_withdraw_records(db, identity.user_id, page, page_size))