61 lines
2.1 KiB
JavaScript
61 lines
2.1 KiB
JavaScript
const bcrypt = require("bcryptjs");
|
|
const jwt = require("jsonwebtoken");
|
|
const db = require("../models");
|
|
const sanitize = require("sanitize-html");
|
|
const EstablishmentUser = db.EstablishmentUser;
|
|
const logger = require("../services/logger");
|
|
|
|
const sanitizeStringValue = (value) =>
|
|
typeof value === "string"
|
|
? sanitize(value, { allowedTags: [], allowedAttributes: {} })
|
|
: value;
|
|
|
|
// User Login
|
|
exports.login = async (req, res) => {
|
|
try {
|
|
const email = sanitizeStringValue(req.body.email);
|
|
const password = req.body.password;
|
|
if (!email || !password)
|
|
return res.status(400).send({'status':"failed",'message':"Email and password required",'data': ""});
|
|
|
|
const user = await EstablishmentUser.findOne({ where: { email } });
|
|
if (!user) res.status(404).send({'status':"failed",'message':"User not found",'data': ""});
|
|
|
|
const validPassword = await bcrypt.compare(password, user.password);
|
|
if (!validPassword)
|
|
return res.status(401).json({ message: "Invalid password" });
|
|
// Create JWT token
|
|
const token = jwt.sign(
|
|
{
|
|
id: user.id,
|
|
email: sanitizeStringValue(user.email),
|
|
name: sanitizeStringValue(user.name),
|
|
establishment_id: user.establishment_id
|
|
},
|
|
process.env.JWT_SECRET,
|
|
{ expiresIn: "6h" }
|
|
);
|
|
|
|
res.status(200).send({'status':"success",'message':"Login successful",'data': token });
|
|
|
|
} catch (err) {
|
|
logger.error(err.message);
|
|
logger.error(`Stack trace: ${err.stack}`);
|
|
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
|
}
|
|
};
|
|
|
|
// User Logout (JWT-based — just a client-side operation)
|
|
exports.logout = async (req, res) => {
|
|
try {
|
|
// For JWT, logout is handled on the client (by deleting token)
|
|
// But you can still log or blacklist token if needed
|
|
res.status(200).send({'status':"success",'message':"Logout successful",'data': "" });
|
|
res.status(200).json({ message: "Logout successful (client should discard token)" });
|
|
} catch (err) {
|
|
logger.error(err.message);
|
|
logger.error(`Stack trace: ${err.stack}`);
|
|
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
|
}
|
|
};
|