AKILLI SİSTEM 6 Ocak 2026

Akıllı Öneri Sistemi

Dinamik Content Collections - Saat/Sektör/Kullanıcı Bazlı Öneriler

Sistem Konsepti

Hedef: Anasayfada dinamik, akıllı içerik koleksiyonları göstermek. Sadece playlist değil, tüm içerik tiplerini (playlist, album, radio, podcast) kapsayan esnek sistem.

Saatlik İçerik Önerileri
• Sabah saatleri → Enerjik listeler
• Öğle arası → Rahatlatıcı müzikler
• Akşam → Atmosferik içerik
• Özel günler → Tematik öneriler
Zaman Bazlı Öneriler
• Günün saatine göre değişen
• Haftanın gününe göre (Pzt-Paz)
• Mevsime göre
• Özel tarihlere göre
Sektör Bazlı Öneriler
• Cafe → Sabah kahve müzikleri
• Restaurant → Akşam yemeği ambiyansı
• Gym → Antrenman motivasyonu
• SPA → Relax müzikleri
Kullanıcı Bazlı Öneriler
• Favorilere göre
• Dinleme geçmişine göre
• Abonelik tipine göre (Premium/Free)
• Profil sektörüne göre

Önerilen Mimari: Content Collections

muzibu_content_collections

Field
Type
Açıklama
collection_id
BIGINT PK
Unique ID
name
JSON
Koleksiyon adı (çoklu dil)
slug
JSON
URL-friendly slug
type
VARCHAR
time_based, sector_based, mood_based, event_based, editorial
icon
VARCHAR
FontAwesome icon class
color
VARCHAR
Hex color code
display_rules
JSON
Görünürlük kuralları (AKILLI!)
visibility_conditions
JSON
Koşullu gösterim (AKILLI!)
priority
INT
Görünüm sırası (0-100)
is_active
BOOLEAN
Aktif/Pasif
created_at, updated_at
TIMESTAMP
Zaman damgaları

muzibu_collection_items (Polymorphic Pivot)

collection_id BIGINT FK
item_type VARCHAR (playlist, album, radio, podcast)
item_id BIGINT
position INT (sıralama)
timestamps

display_rules (JSON)

Saat Bazlı:
{
  "time_range": {
    "start": "06:00",
    "end": "12:00"
  },
  "days": ["Mon", "Tue", "Wed", "Thu", "Fri"],
  "timezone": "Europe/Istanbul"
}
Sektör Bazlı:
{
  "sectors": [1, 2, 5],
  "sector_tags": ["cafe", "restaurant"]
}
Tarih Bazlı:
{
  "date_range": {
    "start": "2026-01-01",
    "end": "2026-01-31"
  },
  "special_dates": ["2026-12-31"]
}

visibility_conditions (JSON)

Kullanıcı Durumu:
{
  "auth_required": true,
  "subscription_types": ["premium", "corporate"],
  "min_subscription_days": 7
}
Kullanıcı Profili:
{
  "user_sectors": [1, 2],
  "user_tags": ["cafe_owner", "restaurant_owner"]
}
Davranış Bazlı:
{
  "min_listening_hours": 10,
  "favorite_genres": ["rock", "jazz"],
  "recently_played": true
}

Örnek Kullanım Senaryoları

Sabah Enerjisi

06:00-12:00 arası gösterilir

{
  "name": {"tr": "☀️ Güne Enerjik Başla"},
  "type": "time_based",
  "display_rules": {
    "time_range": {"start": "06:00", "end": "12:00"},
    "days": ["Mon","Tue","Wed","Thu","Fri"]
  },
  "visibility_conditions": {
    "auth_required": false
  },
  "priority": 90
}
İçerik: 15 playlist (Energetic Rock, Morning Coffee Jazz, Workout Hits...)

Cafe Sabah Müzikleri

Cafe sektörü + 07:00-11:00

{
  "name": {"tr": "☕ Kahve Keyfi"},
  "type": "sector_based",
  "display_rules": {
    "sectors": [1],
    "time_range": {"start": "07:00", "end": "11:00"}
  },
  "visibility_conditions": {
    "user_sectors": [1]
  },
  "priority": 95
}
İçerik: 10 playlist (Bossa Nova Morning, Acoustic Cafe, Jazz Breakfast...)

Hafta Sonu Partileri

Cumartesi-Pazar akşamları

{
  "name": {"tr": "🎉 Hafta Sonu Eğlencesi"},
  "type": "time_based",
  "display_rules": {
    "days": ["Sat", "Sun"],
    "time_range": {"start": "20:00", "end": "02:00"}
  },
  "visibility_conditions": {},
  "priority": 85
}
İçerik: 20 playlist (Dance Hits, House Party, Top 40...)

Premium Özel Koleksiyon

Sadece premium üyeler

{
  "name": {"tr": "👑 Premium Seçkiler"},
  "type": "editorial",
  "display_rules": {},
  "visibility_conditions": {
    "auth_required": true,
    "subscription_types": ["premium"]
  },
  "priority": 100
}
İçerik: High-quality exclusive playlists, early releases

Backend Logic (PHP)

ContentCollectionService.php

class ContentCollectionService
{
    public function getActiveCollections($user = null): Collection
    {
        $now = now();
        $dayOfWeek = $now->format('D'); // Mon, Tue...
        $currentTime = $now->format('H:i'); // 14:30

        return ContentCollection::where('is_active', true)
            ->get()
            ->filter(function($collection) use ($user, $dayOfWeek, $currentTime) {
                // Display Rules Check
                if (!$this->checkDisplayRules($collection, $dayOfWeek, $currentTime)) {
                    return false;
                }

                // Visibility Conditions Check
                if (!$this->checkVisibilityConditions($collection, $user)) {
                    return false;
                }

                return true;
            })
            ->sortByDesc('priority');
    }

    private function checkDisplayRules($collection, $dayOfWeek, $currentTime): bool
    {
        $rules = $collection->display_rules;

        // Time range check
        if (isset($rules['time_range'])) {
            if ($currentTime < $rules['time_range']['start'] ||
                $currentTime > $rules['time_range']['end']) {
                return false;
            }
        }

        // Days check
        if (isset($rules['days']) && !in_array($dayOfWeek, $rules['days'])) {
            return false;
        }

        // Sector check
        if (isset($rules['sectors']) && $user && $user->primary_sector_id) {
            if (!in_array($user->primary_sector_id, $rules['sectors'])) {
                return false;
            }
        }

        return true;
    }

    private function checkVisibilityConditions($collection, $user): bool
    {
        $conditions = $collection->visibility_conditions;

        // Auth required
        if (isset($conditions['auth_required']) && $conditions['auth_required']) {
            if (!$user) return false;
        }

        // Subscription type
        if (isset($conditions['subscription_types']) && $user) {
            $activeSubscription = $user->subscriptions()
                ->where('status', 'active')
                ->first();

            if (!$activeSubscription ||
                !in_array($activeSubscription->subscription_type, $conditions['subscription_types'])) {
                return false;
            }
        }

        return true;
    }
}

HomeController.php

public function index(ContentCollectionService $service)
{
    $user = auth()->user();

    // Akıllı koleksiyonları getir
    $collections = $service->getActiveCollections($user);

    // Her koleksiyon için içerikleri yükle
    $collections = $collections->map(function($collection) {
        $collection->load('items');
        return $collection;
    });

    return view('themes.muzibu.home', compact('collections'));
}

Frontend Görünüm

Anasayfa (09:30 Salı sabahı, Cafe sektöründen giriş yapmış kullanıcı)

Günaydın! ☀️

İşte sana özel sabah enerjisi

☕ Kahve Keyfi

Cafe için özel

☀️ Güne Enerjik Başla

Hafta içi sabahlar

⭐ Editör Seçkisi

Her zaman
Akıllı Filtreleme: Kullanıcının sektörü (Cafe) + Mevcut saat (09:30) + Gün (Salı) bazında otomatik filtrelenmiş içerik gösteriliyor!

Sistem Avantajları

Dinamik & Esnek
  • • Kod değişikliği yok, admin panelden yönetim
  • • Yeni koleksiyon ekle/sil/düzenle
  • • A/B test için farklı kurallar dene
  • • Saat/gün/sezon bazlı otomatik değişim
Kişiselleştirme
  • • Kullanıcı sektörüne göre özel içerik
  • • Abonelik tipine göre farklı gösterim
  • • Dinleme geçmişine göre öneri
  • • Favorilere göre akıllı öneri
İş Stratejisi
  • • Premium içerik sadece premium'a göster
  • • Yeni kullanıcılara trial koleksiyonları
  • • Sadık kullanıcılara özel seçkiler
  • • Sektörel kampanyalar (Cafe'lere özel)
Teknik Avantaj
  • • Polymorphic: Playlist, Album, Radio hepsi
  • • Cache edilebilir (koleksiyon başına)
  • • JSON rules: Sonsuz kombinasyon
  • • Admin panel kolay yönetim

Uygulama Planı (Adım Adım)

1

Migration Oluştur

  • muzibu_content_collections tablosu
  • muzibu_collection_items pivot tablo
  • • Tenant migration klasörüne ekle
2

Model & İlişkiler

  • ContentCollection model (HasTranslations trait)
  • items() polymorphic ilişki
  • • Accessor/Mutator için JSON cast
3

Service Class

  • ContentCollectionService oluştur
  • getActiveCollections() method
  • • Display rules & visibility conditions logic
4

Admin Panel

  • • Livewire component (CRUD)
  • • JSON editor için Alpine.js kullan
  • • Preview button (kullanıcı gözüyle göster)
5

Frontend (Anasayfa)

  • • HomeController'da service kullan
  • • Blade component: @foreach($collections)
  • • Scroll yaparak kategoriler göster (Spotify-style)
6

Seeder & Test Data

  • • Demo koleksiyonlar oluştur (Sabah, Öğle, Akşam)
  • • Her koleksiyona 10-15 playlist ekle
  • • Farklı kurallarla test et