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ı —includetekil) - 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' }✅
Related
- backend-endpoint-referansi — Tüm API endpoint filter tabloları
- backend-api-genel — Genel API mekanizmaları
- servis-katmani — Frontend servis pattern