Mevcut Durum Analizi
Sistemde ne var, ne eksik?
Şu an Muzibu'nun anasayfası statik (sabit) bir yapıda. Sabah 7'de giren kullanıcı ile gece 11'de giren kullanıcı aynı içeriği görüyor. Bir kafe sahibi ile gym sahibi de aynı listeyi görüyor. Hedefimiz: "Pazartesi sabahı kafe sahibine kahve müzikleri, Cuma gecesi gym sahibine parti müzikleri" otomatik göstermek.
- Sektör sistemi (Cafe, Gym, SPA...)
- Tür/Genre sistemi
- Playlist/Albüm/Radyo yapısı
- Spotify tarzı ana sayfa şablonu
- Generic Tag altyapısı
- Koleksiyon (Collection) tablosu
- Zaman kuralları motoru
- Akıllı öneri servisi
- Dayparting (gün dilimi) sistemi
- Kullanıcı-sektör bağlantısı
- 9 rapor incelendi (ixtif.com)
- DB tasarımı planlanmış
- Admin panel mockup'ları var
- Mimari kararlar verilmiş
- Hiçbiri kodlanmamış
| Bileşen | Dosya/Konum | Durum | Not |
|---|---|---|---|
Sector Model |
Modules/Muzibu/App/Models/Sector.php |
Hazır | Tam ilişkili, Meilisearch destekli |
SectorService |
Modules/Muzibu/App/Services/SectorService.php |
Hazır | CRUD + cache |
HomeController |
Modules/Muzibu/App/Http/Controllers/Front/HomeController.php |
Güncellenecek | Şu an statik sorgular, dinamik hale geçecek |
| Ana Sayfa View | resources/views/themes/muzibu/index.blade.php |
Güncellenecek | Genre, Playlist, Album, Radio, Sector bölümleri var |
Tag Model (Generic) |
app/Models/Tag.php |
Hazır | Polymorphic taggables pivot, Muzibu modelleri henüz kullanmıyor |
content_collections |
- | Yok | Migration + Model + Service oluşturulacak |
SmartRecommendationService |
- | Yok | Zaman + Sektör + Kullanıcı filtresi yapacak |
playlist_categories |
- | Yok | "Güne Başlangıç", "Gece Müzikleri" gibi senaryo kategorileri |
Benchmark: Dünya Ne Yapıyor?
Spotify, Apple Music, Soundtrack Your Brand
Spotify sabah açıldığında "Günaydın" der ve kahve müzikleri gösterir. Akşam "İyi Akşamlar" der ve chill müzikler gelir. Apple Music haftalık "Sana Özel" karışımları yapar. Soundtrack (B2B müzik servisi) ise işletme sahiplerine saate göre otomatik müzik değiştirir: sabah sakin, öğle enerjik, akşam lounge. Biz de benzer ama Muzibu'ya özel bir sistem yapacağız.
- Saate göre selamlama
- Daylist (günde 3-4x değişir)
- Daily Mix 1-6
- New Music Friday
- "Çünkü X dinledin"
- Jump Back In
- Favorites Mix (haftalık)
- Ruh hali karışımları (5 tane)
- New sekmesi (kişisel)
- Editör + ML hibrit
- Replay (yıllık dinleme)
- Dayparting (6 dilim)
- Sektör bazlı içerik
- Multi-zone (bar/lobi)
- AI Playlist Generator
- Şube yönetimi
| Zaman Dilimi | Saat | Enerji | Cafe Örneği | Gym Örneği | Otel Örneği |
|---|---|---|---|---|---|
| Sabah Açılış | 06:00 - 09:00 | Sakin | Akustik, Ambient | Warm-up, Stretching | Lobby Ambient |
| Sabah | 09:00 - 11:30 | Hafif | Bossa Nova, Jazz | Cardio Başlangıç | Pool Chill |
| Öğle Pik | 11:30 - 13:30 | Enerjik | Upbeat Pop, Indie | HIIT, Beast Mode | Restaurant Lounge |
| Öğleden Sonra | 13:30 - 17:00 | Orta | Soft Rock, Soul | Steady Workout | Spa Relaxation |
| Akşam | 17:00 - 21:00 | Atmosferik | Jazz, Nu-Soul | Cool Down, Yoga | Bar/Lounge |
| Gece | 21:00 - 06:00 | Chill/Deep | Lo-fi, Ambient | Late Night Gym | Night Club |
Önerilen Mimari: "Muzibu Smart Feed"
9 raporun sentezi + modern yaklaşım
Sisteme "Koleksiyon" denen akıllı kutular ekliyoruz. Her kutunun kuralları var: "Sabah 7-11 arası, sadece Cafe sektörüne, hafta içi göster" gibi. Admin panelinden bu kutuları oluşturuyorsunuz, içine playlist/albüm/radyo atıyorsunuz. Kullanıcı siteye girdiğinde sistem otomatik olarak o anki saate, güne ve sektöre göre hangi kutuların gösterileceğine karar veriyor.
Nasıl Çalışır?
muzibu_content_collections
Ana koleksiyon tablosu (her satır = bir "akıllı kutu")
collection_id BIGINT PK AUTO
title JSON -- {"tr": "Sabah Enerjisi", "en": "Morning Energy"}
slug JSON
description JSON
type ENUM -- curated, auto_daypart, auto_sector, featured
icon VARCHAR(50) -- fas fa-coffee
color VARCHAR(20) -- #f59e0b
media_id BIGINT NULL -- Kapak görseli
-- Kurallar (JSON)
display_rules JSON -- Saat, gün, tarih kuralları
sector_rules JSON -- Hangi sektörlere gösterilecek
visibility_rules JSON -- Kullanıcı koşulları
priority INT DEFAULT 0 -- Sıralama önceliği
is_active BOOLEAN
is_featured BOOLEAN -- Hero/öne çıkan
cache_ttl INT DEFAULT 300
created_at, updated_at, deleted_at
muzibu_collection_items
Koleksiyon içerikleri (polymorphic, sıralanabilir)
id BIGINT PK AUTO
collection_id BIGINT FK -- content_collections'a bağlı
-- Polymorphic
itemable_type VARCHAR -- Playlist, Album, Radio, Song
itemable_id BIGINT
position INT DEFAULT 0 -- Sürükle-bırak sırası
is_active BOOLEAN
created_at, updated_at
Polymorphic Desteklenen Tipler:
display_rules Örneği
{
"time_slots": [
{
"start": "06:00",
"end": "11:00",
"label": "Sabah"
}
],
"days": [1,2,3,4,5],
"date_range": {
"from": null,
"to": null
},
"is_always": false
}
sector_rules Örneği
{
"mode": "include",
"sector_ids": [1, 3],
"show_to_all": false,
"labels": {
"1": "Cafe",
"3": "SPA"
}
}
visibility_rules Örneği
{
"auth_required": true,
"subscription": ["premium", "corporate"],
"min_listening_hours": 0,
"is_new_user": false
}
Koleksiyon Tipleri
curated
Editör tarafından manuel seçilmiş. "En İyi Jazz Playlistleri", "Staff Picks" gibi.
auto_daypart
Saate göre otomatik. "Sabah Enerjisi" 06-11, "Gece Müzikleri" 21-06 gibi.
auto_sector
Sektöre göre otomatik. Cafe'ye bossa nova, Gym'e cardio, SPA'ya meditasyon.
featured
Öne çıkan, hero bölümü. Kampanya, yeni albüm tanıtımı, özel gün içerikleri.
UX Tasarım: Sayfa Nasıl Görünecek?
Mockup ve layout planı
Kullanıcı giriş yaptığında şu sırayla bölümler görecek. Sabah/Akşam selamlaması, öne çıkan koleksiyon, saate uygun playlistler, sektöre özel içerik, genel keşif bölümleri.
Günaydın, Ahmet
Pazartesi, 23 Şubat 2026 • Cafe sektörü
Bu Haftanın Yenileri
42 yeni playlist, 15 yeni albüm
Sabah Enerjisi
Güne enerjik başla
Cafe'niz İçin Seçtiklerimiz
Sektörünüze özel listeler
Keşfet
Yeni çıkan albümler ve popüler listeler
Teknik Mimari & Servis Katmanı
Service, Controller, Cache yapısı
SmartFeedService — Ana Motor
class SmartFeedService
{
// Ana metod: Kullanıcı için kişisel feed oluştur
public function getFeed(?User $user, ?int $sectorId = null): array
{
$now = now();
$dayOfWeek = $now->dayOfWeekIso; // 1=Pzt, 7=Paz
$hour = $now->format('H:i');
return Cache::remember(
$this->cacheKey($user, $sectorId, $hour),
300, // 5 dakika cache
fn() => $this->buildFeed($user, $sectorId, $now)
);
}
private function buildFeed($user, $sectorId, $now): array
{
$collections = ContentCollection::active()
->ordered()
->with(['items.itemable'])
->get();
return $collections
->filter(fn($c) => $this->matchesTimeRules($c, $now))
->filter(fn($c) => $this->matchesSectorRules($c, $sectorId))
->filter(fn($c) => $this->matchesVisibility($c, $user))
->map(fn($c) => $this->formatSection($c))
->values()
->toArray();
}
private function matchesTimeRules($collection, $now): bool
{
$rules = $collection->display_rules;
// is_always = true ise her zaman göster
if ($rules['is_always'] ?? false) return true;
// Gün kontrolü
$days = $rules['days'] ?? [];
if (!empty($days) && !in_array($now->dayOfWeekIso, $days)) {
return false;
}
// Saat kontrolü
foreach ($rules['time_slots'] ?? [] as $slot) {
if ($now->between(
$now->copy()->setTimeFromTimeString($slot['start']),
$now->copy()->setTimeFromTimeString($slot['end'])
)) return true;
}
return empty($rules['time_slots']); // Saat kuralı yoksa her saat göster
}
}
Cache Stratejisi
- Cache key:
feed:{userId}:{sectorId}:{hourBlock} - hourBlock: Saati 30dk bloklamaya yuvarla (07:00-07:29 = "07:00")
- TTL: 5 dakika (300s) — koleksiyon sayısı az, sorgu hızlı
- Invalidation: Admin koleksiyon düzenlediğinde tüm feed cache temizlenir
Dosya Yapısı
Modules/Muzibu/
├── App/
│ ├── Models/
│ │ ├── ContentCollection.php
│ │ └── CollectionItem.php
│ ├── Services/
│ │ └── SmartFeedService.php
│ ├── Http/Controllers/
│ │ ├── Admin/CollectionController.php
│ │ └── Front/HomeController.php ← güncelle
│ └── Http/Livewire/
│ └── CollectionManageComponent.php
├── database/migrations/
│ ├── xxx_create_content_collections.php
│ ├── tenant/xxx_create_content_collections.php
│ ├── xxx_create_collection_items.php
│ └── tenant/xxx_create_collection_items.php
└── resources/views/
└── admin/collections/
├── index.blade.php
└── manage.blade.php
Sayfa Oluşturma Akışı
Kullanıcı bilgisi + sektör bilgisi alınır. Guest ise sektör null.
Saat, gün, sektör kurallarına göre koleksiyonlar filtrelenir.
Saate göre: Günaydın (06-12), İyi Günler (12-18), İyi Akşamlar (18-22), İyi Geceler (22-06)
$greeting, $feedSections (koleksiyonlar), $staticSections (türler, yeni albümler)
Dinamik koleksiyonlar + sabit bölümler (türler, radyolar) birleştirilerek gösterilir.
Uygulama Yol Haritası
4 fazda tamamlanacak
İşi 4 parçaya bölüyoruz. Önce veritabanı tabloları, sonra arka plan servisi, ardından admin paneli (koleksiyonları yöneteceğiniz yer), en son kullanıcıya görünen sayfa. Her faz kendi başına çalışır ve test edilebilir.
Veritabanı & Modeller
Temel altyapı
-
muzibu_content_collectionsmigration (central + tenant) -
muzibu_collection_itemsmigration (central + tenant) -
ContentCollectionmodel + ilişkiler -
CollectionItemmodel (polymorphic)
Risk: Düşük (yeni tablo, mevcut yapıya dokunmuyor)
Bağımlılık: Yok
SmartFeedService & Cache
Akıl katmanı
-
SmartFeedService— zaman, sektör, görünürlük filtreleri - Greeting (selamlama) sistemi
- Cache stratejisi (30dk blok, 5dk TTL)
-
HomeControllerentegrasyonu
Risk: Düşük (mevcut HomeController genişletiliyor)
Test: Tinker ile koleksiyon oluştur, feed'de görünmesini kontrol et
Admin Panel (Livewire)
Yönetim arayüzü
-
CollectionComponent— Liste sayfası (Tabler grid) -
CollectionManageComponent— 5 sekmeli form - Sortable.js sürükle-bırak içerik seçimi
- JSON kural oluşturucu (saat/gün/sektör picker)
- Gerçek zamanlı önizleme
Pattern: page-manage-component.blade.php referans alınacak
Dikkat: Sekmeler: Temel, Zaman, Sektör, Görünürlük, İçerik
Frontend & Blade
Kullanıcı deneyimi
-
index.blade.php— Dinamik feed bölümleri - Selamlama + hızlı erişim grid
- Featured hero kartı
- Horizontal scroll carousel'ler
- Sektör sayfasına entegrasyon
- Radyo sayfasına entegrasyon (gelecek)
Kullanılacak yerler: Anasayfa, Sektör detay, Radyo (gelecek)
Responsive: Mobil (2 kart), Tablet (3), Desktop (5-6)
Önceki Raporlar vs Bu Tasarım
| Özellik | Önceki Raporlar (Ocak 2026) | Bu Tasarım (Şubat 2026) |
|---|---|---|
| DB Tabloları | 2 tablo + playlist_categories | 2 tablo yeterli (kategori JSON'da) |
| Koleksiyon Tipi | Tek tip | 4 tip: curated, auto_daypart, auto_sector, featured |
| Saat Sistemi | Genel (sadece start/end) | Dayparting (6 dilim, Soundtrack modeli) |
| Selamlama | Yok | Spotify tarzı: Günaydın/İyi Akşamlar + isim |
| Featured/Hero | Yok | Kampanya & öne çıkan koleksiyon kartı |
| Cache | Genel öneri | 30dk blok + user/sector/hour key |
| Admin Panel | Mockup var, kod yok | Livewire + 5 sekmeli form + sortable |
| Uygulama Durumu | Tamamen plan aşamasında | 4 fazlı yol haritası, kodlanmaya hazır |
Gerçek Dünya Senaryoları
Sistem farklı durumlarda ne gösterir?
Pazartesi Sabah 08:30 — Cafe Sahibi
Cuma Akşam 19:00 — Gym Sahibi
Pazar 14:00 — SPA Sahibi
Giriş Yapmamış Ziyaretçi
Sonraki Adım
Bu tasarımı beğendiyseniz, Faz 1'den (veritabanı & modeller) başlayabiliriz. Migration onayı alındıktan sonra adım adım ilerleriz. Herhangi bir bölümde değişiklik isterseniz belirtin.