Proje: Okul Platform · Hub: Okul Platform — Incidents

Semptom

Google ile giriş/kayıt denemesinde SQLSTATE[23000] ... Duplicate entry 'xxx@gmail.com' for key 'users.users_email_unique' hatası. Hata hem yeni kayıt hem tekrar giriş akışında dönüyor; findOrCreateUsercreateUser yolunda User::create çağrısı çakışıyor.

Root cause

  • App\User modeli SoftDeletes kullanıyor (app/User.php:151) → global scope trashed satırları gizliyor.
  • users.email unique index’i DB seviyesinde koşulsuz (database/migration_backup/2014_10_12_000000_create_users_table.php:18->unique()), yani soft-delete olmuş satırlar da email slot’unu tutuyor.
  • UserController::createUser User::where('email', …)->first() ile arıyor; trashed kullanıcıyı göremiyor, null dönüyor, ardından User::create DB’de var olan email’e çarpıyor.
  • Aynı açık handleSocialCallback’teki $isNewUser probunda da vardı: trashed hesap silent restore olursa bile “yeni kullanıcı” sayılıp pazarlama izni sayfasına atılabilirdi.

Çözüm

Sosyal giriş lookup’larında withTrashed() + gerekirse restore():

  • createUser: email lookup withTrashed(); $user->trashed() ise restore() sonra update($data).
  • findOrCreateUser: google_id/facebook_id lookup’u withTrashed(); eşleşen trashed hesap varsa restore et.
  • handleSocialCallback: $isNewUser probları withTrashed() ile, soft-deleted hesap restore edildiğinde user.social_marketing_consent’e düşmesin.

Ürün kararı: Option A — soft-delete’li hesap sosyal girişte sessizce restore edilir. İleride “hesabı kapatan kullanıcı geri dönerse ne olur?” diye politika değişirse burası tekrar gözden geçirilmeli (GDPR/kapalı hesap guard’ı).

İlgili dosya

  • app/Http/Controllers/Front/UserController.phphandleSocialCallback, findOrCreateUser, createUser