Cozum Plani 9 Ocak 2026

Premium Kontrolu: Tek Kaynak Mimarisi

users.subscription_expires_at = Tek Gercek Kaynak

Basit Anlatim

Sorun: Sistemde premium kontrolu icin 6 farkli fonksiyon ve 2 farkli kavram (premium + trial) var. Bu tutarsizlik yaratiyor.

Cozum: TEK bir kaynak: users.subscription_expires_at

Kural: Bu tarih gelecekte ise = Premium. Gecmiste veya NULL ise = Ucretsiz. Trial ayrimi yok.

Mevcut Durum (Kaos)

PHP Fonksiyonlari (User Model)

isPremium()

3 katmanli kontrol: model + fresh DB + subscriptions fallback

isTrialActive()

Subscriptions tablosundan trial kontrolu

isPremiumOrTrial()

isPremium() || isTrialActive()

API Fonksiyonlari

getSubscriptionData()

SongStreamController - Sadece model degerine bakiyor, fresh DB yok

JavaScript Degiskenleri

currentUser.is_premium
currentUser.is_trial

Her yerde is_premium || is_trial kontrolu yapiliyor = 2 degisken

Blade Kullanimi (Tutarsiz)

Dosya Kullanilan Metod
app.blade.php:716 isPremiumOrTrial()
sidebar.blade.php:58,71,77 isPremium()
header.blade.php:685 isPremiumOrTrial()
dashboard.blade.php:35 isPremiumOrTrial()
sidebar-left.blade.php (JS) currentUser?.is_premium

Yeni Mimari (Tek Kaynak)

Tek Gercek Kaynak

users.subscription_expires_at

Gelecekte = Premium

NULL veya Gecmiste = Ucretsiz

Trial ayrimi YOK - subscription_expires_at her seyi kapsar

Yeni PHP Yapisi

// app/Models/User.php

/**
 * Premium mi? TEK KAYNAK: subscription_expires_at
 */
public function isPremium(): bool
{
    // Tenant kontrolu
    if (!$this->isMuzibuTenant()) {
        return false;
    }

    // 1. Model degeri (hizli)
    if ($this->subscription_expires_at && $this->subscription_expires_at->isFuture()) {
        return true;
    }

    // 2. Fresh DB kontrolu (model stale olabilir)
    $freshExpiry = \DB::table('users')
        ->where('id', $this->id)
        ->value('subscription_expires_at');

    return $freshExpiry && \Carbon\Carbon::parse($freshExpiry)->isFuture();
}

// isTrialActive() - KALDIRILDI
// isPremiumOrTrial() - KALDIRILDI (isPremium() kullan)

Yeni API Yapisi

// SongStreamController.php

protected function getSubscriptionData($user): array
{
    if (!$user) {
        return ['is_premium' => false, 'subscription_ends_at' => null];
    }

    // Fresh DB kontrolu (model stale olabilir)
    $expiresAt = \DB::table('users')
        ->where('id', $user->id)
        ->value('subscription_expires_at');

    $isPremium = $expiresAt && \Carbon\Carbon::parse($expiresAt)->isFuture();

    return [
        'is_premium' => $isPremium,
        'subscription_ends_at' => $expiresAt,
        // is_trial KALDIRILDI
    ];
}

Yeni JavaScript Yapisi

// app.blade.php - muzibuPlayerConfig
currentUser: {
    id: {{ $user->id }},
    name: "{{ $user->name }}",
    is_premium: {{ $user->isPremium() ? 'true' : 'false' }},
    subscription_ends_at: "{{ $user->subscription_expires_at?->toIso8601String() }}"
    // is_trial KALDIRILDI
}

// Tum JS dosyalarinda:
// ESKI: currentUser?.is_premium || currentUser?.is_trial
// YENI: currentUser?.is_premium

Degistirilecek Dosyalar

1. Backend (PHP)

Dosya Degisiklik
app/Models/User.php isPremium() sadele, isTrialActive() deprecated, isPremiumOrTrial() kaldir
SongStreamController.php getSubscriptionData() fresh DB ekle, is_trial kaldir

2. Blade Templates

Dosya Degisiklik
layouts/app.blade.php:716 isPremiumOrTrial() -> isPremium()
components/header.blade.php:685,759 isPremiumOrTrial() -> isPremium()
dashboard.blade.php:35 isPremiumOrTrial() -> isPremium()
partials/dashboard-content.blade.php:52 isPremiumOrTrial() -> isPremium()
components/sidebar-left.blade.php is_trial kontrollerini kaldir

3. JavaScript

Dosya Degisiklik
player-core.js is_premium || is_trial -> is_premium (20+ yer)
player-core.js:3208-3212 is_trial guncelleme kodunu kaldir
play-helpers.js is_premium || is_trial -> is_premium (5 yer)

Ozet

Kaldirilacaklar

  • - isTrialActive() metodu
  • - isPremiumOrTrial() metodu
  • - is_trial degiskeni (JS)
  • - is_trial API response
  • - Subscriptions tablosu fallback

Kalacaklar

  • + isPremium() metodu (sadelestirilerek)
  • + is_premium degiskeni (JS)
  • + users.subscription_expires_at (TEK KAYNAK)
  • + Fresh DB kontrolu

Uygulama Sirasi

  1. 1 User.php: isPremium() sadele, diger metodlari deprecated yap
  2. 2 SongStreamController.php: getSubscriptionData() fresh DB ekle, is_trial kaldir
  3. 3 app.blade.php: is_trial kaldir, isPremiumOrTrial -> isPremium
  4. 4 player-core.js: is_trial kontrollerini kaldir, sadece is_premium kullan
  5. 5 Diger Blade/JS: Tum is_trial referanslarini temizle
  6. 6 Cache temizle: php artisan cache:clear && npm run prod