const express = require('express'); const router = express.Router(); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const { Pool } = require('pg'); const pgPool = new Pool({ host: process.env.PGHOST || 'postgres', port: process.env.PGPORT || 5432, user: process.env.PGUSER || 'postgres', password: process.env.PGPASSWORD || 'postgres', database: process.env.PGDATABASE || 'ckqr', }); const JWT_SECRET = process.env.JWT_SECRET || 'supersecret123'; // Register router.post('/register', async (req, res) => { const { email, password } = req.body; if (!email || !password) return res.status(400).json({ error: 'Email and password required' }); try { const checkUser = await pgPool.query('SELECT id FROM users WHERE email = $1', [email]); if (checkUser.rows.length > 0) return res.status(400).json({ error: 'User already exists' }); const countQuery = await pgPool.query('SELECT COUNT(*) FROM users'); const userCount = parseInt(countQuery.rows[0].count, 10); const assignedRole = userCount === 0 ? 'admin' : 'free_trial'; const salt = await bcrypt.genSalt(10); const hash = await bcrypt.hash(password, salt); const newUser = await pgPool.query( 'INSERT INTO users (email, password_hash, role) VALUES ($1, $2, $3) RETURNING id, email, role', [email, hash, assignedRole] ); const token = jwt.sign({ id: newUser.rows[0].id, email: newUser.rows[0].email, role: newUser.rows[0].role }, JWT_SECRET, { expiresIn: '14d' }); res.cookie('token', token, { httpOnly: true, maxAge: 14 * 24 * 60 * 60 * 1000, secure: false, sameSite: 'lax' }); res.status(201).json({ message: 'User registered', user: newUser.rows[0] }); } catch (err) { console.error(err); res.status(500).json({ error: 'Server error' }); } }); // Login router.post('/login', async (req, res) => { const { email, password } = req.body; if (!email || !password) return res.status(400).json({ error: 'Email and password required' }); try { const userQuery = await pgPool.query('SELECT * FROM users WHERE email = $1', [email]); if (userQuery.rows.length === 0) return res.status(404).json({ error: 'User not found' }); const user = userQuery.rows[0]; const isMatch = await bcrypt.compare(password, user.password_hash); if (!isMatch) return res.status(401).json({ error: 'Invalid credentials' }); const token = jwt.sign({ id: user.id, email: user.email, role: user.role }, JWT_SECRET, { expiresIn: '14d' }); res.cookie('token', token, { httpOnly: true, maxAge: 14 * 24 * 60 * 60 * 1000, secure: false, sameSite: 'lax' }); res.json({ user: { id: user.id, email: user.email, role: user.role } }); } catch (err) { console.error(err); res.status(500).json({ error: 'Server error' }); } }); // Get Current User (Validate Session) const { verifyToken } = require('../middleware/auth'); router.get('/me', verifyToken, async (req, res) => { try { const userQuery = await pgPool.query('SELECT id, email, role FROM users WHERE id = $1', [req.user.id]); if (userQuery.rows.length === 0) return res.status(404).json({ error: 'User not found' }); res.json({ user: userQuery.rows[0] }); } catch (err) { console.error(err); res.status(500).json({ error: 'Server error' }); } }); // Logout router.post('/logout', (req, res) => { res.clearCookie('token'); res.json({ message: 'Logged out' }); }); module.exports = router;