This commit is contained in:
2025-12-20 19:57:57 +05:00
parent bb2681bff8
commit cbc586683a

View File

@ -42,72 +42,43 @@ async def admin_create_promo(
clientToken: str = Form(...), clientToken: str = Form(...),
code: str = Form(...), code: str = Form(...),
reward_coins: int = Form(...), reward_coins: int = Form(...),
max_uses: str | None = Form( max_uses: int | None = Form(None),
default=None,
description="Сколько всего раз можно активировать промокод. Пусто = бесконечно. 1 = одноразовый."
),
is_active: bool = Form(True), is_active: bool = Form(True),
): ):
await validate_admin(accessToken, clientToken) await validate_admin(accessToken, clientToken)
# normalize max_uses if max_uses is not None and max_uses <= 0:
if max_uses is None or max_uses.strip() == "": max_uses = None
max_uses_int = None
else:
try:
max_uses_int = int(max_uses)
except ValueError:
raise HTTPException(status_code=400, detail="max_uses must be an integer")
if max_uses_int <= 0:
# 0 или отрицательные считаем как "бесконечно"
max_uses_int = None
payload = PromoCreate( payload = PromoCreate(
code=code, code=code,
reward_coins=reward_coins, reward_coins=reward_coins,
max_uses=max_uses_int, max_uses=max_uses,
is_active=is_active, is_active=is_active,
) )
return await promo_service.create(payload) return await promo_service.create(payload)
@router.put("/admin/promo/{promo_id}", response_model=dict) @router.put("/admin/promo/{promo_id}", response_model=dict)
async def admin_update_promo( async def admin_update_promo(
promo_id: str, promo_id: str,
accessToken: str = Form(...), accessToken: str = Form(...),
clientToken: str = Form(...), clientToken: str = Form(...),
reward_coins: int | None = Form(None), reward_coins: int | None = Form(None),
max_uses: str | None = Form( max_uses: int | None = Form(None),
default=None,
description="Пусто = не менять. '0' = бесконечно. '1' = одноразовый."
),
is_active: bool | None = Form(None), is_active: bool | None = Form(None),
): ):
await validate_admin(accessToken, clientToken) await validate_admin(accessToken, clientToken)
max_uses_int = None if max_uses is not None and max_uses <= 0:
max_uses_provided = max_uses is not None # отличаем “не прислали” от “прислали пусто/0” max_uses = None
if max_uses_provided: payload = PromoUpdate(
if max_uses.strip() == "": reward_coins=reward_coins,
# пусто -> бесконечно max_uses=max_uses,
max_uses_int = None is_active=is_active
else: )
try:
max_uses_int = int(max_uses)
except ValueError:
raise HTTPException(status_code=400, detail="max_uses must be an integer")
if max_uses_int <= 0:
max_uses_int = None
data = {"reward_coins": reward_coins, "is_active": is_active}
if max_uses_provided:
data["max_uses"] = max_uses_int
payload = PromoUpdate(**{k: v for k, v in data.items() if v is not None or k == "max_uses" and max_uses_provided})
return await promo_service.update(promo_id, payload) return await promo_service.update(promo_id, payload)
@router.delete("/admin/promo/{promo_id}") @router.delete("/admin/promo/{promo_id}")
async def admin_delete_promo( async def admin_delete_promo(
promo_id: str, promo_id: str,