🔄 Blog AI Cron - Settings Entegrasyonu & Tenant-Aware Sistem

📅 Tarih: 2025-11-17 01:55 | 🎯 Tenant: Multi-Tenant (All) | 👤 Talep: Settings-based dynamic cron + tenant-aware frequency

📋 Mevcut Durum Analizi

🔍 Şu Anki Cron Sistemi

  • Frekans: Her saat başı (hourly) - Tüm tenant'lar için aynı
  • Draft Kontrolü: is_generated = false (kullanılmamış draft'lar)
  • Blog Üretimi: Rastgele 1 draft seç → Blog job'u tetikle
  • Auto-Publish: YOK - Her blog otomatik yayınlanıyor
  • Settings Entegrasyonu: YOK - Ayarlar kullanılmıyor
  • Tenant-Aware: KISMEN - Draft tenant DB'den alınıyor ama frekans sabit

⚠️ Sorunlar

  • Sabit Frekans: Tüm tenant'lar saatte 1 blog alıyor (günde 24)
  • Settings Yok sayılıyor: blog_ai_enabled, blog_ai_daily_count, blog_ai_auto_publish kullanılmıyor
  • Kontrol Yok: Tenant sistem pasif olsa bile çalışıyor
  • Esneklik Yok: Günde 1, 5, 10, 100 blog gibi farklı senaryolar yok

⚙️ 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ç

📐 Dinamik Frekans Hesaplama

Temel Formül

saat_aralığı = 24 / günlük_blog_sayısı

Dakika olarak: saat_aralığı × 60

📊 Frekans Tablosu

Günlük Blog Saat Aralığı Dakika Aralığı Cron Mantığı Örnek Saatler
1 blog 24.0 saat 1440 dakika Günde 1 kez (günlük) 00:00
2 blog 12.0 saat 720 dakika 12 saatte bir 00:00, 12:00
3 blog 8.0 saat 480 dakika 8 saatte bir 00:00, 08:00, 16:00
4 blog 6.0 saat 360 dakika 6 saatte bir 00:00, 06:00, 12:00, 18:00
5 blog 4.8 saat 288 dakika ~4.8 saatte bir 00:00, 04:48, 09:36, 14:24, 19:12
10 blog 2.4 saat 144 dakika ~2.4 saatte bir Her 144 dakikada
24 blog 1.0 saat 60 dakika Saatte bir (hourly) Her saat başı
48 blog 0.5 saat 30 dakika 30 dakikada bir Her yarım saatte
100 blog 0.24 saat 14.4 dakika ~14 dakikada bir Sürekli (her 14 dk)

💡 Algoritma Mantığı

Sistem her dakika çalışır ama her tenant için son blog üretim zamanını kontrol eder. Eğer (şimdiki_zaman - son_üretim_zamanı) >= saat_aralığı ise blog üretir.

Örnek:
• Tenant 2: daily_count = 24 → Her saat başı
• Tenant 3: daily_count = 1 → Günde 1 kez (her gün 00:00'da)
• Tenant 4: daily_count = 5 → Her 4.8 saatte
• Tenant 5: daily_count = 100 → Her 14 dakikada

🛠️ İ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

📊 Beklenen Sonuçlar

Tenant Esnekliği
1-100
Günlük Blog Aralığı
100%
Settings-Driven
0
Manuel Müdahale

✅ Başarı Kriterleri

  • Her tenant kendi ayarlarına göre çalışacak
  • Günlük blog sayısı dinamik olarak ayarlanabilecek (1-100)
  • Otomatik yayınlama/draft kontrolü tenant'a bırakılacak
  • Tenant sistemi istediği zaman pasif yapabilecek
  • Farklı sektörler farklı stratejiler uygulayabilecek
  • Sistem tamamen self-service olacak (admin panel'den ayarlama)

🎯 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?