98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
const status = require("../util/statuses");
|
|
const bcrypt = require('bcrypt');
|
|
const joi = require("joi");
|
|
const salt = 12;
|
|
|
|
module.exports = (users) => {
|
|
const router = require("express").Router();
|
|
|
|
router.get("/logout", (req, res) => {
|
|
req.session.destroy();
|
|
return res.redirect('/login');
|
|
});
|
|
|
|
router.post("/login", async (req, res) => {
|
|
|
|
const credentialSchema = joi.object({
|
|
email: joi.string().email().required(),
|
|
password: joi.string().max(20).required(),
|
|
});
|
|
|
|
const valid = credentialSchema.validate(req.body);
|
|
|
|
if (valid.err) {
|
|
req.session.errMessage = "Invalid input";
|
|
res.status(status.BadRequest);
|
|
return res.redirect("/login");
|
|
}
|
|
|
|
users.findOne({ "email": req.body.email }).then((user) => {
|
|
if (!user) {
|
|
req.session.errMessage = "User not found";
|
|
res.status(status.NotFound);
|
|
return res.redirect("/login");
|
|
}
|
|
|
|
if (!bcrypt.compareSync(req.body.password, user.password)) {
|
|
req.session.errMessage = "Incorrect password";
|
|
res.status(status.Unauthorized);
|
|
return res.redirect("/login");
|
|
}
|
|
|
|
console.log("User logged in successfully");
|
|
console.log("User email: " + req.body.email);
|
|
req.session.authenticated = true;
|
|
req.session.email = req.body.email;
|
|
req.session.errMessage = "";
|
|
res.redirect("/home");
|
|
return res.status(status.Ok);
|
|
});
|
|
});
|
|
|
|
router.post("/signup", async (req, res) => {
|
|
const userSchema = joi.object({
|
|
email: joi.string().email().required(),
|
|
// name: joi.string().alphanum().max(20).required(),
|
|
password: joi.string().max(20).min(8).required(),
|
|
repassword: joi.string().max(20).min(8).required(),
|
|
});
|
|
|
|
const valid = userSchema.validate(req.body);
|
|
|
|
if (valid.err) {
|
|
req.session.errMessage = "Invalid input",
|
|
res.status(status.BadRequest);
|
|
return res.redirect("/signup");
|
|
}
|
|
|
|
if (req.body.password != req.body.repassword) {
|
|
req.session.errMessage = "Passwords must match";
|
|
res.status(status.BadRequest);
|
|
return res.redirect("/signup");
|
|
}
|
|
|
|
let hashedPassword = await bcrypt.hashSync(req.body.password, salt);
|
|
|
|
users.insertOne({
|
|
email: req.body.email,
|
|
// name: req.body.name,
|
|
password: hashedPassword,
|
|
}).then((results, err) => {
|
|
if (err) {
|
|
res.status(status.InternalServerError);
|
|
console.error(err);
|
|
return res.send("Internal server error");
|
|
}
|
|
|
|
req.session.authenticated = true;
|
|
req.session.email = req.body.email;
|
|
|
|
req.session.errMessage = "";
|
|
res.status(status.Ok);
|
|
return res.redirect("/home");
|
|
});
|
|
});
|
|
|
|
return router;
|
|
}
|