81 lines
2.5 KiB
JavaScript
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;
|