"""激励模块路由(/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))