const express = require("express"); const bcrypt = require("bcryptjs"); const jwt = require("jsonwebtoken"); const User = require("../models/User"); const auth = require("../middleware/auth"); const { asyncHandler } = require("../middleware/errorHandler"); const { registerValidation, loginValidation, } = require("../middleware/validators/authValidator"); const router = express.Router(); // Get user router.get( "/", auth, asyncHandler(async (req, res) => { const user = await User.findById(req.user.id).select("-password"); res.json(user); }), ); // Register router.post( "/register", registerValidation, asyncHandler(async (req, res) => { const { name, email, password } = req.body; let user = await User.findOne({ email }); if (user) { return res.status(400).json({ success: false, msg: "User already exists" }); } user = new User({ name, email, password, }); const salt = await bcrypt.genSalt(10); user.password = await bcrypt.hash(password, salt); await user.save(); const payload = { user: { id: user.id, }, }; const token = await new Promise((resolve, reject) => { jwt.sign( payload, process.env.JWT_SECRET, { expiresIn: "7d" }, (err, token) => { if (err) reject(err); else resolve(token); }, ); }); res.json({ success: true, token }); }), ); // Login router.post( "/login", loginValidation, asyncHandler(async (req, res) => { const { email, password } = req.body; let user = await User.findOne({ email }); if (!user) { return res.status(400).json({ success: false, msg: "Invalid credentials" }); } const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return res.status(400).json({ success: false, msg: "Invalid credentials" }); } const payload = { user: { id: user.id, }, }; const token = await new Promise((resolve, reject) => { jwt.sign( payload, process.env.JWT_SECRET, { expiresIn: "7d" }, (err, token) => { if (err) reject(err); else resolve(token); }, ); }); res.json({ success: true, token }); }), ); module.exports = router;