Proje: Okul.com.tr CRM · Hub: Okul.com.tr CRM — Architecture

Backend-Frontend Tutarsızlıklar ve Dikkat Noktaları

1. SchoolComment — store Action’ı Yok

Backend school-comments için ->except(['store']) tanımlı.

→ Frontend’de “Yeni Ekle” butonu gösterilmemeli. Mevcut sayfa bunu DOM manipülasyonuyla gizliyor (btn.style.display = 'none') — kötü pattern. Doğrusu: GenericListPage’e hideAddButton prop ekle veya addRoute verme.


2. Article Comment Status Değerleri

Backend: filter[status]'0' (reddedildi) | '1' (onaylandı) | null (beklemede)

Frontend filter’da: 'null' string kullanılıyor beklemede için:

{ label: 'Beklemede', value: 'null' }  // string "null"

Bu API’ye filter[status]=null gönderir. Backend bunu nasıl işliyor test edilmeli.


3. School Comment Date Range Parametresi

API beklentisi: filter[date_range][min] ve filter[date_range][end]
(end kullanıyor, max DEĞİL)

Eğer frontend filter[date_range][max] gönderirse çalışmaz.

filterKeyMappings’de dikkat et, dateRange için özel mapping gerekebilir.


4. includes[] vs include — Format Tutarsızlığı

  • List endpoint: includes[]=creator&includes[]=schools (array)
  • Show (getById) endpoint: include[]=category&include[]=user (farklı — include tekil)
  • SchoolService.getById: include=type,college,... (comma-separated)

Backend her üçünü de kabul ediyor (HasDynamicIncludes trait). Ama tutarlı olmak için servis dosyasındaki pattern’e bak.


5. ArticleComment Include Adı Farkı

API: include[]=approved-by (tire ile)
Frontend: includes: ['article', 'user', 'approvedBy'] (camelCase)

Backend’in approved-by mi yoksa approvedBy mi kabul ettiğini test et.


6. School Sort Parametresi

API sort alanları: school-id, school-name, status (tire ile)

Frontend useListFilters’da sort: { column: "school-id", direction: "asc" } → gönderilen: sort=school-id


7. Events Route Parametre Adı

Route tanımı:

Route::apiResource('events', EventController::class)
    ->parameter('events', 'announcement');

URL: /admin/school-content/events/{announcement}{id} değil {announcement}

Frontend EventService.getById(id)endpoints.events(id)/admin/school-content/events/123 şeklinde gönderip Laravel route model binding {announcement} olarak alıyor. Bu şeffaf çalışır ama bilmek lazım.


8. SalesCampaign date_between vs date_range

School Comment: filter[date_range][min] ve filter[date_range][end] SalesCampaign: filter[date_between][min] ve filter[date_between][max]

İki endpoint farklı nested key kullanıyor. Frontend’de dateRange filtresi eklenirse doğru key kullanılmalı.


9. User Filter is_active Boolean Format

API: filter[is_active]=true veya filter[is_active]=false
Frontend filter seçenekleri: { value: 'true' } ve { value: 'false' } ✅ (string olarak doğru)


10. SchoolContent Ortak Model

Events ve Achievements aslında Announcement model kullanıyor:

  • Events: type = 'event'
  • Achievements: type = 'achievement'

Backend’de ayrı controller var ama aynı model. Frontend zaten Announcement tipini kullanıyor ✅.


11. nulls[] ve not_nulls[] (School Comments)

Bu iki özel parametre SchoolComment API’sinde desteklenir ama frontend’de implement edilmemiş.

Kullanım senaryosu:

  • Yanıtlanmamış yorumlar: nulls[]=school_comments.replied_id
  • Yanıtlanmış yorumlar: not_nulls[]=school_comments.replied_id
  • Bekleyen (status null) yorumlar: nulls[]=school_comments.status

→ İleride “sadece yanıtlanmamış yorumlar” filtresi eklenirse bu parametreler kullanılmalı.


12. filter[school-type] vs filter[school_type_id]

Makale sayfasında:

  • Frontend filtre adı: school_type_id
  • API beklentisi: filter[school-type] (tire ile, ID’yi kabul ediyor)
  • filterKeyMappings ile çözülmüş: { school_type_id: 'school-type' }