⚙️ Settings Management Yapısı
🗂️ Veritabanı Modelleri
SettingGroup (Central DB)
Setting grupları - Tüm tenant'lar için ortak tanımlar
Tablo: settings_groups (Central DB)
Örnek: Blog - Yapay Zeka (ID: 18)
Kolonlar: id, parent_id, name, slug, description, icon, layout (JSON)
Setting (Central DB)
Ayar tanımları - Hangi ayarlar var, tipleri ne?
Tablo: settings (Central DB)
Kolonlar: id, group_id, label, key, type, default_value
Örnek: blog_ai_enabled (checkbox), blog_ai_daily_count (number)
SettingValue (Tenant DB)
Ayar değerleri - Her tenant'ın kendi ayar değerleri
Tablo: settings_values (Tenant DB - tenant_2_db, tenant_3_db vb.)
Kolonlar: id, setting_id, value
Örnek: setting_id=130, value=1 (blog_ai_enabled=true)
📊 Blog AI Settings (Group ID: 18)
✅ Blog AI Sistemi Aktif
blog_ai_enabled
Tip: Checkbox (boolean)
Varsayılan: false
Kullanım: Sistem kapalıysa cron çalışmayacak
📊 Günlük Blog Sayısı
blog_ai_daily_count
Tip: Number (1-100 arası)
Varsayılan: 24
Kullanım: Bu sayıya göre frekans hesaplanacak
🚀 Otomatik Yayınlama
blog_ai_auto_publish
Tip: Checkbox (boolean)
Varsayılan: true
Kullanım: false ise blog draft olarak kaydedilecek
🎯 Konu Kaynağı
blog_ai_topic_source
Tip: Select (manuel | otomatik | karma)
Kullanım: Draft üretim stratejisini belirler
📝 Manuel Konu Listesi
blog_ai_manual_topics
Tip: Textarea (çok satırlı)
Kullanım: Her satır bir ana konu - sistem genişletir
👔 Sadece Profesyonel Stil
blog_ai_professional_only
Tip: Checkbox (boolean)
Kullanım: true ise sadece profesyonel/uzman ton kullanılır (B2B)
🎯 Yeni Sistem Mimarisi
✨ Hedefler
-
Settings-Driven: Tüm ayarlar settings'den okunacak
-
Tenant-Aware: Her tenant farklı frekans ve ayarlara sahip
-
Dinamik Frekans: Günlük blog sayısına göre otomatik hesaplama
-
Auto-Publish Control: Ayara göre published/draft olarak kaydetme
-
Enable/Disable: Tenant istediği zaman sistemi pasif yapabilir
🔄 Yeni Cron Akışı
1
Schedule Check - Her Dakika
Laravel scheduler her dakika çalışır (cron: * * * * *)
↓
2
Tenant Loop - Tüm Aktif Tenant'ları Tara
Her tenant için ayrı ayrı kontrol yap
↓
3
Settings Check - Tenant Ayarları
• blog_ai_enabled = true mı?
• blog_ai_daily_count kaç?
• blog_ai_auto_publish aktif mi?
↓
4
Frekans Hesaplama - Dinamik
Günlük blog sayısına göre ne kadar sıklıkla çalışacağını hesapla
Formül: 24 saat / daily_count = saat aralığı
↓
5
Time Check - Şimdi Sırası mı?
Son çalıştırma zamanı + frekans >= şimdi → Blog üret
Değilse → Skip (bir sonraki tenant'a geç)
↓
6
Blog Generation - Tenant Context
Tenant context'ine geç → Draft seç → Blog üret → Auto-publish ayarına göre kaydet
↓
7
Log & Next - Kaydet ve Devam
Son çalışma zamanını güncelle → Bir sonraki tenant'a geç
🛠️ İmplementasyon Yapısı
1️⃣ Helper Function - Setting Değer Çekme
getTenantSetting() - Tenant-aware setting helper
Amaç: Tenant context'ine göre setting value çekmek
Function: getTenantSetting(key, default = null)
Mantık:
1. Tenant context'e geç (tenancy()->initialize())
2. Setting model'i bul (key ile)
3. SettingValue'yu tenant DB'den çek
4. Değer varsa döndür, yoksa default_value kullan
5. Return value
Kullanım Örnekleri:
- getTenantSetting('blog_ai_enabled') → true/false
- getTenantSetting('blog_ai_daily_count', 24) → 1-100 arası sayı
- getTenantSetting('blog_ai_auto_publish', true) → true/false
2️⃣ Cron Command - GenerateHourlyBlog Güncellemesi
Yeni Command: GenerateTenantBlogs YENİ
Değişiklikler:
- Tenant Loop: Tüm aktif tenant'ları döngüye al
- Settings Check: Her tenant için blog_ai_enabled kontrol et
- Frekans Hesapla: daily_count'a göre ne zaman çalışacağını hesapla
- Time Check: Son çalışma zamanını kontrol et (cache/DB)
- Blog Üret: Sırası gelmişse blog üret
- Auto-Publish: blog_ai_auto_publish ayarına göre published/draft kaydet
3️⃣ Kernel.php Schedule - Dakika Bazlı Çalıştırma
Schedule Değişikliği DEĞİŞTİ
ESKİ: ->hourly() (her saat başı)
YENİ: ->everyMinute() (her dakika)
Neden?
Farklı tenant'lar farklı frekanslarda çalışabilsin:
• Tenant A: Her 14 dakika (100 blog/gün)
• Tenant B: Her 4.8 saat (5 blog/gün)
• Tenant C: Günde 1 kez (1 blog/gün)
⚠️ Not: Command içinde kendi frekans kontrolü yapar, gereksiz yere tüm tenant'lara blog üretmez.
4️⃣ GenerateBlogFromDraftJob - Publish Logic
Auto-Publish Desteği YENİ
Değişiklik: Job'a auto_publish parametresi eklenecek
Job::dispatch(draft_id, auto_publish)
Mantık:
• auto_publish = true → Blog::create([...., 'status' => 'published'])
• auto_publish = false → Blog::create([...., 'status' => 'draft'])
Avantaj:
Tenant blog üretsin ama manuel kontrol edip yayınlamak isteyebilir
5️⃣ Cache/DB - Son Çalışma Zamanı Takibi
Tracking System YENİ
Amaç: Her tenant için son blog üretim zamanını saklamak
Yöntem 1: Cache (Hızlı)
Cache::put("blog_cron_last_run_tenant_{$tenantId}", now(), 86400);
$lastRun = Cache::get("blog_cron_last_run_tenant_{$tenantId}");
Yöntem 2: Database (Persistent)
Tablo: blog_cron_tracking
Kolonlar: tenant_id, last_run_at, daily_count, next_run_at
Önerilen: Cache + DB (cache hızlı, DB backup)
🎬 Farklı Tenant Senaryoları
📋 Senaryo 1: Tenant 2 (ixtif.com) - Saatte 1 Blog
Ayarlar
- blog_ai_enabled = true
- blog_ai_daily_count = 24
- blog_ai_auto_publish = true
Çalışma Mantığı:
24 / 24 = 1 saat aralık → Her saat başı blog üret
00:00, 01:00, 02:00, ..., 23:00 → 24 blog/gün
Direkt yayınla (published)
📋 Senaryo 2: Tenant 3 - Günde 1 Blog
Ayarlar
- blog_ai_enabled = true
- blog_ai_daily_count = 1
- blog_ai_auto_publish = false
Çalışma Mantığı:
24 / 1 = 24 saat aralık → Günde 1 kez blog üret
Her gün 00:00'da → 1 blog/gün
Draft olarak kaydet (admin manuel yayınlar)
📋 Senaryo 3: Tenant 4 - Günde 5 Blog
Ayarlar
- blog_ai_enabled = true
- blog_ai_daily_count = 5
- blog_ai_auto_publish = true
Çalışma Mantığı:
24 / 5 = 4.8 saat aralık → Her 4 saat 48 dakikada 1 blog
00:00, 04:48, 09:36, 14:24, 19:12 → 5 blog/gün
Direkt yayınla (published)
📋 Senaryo 4: Tenant 5 - Günde 100 Blog (Agresif)
Ayarlar
- blog_ai_enabled = true
- blog_ai_daily_count = 100
- blog_ai_auto_publish = true
Çalışma Mantığı:
24 / 100 = 0.24 saat = 14.4 dakika aralık → Her ~14 dakikada 1 blog
Sürekli blog üretimi → 100 blog/gün
Direkt yayınla (published)
⚠️ Uyarı: OpenAI rate limit ve queue kapasitesi göz önünde bulundurulmalı!
📋 Senaryo 5: Tenant 6 - Sistem Pasif
Ayarlar
- blog_ai_enabled = false 🔴
- blog_ai_daily_count = 10 (önemsiz)
- blog_ai_auto_publish = true (önemsiz)
Çalışma Mantığı:
blog_ai_enabled = false → Cron bu tenant'ı ATLA
Hiç blog üretilmez → 0 blog/gün
Tenant istediği zaman sistemi kapatabilir
🎯 Sonraki Adımlar
1. Helper Function Oluşturma
getTenantSetting() helper'ı implement et
Dosya: app/Helpers/setting_helpers.php veya mevcut helper dosyasına ekle
2. Cron Command Güncelleme
GenerateHourlyBlog → GenerateTenantBlogs olarak yeniden yaz
Değişiklikler: Tenant loop, settings check, dynamic frequency, time tracking
3. Kernel Schedule Güncelleme
->hourly() → ->everyMinute() olarak değiştir
Not: Command içinde kendi frekans kontrolü olacağı için sorun yok
4. Blog Generation Job Güncelleme
GenerateBlogFromDraftJob'a auto_publish parametresi ekle
Değişiklik: Status'u ayara göre belirle (published/draft)
5. Tracking System Kurulumu
Her tenant için son çalışma zamanı cache/DB'ye kaydet
Yöntem: Cache (hızlı) + DB (persistent) kombinasyonu
6. Test & Monitoring
Farklı tenant senaryolarını test et, log ve monitoring sistemi kur
Kontrol: Her tenant'ın ayarları doğru çalışıyor mu?