90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
from fastapi import APIRouter, HTTPException, Query, Form
|
||
from typing import List
|
||
from app.services.auth import AuthService
|
||
from app.services.promo import PromoService
|
||
from app.models.promo import PromoCreate, PromoUpdate, PromoRedeemResponse
|
||
|
||
router = APIRouter(tags=["Promo"])
|
||
|
||
promo_service = PromoService()
|
||
|
||
async def validate_admin(accessToken: str, clientToken: str):
|
||
auth = AuthService()
|
||
if not await auth.is_admin(accessToken, clientToken):
|
||
raise HTTPException(status_code=403, detail="Admin privileges required")
|
||
|
||
# --- Игровая ручка (активация) ---
|
||
|
||
@router.post("/promo/redeem", response_model=PromoRedeemResponse)
|
||
async def redeem_promo(
|
||
username: str = Form(...),
|
||
code: str = Form(...),
|
||
):
|
||
# при желании сюда можно добавить проверку accessToken/clientToken,
|
||
# как у вас в админских ручках, но это зависит от вашей auth-логики.
|
||
return await promo_service.redeem(username=username, code=code)
|
||
|
||
# --- Админские ручки ---
|
||
|
||
@router.get("/admin/promo", response_model=List[dict])
|
||
async def admin_list_promos(
|
||
accessToken: str,
|
||
clientToken: str,
|
||
limit: int = Query(50, ge=1, le=200),
|
||
skip: int = Query(0, ge=0),
|
||
):
|
||
await validate_admin(accessToken, clientToken)
|
||
return await promo_service.list(limit=limit, skip=skip)
|
||
|
||
@router.post("/admin/promo", response_model=dict)
|
||
async def admin_create_promo(
|
||
accessToken: str = Form(...),
|
||
clientToken: str = Form(...),
|
||
code: str = Form(...),
|
||
reward_coins: int = Form(...),
|
||
max_uses: int | None = Form(None),
|
||
is_active: bool = Form(True),
|
||
):
|
||
await validate_admin(accessToken, clientToken)
|
||
|
||
if max_uses is not None and max_uses <= 0:
|
||
max_uses = None
|
||
|
||
payload = PromoCreate(
|
||
code=code,
|
||
reward_coins=reward_coins,
|
||
max_uses=max_uses,
|
||
is_active=is_active,
|
||
)
|
||
return await promo_service.create(payload)
|
||
|
||
@router.put("/admin/promo/{promo_id}", response_model=dict)
|
||
async def admin_update_promo(
|
||
promo_id: str,
|
||
accessToken: str = Form(...),
|
||
clientToken: str = Form(...),
|
||
reward_coins: int | None = Form(None),
|
||
max_uses: int | None = Form(None),
|
||
is_active: bool | None = Form(None),
|
||
):
|
||
await validate_admin(accessToken, clientToken)
|
||
|
||
if max_uses is not None and max_uses <= 0:
|
||
max_uses = None
|
||
|
||
payload = PromoUpdate(
|
||
reward_coins=reward_coins,
|
||
max_uses=max_uses,
|
||
is_active=is_active
|
||
)
|
||
return await promo_service.update(promo_id, payload)
|
||
|
||
@router.delete("/admin/promo/{promo_id}")
|
||
async def admin_delete_promo(
|
||
promo_id: str,
|
||
accessToken: str,
|
||
clientToken: str,
|
||
):
|
||
await validate_admin(accessToken, clientToken)
|
||
return await promo_service.delete(promo_id)
|