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_collectionstablosu - •
muzibu_collection_itemspivot tablo - • Tenant migration klasörüne ekle
2
Model & İlişkiler
- •
ContentCollectionmodel (HasTranslations trait) - •
items()polymorphic ilişki - • Accessor/Mutator için JSON cast
3
Service Class
- •
ContentCollectionServiceoluş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