From 1cb93d9688667bb8895dd185bbc508d6c8a799dd Mon Sep 17 00:00:00 2001 From: Egor Date: Thu, 9 Oct 2025 06:27:44 +0300 Subject: [PATCH] Revert "Add promo code activation UI to mini app" --- app/webapi/routes/miniapp.py | 81 ------- app/webapi/schemas/miniapp.py | 13 -- miniapp/index.html | 404 +--------------------------------- 3 files changed, 1 insertion(+), 497 deletions(-) diff --git a/app/webapi/routes/miniapp.py b/app/webapi/routes/miniapp.py index a1efb6ae..bc8b6045 100644 --- a/app/webapi/routes/miniapp.py +++ b/app/webapi/routes/miniapp.py @@ -39,7 +39,6 @@ from app.services.remnawave_service import ( RemnaWaveService, ) from app.services.promo_offer_service import promo_offer_service -from app.services.promocode_service import PromoCodeService from app.services.subscription_service import SubscriptionService from app.utils.subscription_utils import get_happ_cryptolink_redirect_link from app.utils.telegram_webapp import ( @@ -59,8 +58,6 @@ from ..schemas.miniapp import ( MiniAppPromoOffer, MiniAppPromoOfferClaimRequest, MiniAppPromoOfferClaimResponse, - MiniAppPromoCodeActivationRequest, - MiniAppPromoCodeActivationResponse, MiniAppRichTextDocument, MiniAppSubscriptionRequest, MiniAppSubscriptionResponse, @@ -72,7 +69,6 @@ from ..schemas.miniapp import ( logger = logging.getLogger(__name__) router = APIRouter() -promo_code_service = PromoCodeService() def _format_gb(value: Optional[float]) -> float: @@ -1051,83 +1047,6 @@ async def get_subscription_details( ) -@router.post( - "/promo-codes/activate", - response_model=MiniAppPromoCodeActivationResponse, -) -async def activate_promo_code( - payload: MiniAppPromoCodeActivationRequest, - db: AsyncSession = Depends(get_db_session), -) -> MiniAppPromoCodeActivationResponse: - try: - webapp_data = parse_webapp_init_data(payload.init_data, settings.BOT_TOKEN) - except TelegramWebAppAuthError as error: - raise HTTPException( - status.HTTP_401_UNAUTHORIZED, - detail={"code": "unauthorized", "message": str(error)}, - ) from error - - telegram_user = webapp_data.get("user") - if not isinstance(telegram_user, dict) or "id" not in telegram_user: - raise HTTPException( - status.HTTP_400_BAD_REQUEST, - detail={"code": "invalid_user", "message": "Invalid Telegram user payload"}, - ) - - try: - telegram_id = int(telegram_user["id"]) - except (TypeError, ValueError): - raise HTTPException( - status.HTTP_400_BAD_REQUEST, - detail={"code": "invalid_user", "message": "Invalid Telegram user identifier"}, - ) from None - - user = await get_user_by_telegram_id(db, telegram_id) - if not user: - return MiniAppPromoCodeActivationResponse( - success=False, - error_code="user_not_found", - message="User not found", - ) - - normalized_code = (payload.code or "").strip().upper() - if not normalized_code: - return MiniAppPromoCodeActivationResponse( - success=False, - error_code="invalid_code", - message="Promo code is required", - ) - - result = await promo_code_service.activate_promocode(db, user.id, normalized_code) - - if result.get("success"): - description = (result.get("description") or "").strip() - promocode_data = result.get("promocode") or {} - return MiniAppPromoCodeActivationResponse( - success=True, - description=description or None, - code=promocode_data.get("code") or normalized_code, - ) - - error_code = result.get("error") or "generic" - message_map = { - "not_found": "Promo code not found", - "expired": "Promo code expired", - "used": "Promo code already used", - "already_used_by_user": "Promo code already used by this user", - "server_error": "Failed to activate promo code", - "user_not_found": "User not found", - "invalid_code": "Promo code is required", - } - message = message_map.get(error_code, "Failed to activate promo code") - - return MiniAppPromoCodeActivationResponse( - success=False, - error_code=error_code, - message=message, - ) - - @router.post( "/promo-offers/{offer_id}/claim", response_model=MiniAppPromoOfferClaimResponse, diff --git a/app/webapi/schemas/miniapp.py b/app/webapi/schemas/miniapp.py index a6cfc7bf..8b80f82c 100644 --- a/app/webapi/schemas/miniapp.py +++ b/app/webapi/schemas/miniapp.py @@ -123,19 +123,6 @@ class MiniAppPromoOfferClaimResponse(BaseModel): code: Optional[str] = None -class MiniAppPromoCodeActivationRequest(BaseModel): - init_data: str = Field(..., alias="initData") - code: str - - -class MiniAppPromoCodeActivationResponse(BaseModel): - success: bool - description: Optional[str] = None - code: Optional[str] = None - error_code: Optional[str] = Field(default=None, alias="errorCode") - message: Optional[str] = None - - class MiniAppFaqItem(BaseModel): id: int title: Optional[str] = None diff --git a/miniapp/index.html b/miniapp/index.html index bfb53641..0a87a059 100644 --- a/miniapp/index.html +++ b/miniapp/index.html @@ -1079,139 +1079,6 @@ letter-spacing: 0.5px; } - /* Promo Code */ - .promo-code-card { - display: flex; - flex-direction: column; - gap: 16px; - } - - .promo-code-header { - display: flex; - flex-direction: column; - gap: 6px; - } - - .promo-code-title { - font-size: 18px; - font-weight: 700; - } - - .promo-code-subtitle { - font-size: 14px; - color: var(--text-secondary); - line-height: 1.4; - } - - .promo-code-form { - display: flex; - flex-direction: column; - gap: 12px; - } - - .promo-code-input-wrapper { - display: flex; - align-items: stretch; - gap: 8px; - padding: 6px; - border-radius: var(--radius-lg); - background: rgba(var(--primary-rgb), 0.04); - border: 1px solid rgba(var(--primary-rgb), 0.18); - } - - .promo-code-input { - flex: 1; - border: none; - background: transparent; - color: var(--text-primary); - font-size: 16px; - font-weight: 600; - padding: 10px 12px; - outline: none; - text-transform: uppercase; - letter-spacing: 0.08em; - } - - .promo-code-input::placeholder { - color: var(--text-secondary); - opacity: 0.7; - letter-spacing: normal; - text-transform: none; - } - - .promo-code-button { - border: none; - border-radius: calc(var(--radius-lg) - 4px); - background: linear-gradient(135deg, var(--primary), rgba(var(--primary-rgb), 0.8)); - color: var(--tg-theme-button-text-color); - font-weight: 700; - font-size: 15px; - padding: 0 18px; - display: inline-flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease; - min-height: 44px; - } - - .promo-code-button:disabled { - opacity: 0.6; - cursor: not-allowed; - box-shadow: none; - } - - .promo-code-button:not(:disabled):hover { - transform: translateY(-1px); - box-shadow: var(--shadow-sm); - } - - .promo-code-status { - border-radius: var(--radius); - padding: 12px 14px; - font-size: 14px; - font-weight: 600; - display: flex; - align-items: center; - gap: 10px; - line-height: 1.4; - } - - .promo-code-status::before { - content: '\2714'; - font-size: 16px; - } - - .promo-code-status-info { - background: rgba(var(--primary-rgb), 0.08); - color: var(--primary); - border: 1px solid rgba(var(--primary-rgb), 0.25); - } - - .promo-code-status-info::before { - content: '\2139'; - } - - .promo-code-status-success { - background: rgba(16, 185, 129, 0.12); - color: var(--success); - border: 1px solid rgba(16, 185, 129, 0.3); - } - - .promo-code-status-success::before { - content: '\2728'; - } - - .promo-code-status-error { - background: rgba(239, 68, 68, 0.12); - color: var(--danger); - border: 1px solid rgba(239, 68, 68, 0.28); - } - - .promo-code-status-error::before { - content: '\26A0'; - } - /* Transaction History */ .history-list { list-style: none; @@ -2134,7 +2001,6 @@ :root[data-theme="dark"] .card, :root[data-theme="dark"] .user-card, :root[data-theme="dark"] .balance-card, - :root[data-theme="dark"] .promo-code-card, :root[data-theme="dark"] .card.expandable, :root[data-theme="dark"] .language-select, :root[data-theme="dark"] .theme-toggle { @@ -2146,30 +2012,10 @@ :root[data-theme="dark"] .stat-item, :root[data-theme="dark"] .server-item, :root[data-theme="dark"] .device-item, - :root[data-theme="dark"] .app-card, - :root[data-theme="dark"] .promo-code-input-wrapper { + :root[data-theme="dark"] .app-card { border-color: rgba(148, 163, 184, 0.25); } - :root[data-theme="dark"] .promo-code-input-wrapper { - background: rgba(148, 163, 184, 0.12); - } - - :root[data-theme="dark"] .promo-code-status-info { - background: rgba(var(--primary-rgb), 0.18); - border-color: rgba(var(--primary-rgb), 0.35); - } - - :root[data-theme="dark"] .promo-code-status-success { - background: rgba(16, 185, 129, 0.2); - border-color: rgba(16, 185, 129, 0.45); - } - - :root[data-theme="dark"] .promo-code-status-error { - background: rgba(239, 68, 68, 0.24); - border-color: rgba(239, 68, 68, 0.45); - } - :root[data-theme="dark"] .btn-primary { box-shadow: 0 10px 30px rgba(37, 99, 235, 0.45); } @@ -2372,33 +2218,6 @@ - -
-
-
Have a promo code?
-
Enter it to receive your reward.
-
-
-
- - -
-
- -
-