feat: upgrade AI prompts to v2 specification with grounding and injection shield

This commit is contained in:
mstfyldz
2026-08-14 00:52:41 +03:00
parent f1457b02ca
commit fab80e05a0
8 changed files with 257 additions and 45 deletions
+87
View File
@@ -0,0 +1,87 @@
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 });
};