Muzibu Device Limit & Premium System

Redis Session + user_active_sessions Hybrid Architecture - Tenant 1001
2025-12-07 Tenant: muzibu.com (1001) Version: 1.0

1. Sistem Mimarisi

Genel Bakis

Muzibu platformu (Tenant 1001), kullanicilarin ayni anda kac cihazdan erisebilecegini kontrol eden bir device limit sistemi kullanir. Bu sistem Redis session driver ile birlikte calisir ve user_active_sessions tablosu uzerinden device tracking yapar.

Session Storage

Redis (SESSION_DRIVER=redis)

Hizli ve olceklenebilir session yonetimi

Device Tracking

user_active_sessions tablosu

Tenant database'de saklanir

Premium/Trial

subscriptions tablosu

Tenant database'de saklanir

Kritik: Multi-Tenant Yapilandirma

  • ! Bu sistem SADECE Tenant 1001 (muzibu.com) icin aktiftir
  • ! Users, subscriptions, user_active_sessions tablolari tenant database'de saklanir
  • ! Redis prefix tenant-aware olarak calisir: tenant1001:

2. Session Yonetimi (Redis + DB Hybrid)

Neden Hybrid Sistem?

Redis Session Driver Avantajlari

  • - Database driver 23.3s sayfa yuklemesi veriyordu
  • - Redis ile ~5ms (4600x daha hizli!)
  • - Session garbage collection sorunu yok

user_active_sessions Tablosu

  • - Redis session'lari dogrudan sorgulanamaz
  • - Device bilgileri (browser, platform) saklanmali
  • - Aktif cihaz listesi gosterilebilmeli

user_active_sessions Tablo Yapisi

Kolon Tip Aciklama
id bigint Primary key
user_id bigint FK users tablosuna referans
session_id varchar(255) Laravel session ID (unique)
device_type varchar(20) desktop, mobile, tablet
device_name varchar(100) Ornek: "Windows - Chrome"
browser varchar(50) Chrome, Firefox, Safari...
platform varchar(50) Windows, macOS, Android...
ip_address varchar(45) IPv4 veya IPv6
last_activity timestamp Son aktivite zamani

3. Premium/Trial Tespit Sistemi

User Model Metodlari

isPremiumOrTrial()

Ana kontrol metodu. isPremium() VEYA isTrialActive() true ise true doner.

isPremium()

status='active' VE current_period_end > now() kontrolu yapar. 5 dakikalik cache kullanir.

isTrialActive()

has_trial=true VE trial_ends_at > now() kontrolu yapar.

subscriptions Tablosu Kritik Kolonlar

Premium Icin

  • - status: 'active'
  • - current_period_end: Gelecek tarih

Trial Icin

  • - has_trial: true (1)
  • - trial_ends_at: Gelecek tarih

4. Device Limit Sistemi

3 Seviyeli Hiyerarsi

1

User device_limit (VIP/Ban)

users.device_limit kolonu NULL degilse bu deger kullanilir

2

Subscription Plan device_limit

Aktif subscription'in plan'indaki device_limit degeri

3

Settings Fallback

setting('auth_device_limit') veya varsayilan 1

DeviceService Metodlari

Metod Aciklama
registerSession($user) Login sirasinda cagrilir, session kaydeder
unregisterSession($user) Logout sirasinda cagrilir, session siler
updateSessionActivity($user) Polling ile cagrilir, session gecerliyse true
getActiveDevices($user) Aktif cihaz listesini doner
getDeviceLimit($user) 3-seviyeli hiyerarsiyle limit doner
terminateSessionById($id) Belirli bir session'i sonlandirir
terminateOtherSessions($user) Mevcut haric tum session'lari siler

5. API Endpoints

POST /api/auth/login

Kullanici giris yapar, session olusturur, device kaydeder

Body: email, password, remember
POST /api/auth/logout

Cikis yapar, session siler, device kaydini kaldirir

Requires: auth:sanctum middleware
GET /api/auth/me

Kullanici bilgileri, premium durumu, aktif cihazlar

Returns: user, is_premium, trial_ends_at, subscription_ends_at, active_devices, device_limit
GET /api/auth/check-session

Session gecerliligini kontrol eder (polling icin)

Returns: valid, reason (if invalid), user_id
POST /api/auth/terminate-device

Belirli bir cihazi cikis yaptirir

Body: email, password, device_id (int)
POST /api/auth/get-active-devices

Aktif cihaz listesini getirir (modal icin)

Body: email, password

6. Frontend Entegrasyonu

muzibuPlayerConfig

Blade layout'ta tanimlanan global JavaScript objesi. Alpine.js componentleri bu objeden kullanici bilgilerini alir.

window.muzibuPlayerConfig = {
    isLoggedIn: true/false,
    currentUser: {
        id: 1,
        name: "Kullanici",
        email: "email@example.com",
        is_premium: true/false,
        trial_ends_at: "2025-12-08T17:42:49+00:00",
        subscription_ends_at: "2025-12-08T17:42:49+00:00"
    },
    tenantId: 1001
}

Sidebar Mantigi

  • 1. currentUser?.is_premium false ise "Ucretsiz Uye" gosterir
  • 2. trial_ends_at varsa "Deneme Uyesi" gosterir
  • 3. subscription_ends_at varsa "Premium" gosterir
  • 4. Kalan sure hesaplanip gosterilir (gun/saat/dakika)

7. Sorun Giderme

Sorun: "Ucretsiz Uye" Gozukuyor (Premium/Trial iken)

Olasi Nedenler:

  • Premium cache eski deger donduruyor
  • Subscription tablosunda kayit yok veya suresi dolmus
  • Tenant context dogru set edilmemis

Cozum:

php artisan cache:clear
curl -s https://muzibu.com/opcache-reset.php

Sorun: Device Limit Modal Yanlis Gozukuyor

Olasi Nedenler:

  • user_active_sessions tablosu tenant DB'de yok
  • Eski session kayitlari temizlenmemis
  • Session ID uyumsuzlugu

Cozum:

-- Tenant DB'de tablo var mi kontrol et:
SHOW TABLES LIKE 'user_active_sessions';

-- Eski kayitlari temizle (30 dk'dan eski):
DELETE FROM user_active_sessions WHERE last_activity < NOW() - INTERVAL 30 MINUTE;

Debug Komutlari

# Premium durumunu kontrol et (Tinker):
tenancy()->initialize(App\Models\Tenant::find(1001));
$user = App\Models\User::find(1);
echo $user->isPremiumOrTrial(); // true/false

# Aktif cihazlari kontrol et:
$deviceService = app(Modules\Muzibu\App\Services\DeviceService::class);
$deviceService->getActiveDevices($user);