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,
): array

Pivot’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ı

  • createattachSchoolContentSchools(defaultSchoolContentType: $dto->schoolContentType->value, showHomePage: $dto->showHomePage)
  • updatesyncSchoolContentSchools(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_typeannouncements.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.