88 lines
3.0 KiB
TypeScript
88 lines
3.0 KiB
TypeScript
import { Request, Response } from 'express';
|
||
import { supabase } from '../lib/supabase';
|
||
|
||
// POST /api/auth/register
|
||
// E-posta + şifre ile yeni kullanıcı kaydı.
|
||
// device_id: Electron'dan gönderilen cihaz kimliği (opsiyonel, sadece Electron build'de gelir).
|
||
// Aynı device_id ile daha önce trial başlatılmışsa kayıt reddedilir.
|
||
export const register = async (req: Request, res: Response) => {
|
||
const { email, password, device_id } = req.body;
|
||
|
||
if (!email || !password) {
|
||
return res.status(400).json({ error: 'E-posta ve şifre gereklidir.' });
|
||
}
|
||
if (password.length < 8) {
|
||
return res.status(400).json({ error: 'Şifre en az 8 karakter olmalıdır.' });
|
||
}
|
||
|
||
// Device ID varsa aynı cihazdan daha önce trial açılmış mı kontrol et
|
||
if (device_id) {
|
||
const { data: existingDevice } = await supabase
|
||
.from('profiles')
|
||
.select('id, license_status')
|
||
.eq('trial_device_id', device_id)
|
||
.maybeSingle();
|
||
|
||
if (existingDevice) {
|
||
return res.status(409).json({
|
||
error: 'Bu cihazda daha önce deneme sürümü kullanılmıştır. Hesabınıza giriş yapın veya bir lisans anahtarı edinin.',
|
||
code: 'DEVICE_TRIAL_USED',
|
||
});
|
||
}
|
||
}
|
||
|
||
// Supabase Auth'ta kullanıcı oluştur (service role ile — email doğrulama zorunluluğu bypass)
|
||
const { data, error } = await supabase.auth.admin.createUser({
|
||
email,
|
||
password,
|
||
email_confirm: true, // E-posta onayı gerektirmeden direkt aktif et
|
||
});
|
||
|
||
if (error) {
|
||
// Supabase hata mesajlarını Türkçeye çevir
|
||
if (error.message?.toLowerCase().includes('already registered') || error.message?.includes('already been registered')) {
|
||
return res.status(409).json({ error: 'Bu e-posta adresi zaten kayıtlı.' });
|
||
}
|
||
console.error('[auth] register error:', error.message);
|
||
return res.status(400).json({ error: 'Kayıt oluşturulamadı: ' + error.message });
|
||
}
|
||
|
||
const userId = data.user?.id;
|
||
if (!userId) {
|
||
return res.status(500).json({ error: 'Kullanıcı oluşturuldu fakat ID alınamadı.' });
|
||
}
|
||
|
||
// Device ID'yi profile'a kaydet (Supabase trigger zaten trial kolonlarını oluşturdu)
|
||
if (device_id) {
|
||
await supabase
|
||
.from('profiles')
|
||
.update({ trial_device_id: device_id })
|
||
.eq('id', userId);
|
||
}
|
||
|
||
// Kayıt başarılı — kullanıcı artık Supabase Auth üzerinden giriş yapabilir
|
||
return res.status(201).json({
|
||
success: true,
|
||
message: '3 günlük deneme sürümünüz başlatıldı.',
|
||
userId,
|
||
});
|
||
};
|
||
|
||
// POST /api/auth/check-device
|
||
// Bir device_id'nin daha önce trial için kullanılıp kullanılmadığını kontrol eder.
|
||
// Kayıt formunda "Kayıt Ol" butonuna basmadan önce çağrılır.
|
||
export const checkDevice = async (req: Request, res: Response) => {
|
||
const { device_id } = req.body;
|
||
if (!device_id) {
|
||
return res.status(400).json({ error: 'device_id gerekli.' });
|
||
}
|
||
|
||
const { data } = await supabase
|
||
.from('profiles')
|
||
.select('id')
|
||
.eq('trial_device_id', device_id)
|
||
.maybeSingle();
|
||
|
||
return res.json({ deviceUsed: !!data });
|
||
};
|