Proje: Okul Platform · Hub: Okul Platform — Incidents

Responsive makale listeleme sayfasında sort pill’lerine (En Çok Okunan / En Yeni / Editör Seçimi / Son Güncellenen) tıklanınca 500 HttpException “Seçilen Sıralama geçersiz” fırlıyordu; “Daha Fazla Yükle” AJAX fetch’i başarısız olup fallback’te tüm sayfa HTML’i grid’e append ediyordu (kullanıcı ardı ardına aynı makale listesini üst üste görüyordu).

Kök neden

App\Http\Requests\Front\Articles\IndexArticleRequest HasPagination trait’ini kullanıyor. Trait sort field’ını strict Rule::in whitelist ile validate ediyor:

// HasPagination::paginationRules
$rules['sort'] = [
    'sometimes', 'string',
    Rule::in(['id', '-id', 'name', '-name', 'sorting', '-sorting']),
];

FE’den gelen sort=most-read|newest|editor-pick|recently-updated bu listede olmadığı için FormRequest 422 + translate key validation.custom.sort.*lang/tr/validation.php’deki “Seçilen Sıralama geçersiz.” — bazı path’lerde abort(500) döndürüyor.

Ayrıca controller içinde Locations::bottomSchoolsTypesLinks veya API service sort=-view_count gibi DB kolon adını direkt API’ye yolladığında API tarafı da aynı pattern’ı uyguluyor — -view_count, -created_at, -is_helpfull, -updated_at hiçbiri API sort whitelist’inde yok.

Çözüm

FE param adını rename: sortorder. IndexArticleRequest order için rule tanımlamadığı için pass through olur, BE ignore eder. FE query string ve Alpine state order kullanır; controller mapping:

$orderMap = [
    'newest' => '-id',  // API whitelist'inde var, approximate En Yeni
];
$sortParam = $orderMap[$request->input('order')] ?? 'sorting';
 
$articleListRequest = $this->articleService->getArticleList(
    ..., orderBy: $sortParam, ...
);

Diğer UI sort değerleri (most-read, editor-pick, recently-updated) şimdilik default sorting kolonuna düşürülür — görsel pill aktif ama BE gerçek sort yapmıyor. BE’nin sort whitelist’ine -view_count/-created_at/-updated_at ekleyince map genişleyecek (bkz BE-TODO §9a).

Ders

FormRequest’lerde HasPagination gibi ortak trait’ler varsa, sort param ile uğraşan FE kodu:

  1. Trait whitelist’ini kontrol et — desteklenmeyen değer VAR MI?
  2. Varsa farklı bir query param adı seç (order, sortBy vb.) — validation tetiklenmez.
  3. Controller’da gerekirse FE → API slug çevirimi yap.

BE ekibinden whitelist genişlemesi istenirken hangi değerlerin gerçekten DB kolonu olduğunu ve route/regex uyumunu teyit et.