const { prisma } = require('../utils/db'); const { hashPassword, comparePassword, generateToken } = require('../utils/auth'); // Register new user async function register(req, res, next) { try { const { username, email, password } = req.body; // Check if user already exists const existingUser = await prisma.user.findFirst({ where: { OR: [ { email }, { username }, ], }, }); if (existingUser) { if (existingUser.email === email) { return res.status(400).json({ success: false, error: 'Email already registered', }); } return res.status(400).json({ success: false, error: 'Username already taken', }); } // Hash password const passwordHash = await hashPassword(password); // Create user const user = await prisma.user.create({ data: { username, email, passwordHash, avatar: `https://ui-avatars.com/api/?name=${encodeURIComponent(username)}&background=6366f1&color=fff`, }, select: { id: true, username: true, email: true, avatar: true, createdAt: true, }, }); // Generate token const token = generateToken({ userId: user.id }); res.status(201).json({ success: true, message: 'User registered successfully', data: { user, token, }, }); } catch (error) { next(error); } } // Login user async function login(req, res, next) { try { const { email, password } = req.body; // Find user by email const user = await prisma.user.findUnique({ where: { email }, }); if (!user) { return res.status(401).json({ success: false, error: 'Invalid credentials', }); } // Compare password const isPasswordValid = await comparePassword(password, user.passwordHash); if (!isPasswordValid) { return res.status(401).json({ success: false, error: 'Invalid credentials', }); } // Generate token const token = generateToken({ userId: user.id }); // Return user without password const { passwordHash, ...userWithoutPassword } = user; res.json({ success: true, message: 'Login successful', data: { user: userWithoutPassword, token, }, }); } catch (error) { next(error); } } module.exports = { register, login, };