Proje: Okul API · Hub: Okul API — Incidents
PR #290 — Okul İçerikleri Senkronizasyon Hatası
app/Repositories/Repos/SchoolContentRepository.php
app/Services/Admin/SchoolContentService.php
Semptom
school_announcements pivot tablosundaki announcement_type kolonu, ilişkili announcements.type ile uyumsuz kalabiliyordu. Admin veya B2B portaldan content yaratıp okul bağlayınca pivot’taki announcement_type boş/eski değerde kalıyor, okul profilinde içerikler yanlış kategoride listeleniyordu.
Root Cause
SchoolContentService::create/update içinde klasik $announcement->schools()->attach($schoolIds) / ->sync($schoolIds) kullanılıyordu. Bu çağrı pivot’a sadece school_id yazıyor, ekstra pivot kolonları (announcement_type, show_home_page) default’ta kalıyordu. Announcement tarafında type değişse bile pivot eski değerde kalıyordu.
Fix
1) Repository’de pivot builder
private function buildSchoolContentPivotData(
array $schoolIds,
string $defaultSchoolContentType,
?bool $showHomePage = null,
?Announcement $announcement = null,
): arrayPivot’a her zaman announcement_type (announcement’ın kendi type’ı) ve show_home_page yazılıyor.
Update davranışı: showHomePage parametresi gelmediyse, mevcut pivot satırının show_home_page değeri korunuyor (contentSchools() üzerinden school_id → show_home_page map’i çekilip kullanılıyor). Override isteyen eksplisit showHomePage gönderir.
2) Service çağrıları
create→attachSchoolContentSchools(defaultSchoolContentType: $dto->schoolContentType->value, showHomePage: $dto->showHomePage)update→syncSchoolContentSchools(defaultSchoolContentType: $announcement->type, showHomePage: ...)
update artık $announcement->type’ı otoritatif kabul ediyor; pivot ona göre yazılıyor.
3) Data migration
2026_04_14_120000_sync_school_announcement_type_with_announcements_after_2026.php
2026-01-01 sonrası oluşmuş pivot satırları için school_announcements.announcement_type ← announcements.type güncellemesi. 2026 öncesi veriler için no-op down (eski değerler bilinmiyor).
Domain Kuralı — Pivot Yazımı
school_announcements pivot tablosunun yazımında doğrudan ->attach($ids) / ->sync($ids) kullanma. Her zaman repository’deki helper’lardan geç:
attachSchoolContentSchools()syncSchoolContentSchools()
Bu kural Achievement + Announcement + Event üçü için geçerli — hepsi aynı Announcement modeline ve aynı pivot’a map ediliyor.
Validation Requests Güncellemesi
Aynı PR’da StoreAchievementRequest, StoreAnnouncementRequest, StoreEventRequest (+ Update varyantları + Swagger) show_home_page alanı için validation eklendi. Admin ve Customer tarafında eşlenik.
Related
- api-school-content-types — SchoolContentType enum + Announcement/Achievement/Event içerik domeni
- api-content-modules — İçerik modülleri genel yapısı