"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.resetPassword = exports.forgotPassword = exports.getMe = exports.signup = exports.login = void 0; const User_1 = __importDefault(require("../models/User")); const bcryptjs_1 = __importDefault(require("bcryptjs")); const jsonwebtoken_1 = __importDefault(require("jsonwebtoken")); const email_1 = require("../utils/email"); const crypto_1 = __importDefault(require("crypto")); const JWT_SECRET = process.env.JWT_SECRET || 'your_super_secret_jwt_key'; const login = (req, res) => __awaiter(void 0, void 0, void 0, function* () { try { const { email, password } = req.body; const user = yield User_1.default.findOne({ email }); if (!user) { return res.status(401).json({ error: 'Invalid credentials' }); } const isMatch = yield bcryptjs_1.default.compare(password, user.password); if (!isMatch) { return res.status(401).json({ error: 'Invalid credentials' }); } const token = jsonwebtoken_1.default.sign({ userId: user._id, role: user.role, name: user.name }, JWT_SECRET, { expiresIn: '1d' }); res.json({ message: 'Login successful', token, user: { id: user._id, name: user.name, email: user.email, role: user.role } }); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.login = login; const signup = (req, res) => __awaiter(void 0, void 0, void 0, function* () { try { const { name, email, password, role } = req.body; const userExists = yield User_1.default.findOne({ email }); if (userExists) { return res.status(400).json({ error: 'User already exists' }); } const hashedPassword = yield bcryptjs_1.default.hash(password, 10); const user = yield User_1.default.create({ name, email, password: hashedPassword, role: role || 'admin' }); const token = jsonwebtoken_1.default.sign({ userId: user._id, role: user.role, name: user.name }, JWT_SECRET, { expiresIn: '1d' }); res.status(201).json({ message: 'User created successfully', token, user: { id: user._id, name: user.name, email: user.email, role: user.role } }); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.signup = signup; const getMe = (req, res) => __awaiter(void 0, void 0, void 0, function* () { try { const user = yield User_1.default.findById(req.user.userId).select('-password'); if (!user) { return res.status(404).json({ error: 'User not found' }); } res.json(user); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.getMe = getMe; const forgotPassword = (req, res) => __awaiter(void 0, void 0, void 0, function* () { try { const { email } = req.body; const user = yield User_1.default.findOne({ email }); if (!user) { return res.status(404).json({ error: 'User not found' }); } const resetToken = crypto_1.default.randomBytes(20).toString('hex'); user.resetPasswordToken = resetToken; user.resetPasswordExpires = Date.now() + 3600000; // 1 hour yield user.save(); const resetUrl = `http://localhost:3000/auth/reset-password?token=${resetToken}`; const message = `
You requested a password reset. Please click the link below to reset your password:
${resetUrl}This link will expire in 1 hour.
`; yield (0, email_1.sendEmail)(user.email, 'Password Reset Request', message); res.json({ message: 'Reset link sent to your email' }); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.forgotPassword = forgotPassword; const resetPassword = (req, res) => __awaiter(void 0, void 0, void 0, function* () { try { const { token, password } = req.body; const user = yield User_1.default.findOne({ resetPasswordToken: token, resetPasswordExpires: { $gt: Date.now() } }); if (!user) { return res.status(400).json({ error: 'Invalid or expired token' }); } const hashedPassword = yield bcryptjs_1.default.hash(password, 10); user.password = hashedPassword; user.resetPasswordToken = undefined; user.resetPasswordExpires = undefined; yield user.save(); res.json({ message: 'Password reset successful' }); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.resetPassword = resetPassword;