Proje: Okul Platform · Hub: Okul Platform — Decisions

Consent ayrımı: 3 legacy endpoint için FE-only bypass

OKUL-737 kapsamında tüm form’lar combined terms checkbox’tan ayrı kvkk_consent + marketing_consent pattern’ine geçirildi (bkz. 2026-05-06-consent-checkbox-pattern).

Çoğu BE endpoint’i bu pattern’i zaten kabul ediyor (SchoolOfferRequest, SchoolCommentRequest, RegisterRequest, ProfilingMultiOfferRequest). Üç endpoint hâlâ legacy terms field bekliyor:

EndpointValidatorEtkilenen FE form’ları
POST /kurumsal/iletisimCustomer/ContactController@create (inline)B2B iletişim (desktop+mobile), “Okulunuzu Ekleyin” modal
POST /ajax/submitContactFront/ContactFormRequestİletişim formu (desktop+mobile)
POST /okulu-sahiplen/sendSchoolAddApplicationRequest”Aramıza Katılın” (desktop+mobile)

Karar: BE’ye dokunma, FE’de bypass

Bu üç endpoint’in BE adaption’ı için ayrı ticket gerektiği ve bu form’lar consent değerini zaten persist etmiyor (sadece kabul edildi diye saklıyor → ContactController vs. lead’i e-posta ile yolluyor) — pragmatik çözüm:

  1. Hidden terms=1 her zaman gönder → eski validation pass.
  2. Hidden kvkk_consent=1 / marketing_consent=1 consent vermiş kullanıcılar için (@else branch) → BE adapte olduğunda hazır.
  3. FE gate: kvkk_consent checkbox görünüyor ve işaretli değilse submit’i engelle. Hidden terms=1 kullanıcının kabul ettiği yanılsaması yaratmasın.

FE gate pattern

var $kvkk = $('input[name="kvkk_consent"][type="checkbox"]');
if ($kvkk.length && !$kvkk.is(':checked')) {
    $('#error-kvkk_consent').text('...').show();
    return false;
}

length check kritik: consented user’da checkbox DOM’da yok, gate de geçer.

Etkilenen FE dosyaları (yapılan değişiklikler)

Blade’ler (her birinde @else { Form::hidden('kvkk_consent', 1) } + hidden terms=1):

  • frontend/components/customer_page/modal.blade.php
  • frontend/customer/contact.blade.php + mobile/customer/contact.blade.php
  • frontend/static/contact_us.blade.php + mobile/static/contact_us.blade.php
  • frontend/information/edit.blade.php + mobile/information/edit.blade.php (manual AJAX payload)

JS handler’lar (FE gate eklendi):

  • assets/scripts/frontend/customer-index.js
  • assets/scripts/frontend/customer-contact.js
  • assets/scripts/frontend/static-contact_us.js
  • assets/scripts/mobile/static-contact_us.js
  • assets/scripts/mobile/app.js (#customerForm handler)

Alternatif değerlendirildi, reddedildi

  • BE’yi adapte et: Doğru çözüm ama Customer/ContactController inline validator + 2 FormRequest dosyası demek; CLAUDE.md “BE değişikliği için onay al” kuralı, ayrıca scope büyür. BE ekibine bu görev devredilebilir; bypass o zamana kadar geçici çözüm.
  • Sahte terms=1 göndermeden bırak: BE 422 dönüyor, form’lar kırılıyor. Kabul edilemez.

Sonraki adım

BE ekibi 3 endpoint’i kanonik pattern’e çekerse (kvkk_consent + marketing_consent accepted, UserService::hasAuthUserConsented*() ile koşullu required), bu bypass kaldırılmalı:

  • Hidden terms=1 input’ları sil
  • JS gate’lerin kalması ok (zaten doğru davranış)