6.2 KiB
Clerk Üyelikleri Database'de Görünmüyor - Çözüm Kılavuzu
Sorun
Clerk ile yapılan üyelikler database'de görünmüyor.
Kök Neden
LetsGoCappadocia uygulaması iki farklı yöntemle Clerk kullanıcılarını database'e kaydeder:
Yöntem 1: Clerk Webhook (Opsiyonel)
- Kullanıcı Clerk'te kayıt olduğunda webhook tetiklenir
clerk-webhookedge function çalışır- Profile otomatik olarak database'e eklenir
- Avantaj: Kayıt anında profile oluşur
- Dezavantaj: Clerk dashboard'da webhook konfigürasyonu gerekir
Yöntem 2: Client-Side Fallback (Aktif)
- Kullanıcı ilk kez giriş yaptığında
useClerkAuthImplementationhook çalışır - Hook, Clerk user ID ile database'de profile arar
- Bulamazsa, email ile arar ve Clerk ID'yi bağlar
- Hala bulamazsa, yeni profile oluşturur
- Avantaj: Webhook olmadan çalışır
- Dezavantaj: Kullanıcı en az bir kez giriş yapmalı
Mevcut Durum Analizi
Database'deki Profiller
SELECT id, email, username, role, clerk_user_id, created_at
FROM profiles
ORDER BY created_at DESC;
Sonuç:
- 2 profil var
- 1 tanesi Clerk ID'ye sahip (cappadociaturkeytour@gmail.com)
- 1 tanesi Clerk ID'siz (admin@letsgocappadocia.com)
Sonuç
✅ Clerk entegrasyonu çalışıyor ✅ Client-side fallback aktif ⚠️ Webhook muhtemelen yapılandırılmamış
Çözüm: Kullanıcıların Giriş Yapması Gerekiyor
Senaryo 1: Yeni Kayıt Olan Kullanıcı
- Kullanıcı Clerk ile kayıt olur
- Kayıt sonrası otomatik olarak giriş yapar
useClerkAuthImplementationhook çalışır- Profile database'e eklenir ✅
Senaryo 2: Daha Önce Kayıt Olmuş Kullanıcı
- Kullanıcı Clerk'te kayıtlı ama database'de profili yok
- Kullanıcı giriş yapar
useClerkAuthImplementationhook çalışır- Profile database'e eklenir ✅
Senaryo 3: Provider Olmak İsteyen Kullanıcı
- Kullanıcı kayıt olur ve giriş yapar → Profile oluşur (role='user')
/provider-infosayfasını ziyaret eder- "Provider Olarak Kayıt Ol" butonuna tıklar
- Provider kayıt formunu doldurur
register_providerRPC çağrılır- Role 'provider' olarak güncellenir ✅
- Admin panelinde görünür ✅
Webhook Yapılandırması (Opsiyonel)
Eğer kullanıcıların giriş yapmadan önce database'de görünmesini istiyorsanız:
1. Clerk Dashboard Ayarları
- Clerk Dashboard → Webhooks
- "Add Endpoint" butonuna tıklayın
- Endpoint URL:
https://[YOUR_SUPABASE_PROJECT].supabase.co/functions/v1/clerk-webhook - Events seçin:
- ✅
user.created - ✅
user.updated - ✅
user.deleted
- ✅
- Webhook Secret'i kopyalayın
2. Supabase Secret Ayarları
# Supabase Dashboard → Project Settings → Edge Functions → Secrets
CLERK_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxx
3. Edge Function Deploy
Edge function zaten deploy edildi:
✅ clerk-webhook function deployed
4. Test
- Yeni bir kullanıcı kayıt edin
- Database'i kontrol edin:
SELECT * FROM profiles WHERE clerk_user_id IS NOT NULL ORDER BY created_at DESC LIMIT 5;
Kod Akışı
useClerkAuthImplementation Hook (src/hooks/useAuth.ts)
// 1. Clerk user ID ile ara
let { data } = await supabase
.from('profiles')
.select('*')
.eq('clerk_user_id', clerkUser.id)
.maybeSingle();
// 2. Bulunamazsa, email ile ara ve Clerk ID'yi bağla
if (!data && clerkUser.primaryEmailAddress?.emailAddress) {
const { data: emailData } = await supabase
.from('profiles')
.select('*')
.eq('email', email)
.maybeSingle();
if (emailData) {
// Mevcut profile'a Clerk ID'yi ekle
await supabase
.from('profiles')
.update({ clerk_user_id: clerkUser.id })
.eq('id', emailData.id);
}
}
// 3. Hala bulunamazsa, yeni profile oluştur
if (!data) {
await supabase
.from('profiles')
.insert({
clerk_user_id: clerkUser.id,
email: email,
username: clerkUser.username || email.split('@')[0],
full_name: `${clerkUser.firstName} ${clerkUser.lastName}`,
role: 'user',
is_active: true
});
}
Test Senaryoları
Test 1: Yeni Kullanıcı Kaydı
- ✅ Clerk ile kayıt ol
- ✅ Otomatik giriş yap
- ✅ Profile database'de oluşur
- ✅ Admin panelinde görünür (eğer provider ise)
Test 2: Mevcut Kullanıcı Girişi
- ✅ Clerk ile giriş yap
- ✅ Profile database'de oluşur (yoksa)
- ✅ Clerk ID bağlanır (varsa)
Test 3: Provider Kaydı
- ✅ User olarak giriş yap
- ✅ Provider kayıt formunu doldur
- ✅ Role 'provider' olur
- ✅ Admin panelinde görünür
Sık Sorulan Sorular
S: Kullanıcı kayıt oldu ama database'de yok?
C: Kullanıcı en az bir kez giriş yapmalı. Kayıt sonrası otomatik giriş yapılıyor, bu yüzden normal şartlarda sorun olmamalı.
S: Webhook gerekli mi?
C: Hayır. Client-side fallback yeterli. Webhook sadece kayıt anında profile oluşturmak için kullanılır.
S: Admin panelinde provider görünmüyor?
C:
- Kullanıcı giriş yaptı mı? → Giriş yapmalı
- Provider kaydı yaptı mı? →
/provider-infosayfasından kayıt olmalı admin_provider_statsview'ı güncel mi? → Migration uygulandı ✅
S: Email ile arama neden yapılıyor?
C: Eğer kullanıcı daha önce başka bir yöntemle (örn: demo login) kayıt olduysa, Clerk ID'si olmayabilir. Email ile bulup Clerk ID'yi bağlıyoruz.
Öneriler
Üretim Ortamı İçin
- ✅ Webhook yapılandırın (kayıt anında profile oluşur)
- ✅ CLERK_WEBHOOK_SECRET'i ayarlayın
- ✅ Webhook endpoint'ini test edin
- ⚠️ Client-side fallback'i kaldırmayın (yedek olarak kalmalı)
Geliştirme Ortamı İçin
- ✅ Client-side fallback yeterli
- ✅ Webhook opsiyonel
- ✅ Test kullanıcıları giriş yapmalı
Sonuç
Clerk entegrasyonu çalışıyor. Kullanıcılar kayıt olduktan sonra giriş yaptıklarında otomatik olarak database'e ekleniyor. Provider olmak isteyen kullanıcılar /provider-info sayfasından kayıt olabilir ve admin panelinde görünür.
Webhook yapılandırması opsiyoneldir ve sadece kayıt anında profile oluşturmak için kullanılır. Mevcut client-side fallback mekanizması tüm senaryoları kapsar.