Muzibu, tenant 1001 üzerinde çalışan bir müzik streaming platformudur. Sistem, 3 farklı kullanıcı tipi için farklı dinleme deneyimleri sunar:
Sistem, User modelindeki isPremium() metodu ile kullanıcının premium durumunu kontrol eder. Bu method, subscriptions tablosunda aktif bir abonelik olup olmadığını sorgualar.
Tanım: Kayıt olmadan siteye erişen ziyaretçiler. Authentication sistemi ile ilişkilendirilmemiş kullanıcılar.
Frontend Davranışı:
SongStreamController::stream() methodu, auth()->user() kontrolü yapar. Guest için null döner ve status: preview response döndürür.
Tanım: Kayıt olmuş ancak premium aboneliği olmayan kullanıcılar. Email/şifre ile giriş yapmış durumda.
Eskiden günde 3 şarkı limiti vardı. Kullanıcı 60+ saniye dinlediği her şarkı sayılırdı. Bu kural SongStreamController içinde comment out edilmiş durumda.
canPlaySong() ve getRemainingPlays() methodları hala mevcut ancak kullanılmıyor. Backend şu an tüm üyelere 30 saniye preview veriyor.
Frontend Davranışı:
Tanım: Aktif subscription olan kullanıcılar. İki tip premium durumu var:
Frontend Davranışı:
User::isPremium() methodu, 1 saatlik cache ile optimize edilmiş. Her stream request'inde database'ye gitmeden cache'den kontrol eder. Bu sayede performans optimize edilmiş.
| Özellik | 👤 Guest | 🔐 Üye | ⭐ Premium |
|---|---|---|---|
| Tam Dinleme | ✗ 30 saniye | ✗ 30 saniye | ✓ Sınırsız |
| Analytics | ✗ Kayıt yok | ✓ Kayıt var | ✓ Detaylı |
| Favoriler | ✗ | ✓ | ✓ |
| Playlist Oluşturma | ✗ | ✓ | ✓ |
| Günlük Limit | ✓ Sınırsız preview | ✓ Sınırsız preview | ✓ Sınırsız |
| Stream Kalitesi | MP3 (standart) | MP3 (standart) | HLS (adaptif) |
| Rate Limit | 30 req/dakika | 120 req/dakika | 300 req/dakika |
Guest kullanıcılar için track-progress endpoint'i auth:sanctum middleware ile korunuyor. Guest'ler dinleme kaydı oluşturamazlar.
Premium üyelik, subscriptions tablosunda tutulur. Her subscription bir kullanıcıya (user_id) ve bir plana (plan_id) bağlıdır.
Kontrol Sırası:
Premium kontrolü, her stream request'inde çağrıldığı için 1 saatlik cache kullanılıyor. Bu sayede database yükü azaltılıyor. Ancak bu, kullanıcı premium'a geçtikten sonra en fazla 1 saat gecikmeli güncelleme olabileceği anlamına gelir.
Çözüm: Subscription oluşturulunca/güncellenince cache temizlenir.
Premium kullanıcılar için HLS streaming kullanılır. HLS, müzik dosyasını küçük parçalara böler ve adaptif bitrate ile kullanıcıya sunar. Bu sayede:
Guest ve normal üyeler için MP3 direct stream kullanılır. Basit HTTP stream ile müzik servis edilir. Frontend, 30. saniyede otomatik durdurur.
Tüm şarkıları önceden HLS'e çevirmek hem disk alanı hem de işlemci açısından maliyetli. Lazy loading sayesinde, sadece gerçekten dinlenen şarkılar dönüştürülür.
Tüm stream URL'leri SignedUrlService ile imzalanır. Bu sayede:
| Kullanıcı Tipi | Request Limiti | Açıklama |
|---|---|---|
| 👤 Guest | 30 req/dakika | Bot koruması ve sunucu yükünü azaltma |
| 🔐 Üye | 120 req/dakika | Normal kullanım için yeterli |
| ⭐ Premium | 300 req/dakika | Yüksek kalite stream için yeterli |
Kullanıcı rate limit'i aşarsa, 429 Too Many Requests hatası döner. Frontend, bu durumda kullanıcıya uygun mesaj gösterir ve 1 dakika bekler.