Kapsamlı Analiz & Tasarım Raporu

Gün + Saat + Sektör
Dinamik İçerik Sistemi

Spotify, Apple Music ve Soundtrack Your Brand'den ilham alan, Muzibu'ya özel kişiselleştirilmiş sayfa üretim motoru

Mevcut Durum Analizi

Sistemde ne var, ne eksik?

Herkes İçin

Ş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.

Hazır Olan
  • 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ı
Eksik Olan
  • Koleksiyon (Collection) tablosu
  • Zaman kuralları motoru
  • Akıllı öneri servisi
  • Dayparting (gün dilimi) sistemi
  • Kullanıcı-sektör bağlantısı
Önceki Raporlar
  • 9 rapor incelendi (ixtif.com)
  • DB tasarımı planlanmış
  • Admin panel mockup'ları var
  • Mimari kararlar verilmiş
  • Hiçbiri kodlanmamış
Teknik Detay
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

Herkes İçin

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.

Spotify
  • 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
Bireysel odaklı, ML ağırlıklı
Apple Music
  • Favorites Mix (haftalık)
  • Ruh hali karışımları (5 tane)
  • New sekmesi (kişisel)
  • Editör + ML hibrit
  • Replay (yıllık dinleme)
Editör kurasyonu + ML, haftalık kadans
Soundtrack
  • Dayparting (6 dilim)
  • Sektör bazlı içerik
  • Multi-zone (bar/lobi)
  • AI Playlist Generator
  • Şube yönetimi
B2B odaklı, sektör + zaman
Teknik Detay Soundtrack Dayparting Modeli (Muzibu'ya en yakın)
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

Herkes İçin

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?

Kullanıcı giriş yapar
Saat + Gün + Sektör algılanır
Koleksiyonlar filtrelenir
Kişisel sayfa oluşur
Veritabanı Tasarımı

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:
Playlist Album Radio Song
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.

Manuel seçim

auto_daypart

Saate göre otomatik. "Sabah Enerjisi" 06-11, "Gece Müzikleri" 21-06 gibi.

Zaman bazlı

auto_sector

Sektöre göre otomatik. Cafe'ye bossa nova, Gym'e cardio, SPA'ya meditasyon.

Sektör bazlı

featured

Öne çıkan, hero bölümü. Kampanya, yeni albüm tanıtımı, özel gün içerikleri.

Kampanya

UX Tasarım: Sayfa Nasıl Görünecek?

Mockup ve layout planı

Herkes İçin

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ü

Sabah Kahvesi
Akustik Seçmeler
Devam et: Bossa Nova
Öne Çıkan

Bu Haftanın Yenileri

42 yeni playlist, 15 yeni albüm

Sabah Enerjisi

Güne enerjik başla

Tümünü Gör
Morning Coffee 42 şarkı
Güne Başlangıç 35 şarkı
Sunrise Acoustic 28 şarkı
Enerjik Pop 50 şarkı
Happy Vibes 31 şarkı

Cafe'niz İçin Seçtiklerimiz

Sektörünüze özel listeler

Tümünü Gör
Cafe Jazz 65 şarkı
Bossa Nova Cafe 48 şarkı
Cozy Afternoon 40 şarkı
Acoustic Cafe 55 şarkı
Lo-fi Study 72 şarkı

Keşfet

Yeni çıkan albümler ve popüler listeler

Yeni Albümler Bu hafta
Popüler Radyolar En çok dinlenen
Türler Tüm kategoriler

Teknik Mimari & Servis Katmanı

Service, Controller, Cache yapısı

Teknik Detay

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ışı

1
HomeController::index()

Kullanıcı bilgisi + sektör bilgisi alınır. Guest ise sektör null.

2
SmartFeedService::getFeed()

Saat, gün, sektör kurallarına göre koleksiyonlar filtrelenir.

3
Greeting oluşturulur

Saate göre: Günaydın (06-12), İyi Günler (12-18), İyi Akşamlar (18-22), İyi Geceler (22-06)

4
View'a gönderilir

$greeting, $feedSections (koleksiyonlar), $staticSections (türler, yeni albümler)

5
Blade render eder

Dinamik koleksiyonlar + sabit bölümler (türler, radyolar) birleştirilerek gösterilir.

Uygulama Yol Haritası

4 fazda tamamlanacak

Herkes İçin

İş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.

F1

Veritabanı & Modeller

Temel altyapı

Öncelik 1
  • muzibu_content_collections migration (central + tenant)
  • muzibu_collection_items migration (central + tenant)
  • ContentCollection model + ilişkiler
  • CollectionItem model (polymorphic)
Gereksinim: Migration onayı (3 aşamalı)
Risk: Düşük (yeni tablo, mevcut yapıya dokunmuyor)
Bağımlılık: Yok
F2

SmartFeedService & Cache

Akıl katmanı

Öncelik 2
  • SmartFeedService — zaman, sektör, görünürlük filtreleri
  • Greeting (selamlama) sistemi
  • Cache stratejisi (30dk blok, 5dk TTL)
  • HomeController entegrasyonu
Gereksinim: Faz 1 tamamlanmış olmalı
Risk: Düşük (mevcut HomeController genişletiliyor)
Test: Tinker ile koleksiyon oluştur, feed'de görünmesini kontrol et
F3

Admin Panel (Livewire)

Yönetim arayüzü

Öncelik 3
  • 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
Gereksinim: Faz 1-2 tamamlanmış olmalı
Pattern: page-manage-component.blade.php referans alınacak
Dikkat: Sekmeler: Temel, Zaman, Sektör, Görünürlük, İçerik
F4

Frontend & Blade

Kullanıcı deneyimi

Öncelik 4
  • 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)
Gereksinim: Faz 1-2-3 tamamlanmış olmalı
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

"Günaydın, Mehmet"
Hero: "Haftaya Enerjik Başla" kampanyası
Sabah Enerjisi (daypart: 06-11)
Cafe'niz İçin: Bossa Nova, Jazz, Akustik
Yeni Albümler, Türler, Radyolar

Cuma Akşam 19:00 — Gym Sahibi

"İyi Akşamlar, Ayşe"
Hero: "Cuma Gecesi Enerjisi"
Akşam Atmosferi (daypart: 17-21)
Gym İçin: HIIT, Beast Mode, Cardio Power
Cuma Özel: New Music Friday

Pazar 14:00 — SPA Sahibi

"İyi Günler, Zeynep"
Hero: "Hafta Sonu Rahatlaması"
Öğleden Sonra Huzuru (daypart: 13:30-17)
SPA İçin: Meditasyon, Masaj, Zen
Hafta Sonu: Weekend Chill koleksiyonu

Giriş Yapmamış Ziyaretçi

"Hoş Geldiniz" (isim yok)
Hero: Genel kampanya/tanıtım
Saate göre daypart koleksiyonu
Sektör filtresi YOK, genel içerik
Premium koleksiyonlar gizli

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.

Faz 1: Tabloları oluştur Faz 2: Servisi yaz Faz 3: Admin panel Faz 4: Frontend