Files
ChessHub/backend/routes/auth.js
T
2023-07-02 14:50:35 +05:30

81 lines
2.5 KiB
JavaScript

const express = require("express");
const { createJSONToken, isValidPassword, validateJSONToken, generatePasswordHash } = require("../util/auth");
const { isValidEmail, isValidText } = require("../util/validation");
const { User } = require("../models/user");
const router = express.Router();
router.post("/signup", async (req, res, next) => {
console.log(req.body);
const data = { email: req.body.email, password: req.body.password, username: req.body.username };
let errors = {};
if (!isValidEmail(data.email)) {
errors.email = "Invalid email.";
} else {
try {
let user = await User.findOne({ email: data.email });
if (user) {
errors.email = "Email exists already.";
}
} catch (error) {
throw error;
}
}
if (!isValidText(data.password, 6)) {
errors.password = "Password must be at least 6 characters long.";
}
let user = await User.findOne({ username: data.username });
if (user) errors.username = "Username already exists";
if (Object.keys(errors).length > 0) {
console.log(errors);
return res.status(422).json({
message: "User signup failed due to validation errors.",
errors,
});
}
try {
let userData = {
email: data.email,
username: data.username,
password_hash: await generatePasswordHash(data.password),
};
userDoc = new User(userData);
await userDoc.save();
const authToken = createJSONToken(userDoc.id);
res.status(201).json({ message: "User created.", user: userDoc, token: authToken });
} catch (error) {
next(error);
}
});
router.post("/login", async (req, res) => {
const username = req.body.username;
const password = req.body.password;
let user;
try {
user = await User.findOne({ username });
if (!user) return res.status(401).json({ message: "User not found" });
} catch (error) {
return res.status(401).json({ message: "AutheFntication failed." });
}
const pwIsValid = await isValidPassword(password, user.password_hash);
if (!pwIsValid) {
return res.status(422).json({
message: "Invalid credentials.",
errors: { credentials: "Invalid email or password entered." },
});
}
const token = createJSONToken(user.id);
return res.json({ token, user });
});
module.exports = router;