132 lines
5.6 KiB
JavaScript
132 lines
5.6 KiB
JavaScript
"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 = `
|
|
<h2>Password Reset</h2>
|
|
<p>You requested a password reset. Please click the link below to reset your password:</p>
|
|
<a href="${resetUrl}">${resetUrl}</a>
|
|
<p>This link will expire in 1 hour.</p>
|
|
`;
|
|
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;
|