From cbc586683a7dc75f57246b0a2b87fbf10f29a09a Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sat, 20 Dec 2025 19:57:57 +0500 Subject: [PATCH] fix promo #2 --- app/api/promo.py | 61 +++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 45 deletions(-) diff --git a/app/api/promo.py b/app/api/promo.py index 6b7c41d..85ac701 100644 --- a/app/api/promo.py +++ b/app/api/promo.py @@ -42,72 +42,43 @@ async def admin_create_promo( clientToken: str = Form(...), code: str = Form(...), reward_coins: int = Form(...), - max_uses: str | None = Form( - default=None, - description="Сколько всего раз можно активировать промокод. Пусто = бесконечно. 1 = одноразовый." - ), + max_uses: int | None = Form(None), is_active: bool = Form(True), ): await validate_admin(accessToken, clientToken) - - # normalize max_uses - if max_uses is None or max_uses.strip() == "": - 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 - + + 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_int, + 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: str | None = Form( - default=None, - description="Пусто = не менять. '0' = бесконечно. '1' = одноразовый." - ), + max_uses: int | None = Form(None), is_active: bool | None = Form(None), ): await validate_admin(accessToken, clientToken) - - max_uses_int = None - max_uses_provided = max_uses is not None # отличаем “не прислали” от “прислали пусто/0” - - if max_uses_provided: - if max_uses.strip() == "": - # пусто -> бесконечно - 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: - 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}) + + 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,