Skip to main content

Rate Limiting & Subscription Plans

Az API implementál egy feladattípus-alapú rate limiting rendszert, amely különböző limiteket alkalmaz vendég felhasználók, regisztrált felhasználók és prémium előfizetők számára.

Felhasználói kategóriák​

Vendég felhasználók​

Nem regisztrált felhasználók, akik visitor key segítségével férnek hozzá az API-hoz.

Napi limitek feladattípusonként:

  • table: 10 kérés/nap
  • connect_1: 10 kérés/nap
  • gaps: 10 kérés/nap
  • quiz: 5 kérés/nap
  • essay: 1 kérés/nap
  • exam: 1 kérés/nap

Regisztrált felhasználók​

Felhasználói fiókkal rendelkező, de nem prémium előfizetők.

Napi limitek feladattípusonként:

  • table: 30 kérés/nap
  • connect_1: 30 kérés/nap
  • gaps: 30 kérés/nap
  • quiz: 15 kérés/nap
  • essay: 5 kérés/nap
  • exam: 3 kérés/nap

Prémium előfizetők​

Aktív előfizetéssel rendelkező felhasználók.

Korlátlan hozzáférés minden feladattípushoz. A rate limiter automatikusan átengedi a kéréseket előfizetés ellenőrzés után.

Visitor Key (vendég hozzáférés)​

Visitor key igénylése​

Endpoint: GET /api/v1/vkey

Request headers:

cf-connecting-ip: <client-ip>

Response:

abc123def456...  // 40 karakteres hexadecimális string

Korlátozások:

  • Egy IP címről maximum 5 visitor key igényelhető 24 órán belül
  • A visitor key 10,000 másodpercig (kb. 2.77 óra) érvényes
  • A key kriptográfiailag biztonságos véletlenszám-generátorral készül

Hibakezelés:

  • 401 Unauthorized: Az IP elérte a maximális key igénylési limitet (5/24h)

Visitor key használata​

A visitor key-t minden rate limit alá eső kéréshez csatolni kell header formájában:

visitorkey: abc123def456...

Authentikációval rendelkező felhasználók​

Regisztrált és prémium felhasználók JWT token alapján vannak azonosítva. A visitor key ezekben az esetekben opcionális.

Request header:

Authorization: Bearer <jwt-token>

A backend a következő lépésekkel dolgozza fel az authentikációt:

  1. JWT token dekódolása és user ID kinyerése
  2. Előfizetés státusz ellenőrzése (SubscriptionService.validateSubscription())
  3. Ha prémium: rate limit bypass
  4. Ha nem prémium: regisztrált felhasználói limitek alkalmazása feladattípusonként

Rate limitált endpointok​

Az alábbi endpointok rate limiting alatt állnak:

EndpointFeladattípusVendég limitRegisztrált limitPrémium
GET /api/v1/task?tasktype=tabletable10/nap30/napKorlátlan
GET /api/v1/task?tasktype=connect_1connect_110/nap30/napKorlátlan
GET /api/v1/task?tasktype=gapsgaps10/nap30/napKorlátlan
GET /api/v1/task?tasktype=quizquiz5/nap15/napKorlátlan
GET /api/v1/essayessay1/nap5/napKorlátlan
POST /api/v1/examexam1/nap3/napKorlátlan

Rate limit nélküli endpointok​

Az alábbi endpointok nem állnak rate limiting alatt és szabadon elérhetők minden felhasználó számára:

  • GET /api/v1/flashcard - Szókártyák lekérése
  • GET /api/v1/flashcard/number - Szókártyák száma
  • GET /api/v1/material - Tananyagok lekérése
  • GET /api/v1/material/topics - Témakörök listája
  • POST /api/v1/solution - Megoldás validálása
  • GET /api/v1/vkey - Visitor key generálás (IP throttling érvényes)

Hibaüzenetek​

400 Bad Request​

{
"statusCode": 400,
"message": "visitorkey is required for guest access"
}

Vendég felhasználó nem csatolt visitor key-t a kéréshez.

401 Unauthorized - Rate limit túllépve​

{
"statusCode": 401,
"message": "You have exceeded your daily limit for {taskType} exercises ({limit}/{limit}). Upgrade to premium for unlimited access or wait until tomorrow."
}

A felhasználó elérte a napi limitet az adott feladattípusra.

401 Unauthorized - Érvénytelen visitor key​

{
"statusCode": 401,
"message": "visitorkey is incorrect, please don't manually enter it"
}

A megadott visitor key nem létezik vagy lejárt.

401 Unauthorized - Érvénytelen JWT​

{
"statusCode": 401,
"message": "Failed to validate authentication token"
}

A JWT token hibás vagy lejárt.

Technikai implementáció​

Redis tárolási struktúra​

A rate limiting Redis (database 5) hash struktúrát használ feladattípusonként:

Vendég felhasználók:

visitor:{visitorKey}
├─ registered: <timestamp>
├─ table_count: 5
├─ connect_1_count: 3
├─ gaps_count: 2
├─ quiz_count: 1
├─ essay_count: 0
└─ exam_count: 1

Regisztrált felhasználók:

jwt:{userId}
├─ registered: <timestamp>
├─ table_count: 15
├─ connect_1_count: 8
├─ gaps_count: 12
├─ quiz_count: 4
├─ essay_count: 2
└─ exam_count: 1

IP throttling:

addresses:{ipAddress}
├─ count: 3
└─ TTL: 86400 (24 óra)

Feladattípus detektálás​

A LimiterInterceptor a következő logikával azonosítja a feladattípust:

  1. Query paraméter ellenőrzése: req.query.tasktype
  2. URL path alapú detektálás:
    • /essay → essay
    • /exam → exam
    • /flashcard → flashcard (bypass)
    • /material → material (bypass)

Fejlesztői jegyzet​

A rate limiting jelenleg alapértelmezetten kikapcsolva van. Az éles környezetben történő aktiváláshoz az alábbi SQL parancsot kell futtatni:

UPDATE config
SET config = jsonb_set(config, '{limiter,enabled}', 'true')
WHERE mainline = true;

A konfigurációs beállítások a config táblában találhatók JSON formátumban.