import bcrypt from 'bcryptjs'; import jwt from 'jsonwebtoken'; import { sql } from '@vercel/postgres'; const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key-change-in-production'; export default async function handler(req, res) { // Set CORS headers res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); // Handle preflight requests if (req.method === 'OPTIONS') { res.status(200).end(); return; } if (req.method !== 'POST') { return res.status(405).json({ error: 'Method not allowed' }); } try { const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ error: 'Email and password are required' }); } if (password.length < 6) { return res.status(400).json({ error: 'Password must be at least 6 characters' }); } // Check if user already exists const existingUser = await sql` SELECT id FROM users WHERE email = ${email} `; if (existingUser.rows.length > 0) { return res.status(409).json({ error: 'User already exists' }); } // Hash password const hashedPassword = await bcrypt.hash(password, 12); // Create user const result = await sql` INSERT INTO users (email, password, role) VALUES (${email}, ${hashedPassword}, ${'user'}) RETURNING id, email, role, created_at `; const user = result.rows[0]; // Generate JWT token const token = jwt.sign( { userId: user.id, email: user.email, role: user.role }, JWT_SECRET, { expiresIn: '24h' } ); res.status(201).json({ success: true, user, token }); } catch (error) { console.error('Registration error:', error); res.status(500).json({ error: 'Internal server error' }); } }