63 lines
3.0 KiB
Python
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))
|