Пейволл раньше (предпроверка без загрузки) + пакетная обработка по подписке

- /api/paywall/check: решение сервера до загрузки файла → пейволл показывается
  сразу для больших файлов (не грузим тяжёлый файл впустую)
- Загрузка файла — только при клике оплатить (upload-on-pay)
- Пакетная обработка (2+ файла, папка, ZIP) — только по активной подписке

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
root
2026-07-03 14:47:30 +00:00
parent 54dc7697ba
commit e25e7c888a
2 changed files with 116 additions and 15 deletions

View File

@@ -1806,6 +1806,33 @@ async def pay_status(payment_id: str):
return {"status": db_status, "purpose": purpose}
@app.post("/api/paywall/check")
async def paywall_check(payload: dict, request: Request):
"""Предпроверка пейволла БЕЗ загрузки файла. body: {size_mb?, pages?, user_id?}.
Возвращает решение сервера, чтобы фронт показал пейволл сразу."""
if not isinstance(payload, dict):
payload = {}
try:
size_mb = float(payload.get("size_mb") or 0)
except (TypeError, ValueError):
size_mb = 0.0
try:
pages = int(payload.get("pages") or 0)
except (TypeError, ValueError):
pages = 0
account = _resolve_account(request, payload.get("user_id"))
sub_active = _db_sub_active(account)
over = size_mb > AUTH_REQUIRED_MB or pages > AUTH_REQUIRED_PAGES
requires_payment = bool(PAYWALL_ENABLED and over and not sub_active)
return {
"paywall_enabled": bool(PAYWALL_ENABLED),
"sub_active": sub_active,
"requires_payment": requires_payment,
"file_price": FILE_PRICE_RUB,
"sub_price": SUB_PRICE_RUB,
}
# ══════════════════════════════════════════════════════════════════════════════
# Аккаунты, сессии, OAuth-вход (Yandex ID)
# ══════════════════════════════════════════════════════════════════════════════