Detaylı Analiz ve Çözüm Önerileri
Problem: Muzibu.com.tr sitesinde premium üye olan kullanıcı, sayfa ilk açıldığında "Premium Üye" olarak görünüyor. Ancak herhangi bir şarkıya, albüme veya çalma listesine tıkladığında sistem "Ücretsiz Üye" olarak değiştiriyor ve "Premium'a Geç" uyarısı gösteriyor.
Neden Oluyor: Sistem, kullanıcının premium durumunu iki farklı yerden kontrol ediyor:
Sonuç: Premium üye olan kullanıcı, müzik dinleyemiyor. Sistem sürekli "abonelik gerekiyor" diyor.
🎯 Çözüm: API'deki yanlış kontrol mantığı düzeltilmeli. User model'indeki mevcut kontrolü kullanmalı.
Modules/Muzibu/app/Http/Controllers/Api/SongStreamController.php (512-548. satırlar)public/themes/muzibu/js/player/core/player-core.js (3207-3218. satırlar)resources/views/themes/muzibu/components/sidebar-left.blade.php (138-146. satırlar)app/Models/User.php (379-416. satırlar - isPremium metodu)getSubscriptionData() metodu, User::isPremium() metodunu kullanmak yerine kendi mantığını yazıyor. Bu mantık subscription_expires_at field'ini okurken user model'ini fresh load etmiyor.
users.subscription_expires_at field'i tüm sistemde tek doğru kaynaktır. User::isPremium() metodu bunu doğru kullanıyor, ama API endpoint'teki getSubscriptionData() metodu çelişen sonuç üretiyor.
Auth guard'dan gelen user object'i request başında yükleniyor ve fresh değil. $user->fresh()->subscription_expires_at veya $user->refresh() kullanılmalı.
Blade Template: window.muzibuPlayerConfig.currentUser objesi oluşturuluyor
Backend: User::isPremium() metodu çağrılıyor
Frontend: playSong(32125) → API çağrısı tetikleniyor
Dosya: SongStreamController.php → getSubscriptionData() metodu (512-548. satırlar)
⚠️ HATA: User model'i fresh değil!
Neden? Auth guard'dan gelen user object'i cache'lenmiş/eski. Fresh load edilmiyor!
Dosya: player-core.js (3207-3218. satırlar)
Dosya: sidebar-left.blade.php (138-146. satırlar)
❌ SONUÇ: Kullanıcı "Ücretsiz Üye" olarak gösteriliyor!
❌ "Premium'a Geç" butonu çıkıyor!
Laravel'in auth guard'ı (web/sanctum), request başında kullanıcıyı yüklüyor ve cache'liyor.
Sonraki auth()->user() çağrıları aynı object'i döndürüyor.
Eğer başka bir süreç (observer, command, job) subscription_expires_at field'ini güncellediyse,
mevcut request'teki user object'i bu değişikliği görmüyor.
Sistem zaten User::isPremium() metoduna sahip ve bu metod doğru çalışıyor.
Ama SongStreamController kendi mantığını yazmış (duplicate logic).
Bu iki mantık çelişen sonuçlar üretiyor.
getSubscriptionData() metodu, $user->subscription_expires_at değerini direkt okuyor.
Ama $user->fresh()->subscription_expires_at veya DB::table('users')->where('id', $user->id)->value('subscription_expires_at')
gibi fresh data çekmiyor.
getSubscriptionData() metodunu sil ve doğrudan User::isPremium() metodunu kullan.
Bu metod zaten fresh data çekiyor ve doğru çalışıyor.
Avantajlar:
Mevcut getSubscriptionData() metodunu koruyarak sadece fresh load ekle.
Avantajlar:
Dezavantajlar:
Observer kullanarak subscription değişikliğinde auth cache'i temizle.
Not: Bu çözüm tek başına yeterli değil. Çözüm 1 ile birlikte kullanılmalı.
Bir veri için tek kaynak belirle. Premium kontrolü için User::isPremium() kullan,
başka yerde aynı mantığı yazma.
Auth guard'dan gelen user object'i cache'lenmiş olabilir.
Kritik işlemlerde $user->fresh() veya direkt DB query kullan.
API endpoint'leri için unit test yaz. Premium/Trial kullanıcı senaryolarını test et.
Duplicate logic oluşturmadan önce mevcut metodları kontrol et. Code review sürecinde DRY prensibi ihlallerini yakala.
Claude AI tarafından 9 Ocak 2026 tarihinde hazırlanmıştır.
Muzibu Premium System - Bug Analysis & Solution Report