60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
const User = require("../models/User");
|
|
const bcrypt = require("bcryptjs");
|
|
const jwt = require("jsonwebtoken");
|
|
const config = require("../config/config.js");
|
|
|
|
const register = async (userData) => {
|
|
const { username, email, password } = userData;
|
|
|
|
const userExists = await User.findOne({ email });
|
|
if (userExists) {
|
|
throw new Error("User already exists");
|
|
}
|
|
|
|
const salt = await bcrypt.genSalt(10);
|
|
const hashedPassword = await bcrypt.hash(password, salt);
|
|
|
|
const user = await User.create({
|
|
username,
|
|
email,
|
|
password: hashedPassword,
|
|
});
|
|
|
|
return {
|
|
_id: user._id,
|
|
username: user.username,
|
|
email: user.email,
|
|
token: generateToken(user._id),
|
|
};
|
|
};
|
|
|
|
const login = async (email, password) => {
|
|
const user = await User.findOne({ email });
|
|
if (!user) {
|
|
throw new Error("Invalid credentials");
|
|
}
|
|
|
|
const isMatch = await bcrypt.compare(password, user.password);
|
|
if (!isMatch) {
|
|
throw new Error("Invalid credentials");
|
|
}
|
|
|
|
return {
|
|
_id: user._id,
|
|
username: user.username,
|
|
email: user.email,
|
|
token: generateToken(user._id),
|
|
};
|
|
};
|
|
|
|
const generateToken = (id) => {
|
|
return jwt.sign({ id }, process.env.JWT_SECRET || "secret_key", {
|
|
expiresIn: "30d",
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
register,
|
|
login,
|
|
};
|