Files
popa_minecraft_launcher_api/app/api/promo.py
2025-12-20 19:57:57 +05:00

90 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)