create-auth-backend-cli
Version:
CLI to scaffold a Node.js Auth backend with Express, JWT, MongoDB
99 lines (83 loc) • 2.57 kB
JavaScript
const User = require("../models/User");
const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
exports.register = async (req, res) => {
try {
const { name, email, password, role } = req.body;
// 1. Validate required fields
if (!name || !email || !password) {
return res.status(400).json({ error: "Name, email, and password are required" });
}
// 2. Password length check
if (password.length < 6) {
return res.status(400).json({ error: "Password must be at least 6 characters" });
}
// 3. Check if email already exists
const existingUser = await User.findOne({ email });
if (existingUser) {
return res.status(409).json({ error: "Email already in use" });
}
// 4. Hash password
const hashedPassword = await bcrypt.hash(password, 10);
// 5. Create user
const user = await User.create({
name,
email,
password: hashedPassword,
role: role || "user" // default to "user" if not provided
});
// 6. Return success (exclude password)
res.status(201).json({
message: "User registered successfully",
user: {
id: user._id,
name: user.name,
email: user.email,
role: user.role,
createdAt: user.createdAt
}
});
} catch (err) {
console.error(err);
res.status(500).json({ error: "Server error" });
}
};
exports.login = async (req, res) => {
try {
const { email, password } = req.body;
// 1. Validate fields
if (!email || !password) {
return res.status(400).json({ error: "Email and password are required" });
}
// 2. Find user
const user = await User.findOne({ email });
if (!user) {
return res.status(401).json({ error: "Invalid credentials" });
}
// 3. Compare password
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(401).json({ error: "Invalid credentials" });
}
// 4. Sign JWT with role
const token = jwt.sign(
{ id: user._id, role: user.role },
process.env.JWT_SECRET,
{ expiresIn: "1d" }
);
// 5. Send token + user info
res.json({
message: "Login successful",
token,
user: {
id: user._id,
name: user.name,
email: user.email,
role: user.role
}
});
} catch (err) {
console.error(err);
res.status(500).json({ error: "Server error" });
}
};