🎯 Muzibu Trial System

MASTER PLAN - Tüm Sorunlara Ortak Çözüm

📅 Tarih: 2025-12-04 🎵 Tenant: muzibu.com (1001) 🎯 Hedef: Gerçek Zamanlı Kontrol

📊 Genel Bakış

💡 TEK PRENSİP

Request-Level Fresh Check + Event-Based System
Her müzik isteğinde gerçek zamanlı kontrol, durum değişince event fırlat!

🎯 Analiz Edilen 7 Rapor Özeti:

Rapor Konu Sonuç
1. Trial Stratejisi Cycle bazında trial → Ayrı trial planı ✓ Checkbox (is_trial)
2. Trial Checkbox Slug yerine boolean field ✓ Tek trial garantisi
3. Trial Yönetimi Trial planı kim oluşturacak? ✓ Admin manuel + otomatik atama
4. Manage UI Cycle'lardan trial field'ı kaldır ✓ 7 lokasyon temizleme
5. Cron Alternatifi Cron çalışmazsa ne olur? ✓ Lazy Check + Cron (Hybrid)
6. Event System Tüm olaylara ortak dil ✓ Event-based architecture
7. Realtime Control Giriş/çıkış beklenmez (5 yıl!) ✓ Request-level fresh check

❌ TEK SORUNDA TOPLANDI: Gerçek Zamanlı Kontrol

🚨 ANA PROBLEM:
  • Kullanıcı 1 kere giriş yapar → 5 yıl çıkış yapmaz!
  • Trial bitince → Hala sınırsız dinliyor (SONSUZA KADAR!)
  • Premium bitince → Aylar boyu ücretsiz kullanıyor!
  • Device limit aşıldı → İkisi de çalışıyor!
  • Cache 1 saat → isPremium() geç tepki veriyor!

📋 3 Kritik Senaryo:

❌ Senaryo 1: Trial Bitişi

  • Gün 0-7: Trial kullanıyor
  • Gün 8: Trial bitti
  • Gün 9-∞: Hala dinliyor!

Kayıp: SONSUZ

❌ Senaryo 2: Premium Bitişi

  • 1 Aralık: Premium aldı (30 gün)
  • 31 Aralık: Premium bitti
  • Ocak-Mart: Hala dinliyor!

Kayıp: 3 AY

💡 NEDEN?
  • Lazy Check: isPremium() sadece çağrıldığında kontrol eder
  • Cache: 1 saatlik cache → Anında tepki yok!
  • Token: Token expire olmadı mı devam eder
  • Giriş/Çıkış: Kullanıcı yapmıyor, o yüzden kriter değil!

✅ ORTAK ÇÖZÜM: 3 Katmanlı Sistem

🎯 ÇÖZÜM STRATEJİSİ

1. Request-Level Fresh Check (Her müzik isteği)
2. Event-Based System (Durum değişince)
3. Cron Backup (Siteye girmeyenler için)

📍 Nasıl Çalışacak?

1

Kullanıcı Müzik Çalmak İster

Stream endpoint'e istek gelir: /api/stream/{song_id}

2

Fresh Check (CACHE YOK!)

$user->isPremiumFresh() → Database'den direkt kontrol (cache atlanır)

3

Durum Kontrolü

Trial/Premium bitti mi? → Event fırlat!

  • Bittiyse → TrialExpired / SubscriptionExpired event
  • Aktifse → Müziği çal
4

Event Listeners

  • Status güncelle (active → expired)
  • Email gönder (trial bitti)
  • Push bildirim
  • Log tut
  • Analytics
5

Müzik Çal veya Reddet

Premium/Trial aktifse → HLS stream ver
Değilse → 30 saniye preview

⚙️ İMPLEMENTASYON - 4 Faz

Faz 1: Database & Model (Foundation)

YÜKSEK ÖNCELİK
  • 1
    Migration: users tablosuna has_used_trial

    Boolean field, default false, index ekle

  • 2
    Migration: subscription_plans tablosuna is_trial

    Boolean field, default false, unique constraint

  • 3
    User model: isPremiumFresh() metodu ekle

    Cache KULLANMA! Her seferinde fresh DB check

  • 4
    SubscriptionPlan model: is_trial fillable ekle

Faz 2: Event System (Core Logic)

YÜKSEK ÖNCELİK
  • 5
    Event: TrialExpired oluştur

    app/Events/TrialExpired.php (user, subscription)

  • 6
    Event: SubscriptionExpired oluştur
  • 7
    Listener: SendTrialExpiredEmail

    Email gönder, bildirim at, log tut

  • 8
    isPremiumFresh() içine event dispatch ekle

    Subscription bittiyse event fırlat

Faz 3: Stream Endpoint (Real-time Control)

YÜKSEK ÖNCELİK
  • 9
    Stream controller: isPremiumFresh() kullan

    isPremium() yerine isPremiumFresh() çağır (cache yok!)

  • 10
    HLS playlist endpoint: Fresh check ekle

    Her segment isteğinde de kontrol et

  • 11
    Middleware: SubscriptionCheck

    API route'larına ekle, otomatik kontrol

Faz 4: Admin Panel & Cron (Finishing)

ORTA ÖNCELİK
  • 12
    Admin: Trial plan oluştur

    Manuel olarak: slug=trial, fiyat=₺0.00, 7 gün

  • 13
    subscription-plan-manage UI: Trial field'ları kaldır

    7 lokasyon: Cycle card, Edit modal, New modal

  • 14
    Kayıt: Otomatik trial subscription oluştur

    RegisterController'da, has_used_trial kontrol et

  • 15
    Cron Job: Günlük yedek temizlik

    Siteye girmeyen kullanıcıları temizle

🗺️ ROADMAP - Sıralama

📋 Yapılacaklar Sırası:
# Görev Dosya Öncelik
1 users tablosuna has_used_trial ekle database/migrations/tenant/ YÜKSEK
2 subscription_plans tablosuna is_trial ekle database/migrations/tenant/ YÜKSEK
3 User.php: isPremiumFresh() ekle app/Models/User.php YÜKSEK
4 TrialExpired event oluştur app/Events/TrialExpired.php YÜKSEK
5 SubscriptionExpired event oluştur app/Events/SubscriptionExpired.php YÜKSEK
6 Listener'lar oluştur (email, bildirim) app/Listeners/ YÜKSEK
7 isPremiumFresh() içine event dispatch app/Models/User.php YÜKSEK
8 Stream endpoint: isPremiumFresh() kullan Modules/Muzibu/.../StreamController.php YÜKSEK
9 Middleware: SubscriptionCheck app/Http/Middleware/ YÜKSEK
10 Admin: Trial plan oluştur Admin Panel (Manuel) ORTA
11 subscription-plan-manage UI temizle ...subscription-plan-manage-component.blade.php ORTA
12 Kayıt: Otomatik trial subscription app/Http/Controllers/Auth/RegisterController.php ORTA
13 Cron job: Yedek temizlik app/Console/Kernel.php DÜŞÜK
14 Test: Tüm akışları test et Manual + Automated ORTA

🎯 SON KARAR

⚡ 3 KATMANLI SİSTEM

1️⃣ Request-Level Fresh Check

Her müzik isteğinde isPremiumFresh() çağır → Cache YOK!

2️⃣ Event-Based System

Subscription bittiyse → Event fırlat → Listener'lar çalışır

3️⃣ Cron Backup

Günlük toplu temizlik (siteye girmeyenler için)

❌ ESKİ SİSTEM

  • isPremium() → 1 saat cache
  • Lazy check → Giriş/çıkış bekler
  • Trial cycle bazında
  • Cron'a bağımlı
  • Sonuç: Aylar boyu ücretsiz!

✅ YENİ SİSTEM

  • isPremiumFresh() → CACHE YOK!
  • Request-level → Her müzik isteğinde
  • Trial ayrı plan (is_trial checkbox)
  • Event-based → Otomatik log/email
  • Sonuç: 0 saniye gecikmeli kontrol!
⚠️ KRİTİK KURALLAR:
  • ASLA cache kullanma stream endpoint'lerde!
  • Her müzik isteğinde isPremiumFresh() çağır!
  • Event dispatch et subscription bittiğinde!
  • Giriş/çıkış bekleme! Kullanıcı 5 yıl girmeyebilir!