Muzibu Subscription & Device Limit Sistemi

Kapsamli Analiz ve Uygulama Plani
Tarih: 2025-12-07 Tenant: muzibu.com (1001) Durum: Analiz Tamamlandi

1. KRITIK SORUNLAR (Hemen Duzeltilmeli)

1

handlePostLoginDeviceLimit() Metodu EKSIK RUNTIME HATASI

DeviceService.php icinde handlePostLoginDeviceLimit() metodu tanimli DEGIL. Ancak 2 yerden cagiriliyor:

  • AuthController.php:114 - register() icerisinde
  • AuthenticatedSessionController.php:155 - store() icerisinde

Sonuc: Kayit olan kullanicilar icin runtime hatasi olusabilir!

2

IKI FARKLI Device Limit Hierarchy TUTARSIZLIK

DeviceService (YANLIS)

  1. User->device_limit
  2. Setting('auth_device_limit')
  3. Fallback: 1

Subscription Plan YOKSUN!

SubscriptionService (DOGRU)

  1. User->device_limit
  2. Subscription Plan->device_limit
  3. Setting('auth_device_limit')

3 katmanli hierarchy

Sonuc: Login sirasinda DeviceService kullaniliyor, plan device_limit'i goz ardi ediliyor!

3

CSRF Token Mismatch Sorunu LOGIN SORUNU

Device limit asildinda modal aciliyor. Kullanici cihaz secip terminate ettiginde CSRF token gecersiz olabiliyor cunku session regenerate edilmis.

Cozum: terminateDevice API'si credential-based (email+password) oldugu icin CSRF token sorunu olmamali. Modal'dan login retry yapildiginda CSRF sorunu olusabilir.

2. MEVCUT DURUM ANALIZI

Calisan Sistemler

  • Session tablosu ve tracking
  • Device bilgileri (Jenssegers/Agent)
  • Browser/Platform detection
  • IP address kaydi
  • Premium/Trial kontrol (5dk cache)
  • 30 saniye guest/ucretsiz preview
  • Login oncesi device limit kontrolu
  • Session polling (30sn aralik)
  • Device selection modal (login)
  • Device terminate API

Eksik/Bozuk Sistemler

  • handlePostLoginDeviceLimit() metodu
  • Plan device_limit entegrasyonu
  • Premium expire - session cleanup
  • ! Modal encoding sorunu (Turkce)
  • ! 3 sarki/gun limiti (devre disi)

3. KULLANICI ISTEKLERI ve COZUMLER

1

3 Seviyeli Device Limit Fallback

Istek: User -> Subscription -> Settings siralamasiyla device limit belirlenmeli.

Uygulama Plani:

  1. DeviceService.getDeviceLimit() metodunu guncelle
  2. SubscriptionService.getDeviceLimit() ile ayni mantigi kullan
  3. User->activeSubscription()->plan->device_limit kontrol ekle

Beklenen Sonuc: Premium Plan'daki device_limit degeri kullanilacak

2

Cihaz Limit Dolunca Modal

Istek: Limit dolunca modal acilsin, kullanici cihaz secsin, secilen cihaz sistemden cikarilsin.

ZATEN CALISIYOR! device-selection-modal.blade.php mevcut ve calisir durumda.

Gosterilen Bilgiler:

  • Cihaz turu (desktop/mobile/tablet) - ikon ile
  • Cihaz adi (Windows 11 - Chrome)
  • Browser + Platform
  • IP adresi
  • Son aktivite (5 dakika once, 2 saat once vs.)
  • Mevcut cihaz badge'i
3

Guest ve Ucretsiz Uyeler 30sn Dinlesin TAMAMLANDI

Mevcut Durum: SongStreamController.stream() metodunda bu kontrol ZATEN VAR.

Calisma Mantigi:

  • Guest (auth yok) -> 30sn preview (HLS: 4 chunk)
  • Normal uye (premium degil) -> 30sn preview
  • Premium/Trial -> Sinirsiz
4

Premium Uyeler Sinirsiz Dinlesin TAMAMLANDI

Mevcut Durum: User.isPremiumOrTrial() kontrolu ile calisir durumda.

Kontrol Sirasi:

  1. isPremium() - status='active' VE current_period_end > now()
  2. isTrialActive() - has_trial=true VE trial_ends_at > now()
  3. 5 dakikalik cache (performans)
5

Premium Bitince Otomatik Ucretsiz'e Donusum KISMI CALISIYOR

Mevcut Durum: isPremium() her stream'de kontrol ediyor (5dk cache). Premium bittiginde 5dk icinde ucretsiz'e donuyor.

Iyilestirme Onerileri:

  • Cron job ile expire olan subscription'lari isaretle
  • SubscriptionObserver ile cache invalidation (ZATEN VAR)
  • Frontend'de subscription_ends_at takibi

5 Dakika Gecikme Kabul Edilebilir: Kullanici istedigi gibi.

6

Yeni Subscription Aninda Aktif Olmali

Istek: Kullanici subscription aldiktan sonra HEMEN dinlemeye baslayabilmeli.

ZATEN CALISIYOR! SubscriptionObserver cache'i aninda temizliyor.

Cache Invalidation Noktalari:

  • Subscription::created -> Cache::forget()
  • Subscription::updated -> Cache::forget()
  • Subscription::deleted -> Cache::forget()

4. UYGULAMA PLANI

Phase 1: Kritik Bug Fix'ler ONCELIKLI

1.1 handlePostLoginDeviceLimit() Ekle

DeviceService.php'ye eksik metodu ekle:

  • Login sonrasi device limit kontrolu
  • Limit asilmissa en eski session'i sil
  • Premium cache'i temizle

1.2 Device Limit Hierarchy Duzelt

DeviceService.getDeviceLimit() metodunu guncelle:

  • User->device_limit (VIP/Test/Ban)
  • Subscription Plan->device_limit (Normal akis)
  • Setting('auth_device_limit') (Fallback)

Phase 2: Iyilestirmeler ORTA ONCELIK

2.1 Modal Encoding Fix

device-selection-modal.blade.php'deki Turkce karakter sorunlarini duzelt.

2.2 Settings Kontrolu

Admin panelinde kontrol edilecek ayarlar:

  • auth_device_limit - Varsayilan cihaz limiti
  • session_lifetime - Oturum suresi
  • subscription_enabled - Uyelik sistemi aktif/pasif

2.3 Subscription Plan device_limit

Premium planlar icin device_limit degerini ayarla (ornegin: 3 cihaz).

Phase 3: Opsiyonel Gelistirmeler DUSUK ONCELIK

3.1 Session Cleanup Cron Job

Expired subscription'larin session'larini temizle (5dk aralik kabul edilebilir).

3.2 Device Activity Tracking

Son dinlenen sarki bilgisini device listesinde goster.

5. MEVCUT SISTEM AKISI

Login Akisi

  1. 1 Kullanici email/password girer
  2. 2 AuthController.login() - credentials dogrulama
  3. 3 DeviceService.checkDeviceLimitBeforeLogin() - limit kontrolu
  4. ? Limit asildi -> device_limit_exceeded response + aktif cihaz listesi
  5. 4 Frontend device selection modal acar
  6. 5 Kullanici cihaz secer -> terminateDevice() API
  7. 6 Secilen cihazin session'i silinir
  8. 7 Kullanici tekrar login yapar (simdi limit altinda)

Session Polling Akisi (Aktif Kullanici)

  1. 1 Kullanici basarili login -> startSessionPolling()
  2. 2 Her 30 saniyede checkSessionValidity() cagrilir
  3. 3 /api/auth/check-session -> Session DB'de var mi?
  4. ? Session silinmis -> device_limit_exceeded response
  5. 4 handleDeviceLimitExceeded() -> Modal goster
  6. 5 3 saniye sonra otomatik logout

Stream Akisi

  1. 1 Kullanici sarki calar -> /api/muzibu/songs/{id}/stream
  2. 2 Auth kontrol: web guard || sanctum guard
  3. A Guest -> 30sn preview (HLS: 4 chunk)
  4. B Ucretsiz uye -> 30sn preview
  5. C Premium/Trial -> Sinirsiz HLS stream

6. DOSYA REFERANSLARI

Backend

  • Modules/Muzibu/app/Services/DeviceService.php
  • Modules/Subscription/app/Services/SubscriptionService.php
  • Modules/Subscription/app/Models/Subscription.php
  • Modules/Subscription/app/Models/SubscriptionPlan.php
  • app/Models/User.php
  • app/Http/Controllers/Api/Auth/AuthController.php
  • Modules/Muzibu/app/Http/Controllers/Api/SongStreamController.php

Frontend

  • resources/views/themes/muzibu/components/device-limit-modal.blade.php
  • resources/views/themes/muzibu/components/device-selection-modal.blade.php
  • public/themes/muzibu/js/player/core/player-core.js

7. SONUC ve OZET

2
Kritik Bug
4
Calisan Ozellik
3
Iyilestirme

Oncelik Sirasi:

  1. HEMEN: handlePostLoginDeviceLimit() metodunu ekle (runtime hatasi)
  2. HEMEN: DeviceService.getDeviceLimit() hierarchy'yi duzelt
  3. YAKINDA: Modal encoding fix
  4. YAKINDA: Settings kontrolu ve plan device_limit ayari
  5. OPSIYONEL: Session cleanup cron job