import jwt from "jsonwebtoken"; import { VAModel, ClientModel } from "../models/vaModel.js"; import logger from "../config/logger.js"; async function authValidator(req, res, next) { try { const sf_token = req.headers.sf_token; if (sf_token) { const { vaId } = req.params; if(vaId) req.body.vaId = vaId; next(); } else { const accessToken = req.headers.token; if (!accessToken) return res.status(401).json({ success: false, message: "Not Authorized" }); // return res.status(200).json({ // success: true, // message: "Log Out Successfull", // }); const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN); if (decoded && ("id" in decoded) && decoded.id !== null && ("email" in decoded)) { const vaEmail = decoded.email; const vaUser = await VAModel.findOne({ "userDetails.email": vaEmail }) if (!vaUser) { return res.status(401).json({ success: false, message: "Not Authorized" }); } if (!("accessToken" in vaUser) || !vaUser.accessToken) { return res.status(401).json({ success: false, message: "Not Authorized" }); } if (vaUser.accessToken === accessToken) { req.body.vaId = vaUser._id req.body.vaEmail = vaEmail next(); } else { return res.status(401).json({ success: false, message: "Not Authorized" }); } } } } catch (error) { logger.error("AuthValidator - Middleware (CATCH Block)", error.message); return res.send(401).status({ "message": error.message }) } } async function clientAuthValidator(req, res, next) { try { const accessToken = req.headers.token; if (!accessToken) { return res.status(401).json({ success: false, message: "Not Authorized" }); } const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN); if (decoded && decoded.id && decoded.email) { const clientEmail = decoded.email; const clientUser = await ClientModel.findOne({ "userDetails.email": clientEmail }); if (!clientUser) { return res.status(401).json({ success: false, message: "Not Authorized" }); } if (!clientUser.accessToken || clientUser.accessToken !== accessToken) { return res.status(401).json({ success: false, message: "Not Authorized" }); } // Attach client info to request object for use in subsequent middleware/controllers req.body.clientId = clientUser._id; req.body.clientEmail = clientEmail; req.body.clientName = decoded.name; next(); } else { return res.status(401).json({ success: false, message: "Not Authorized" }); } } catch (error) { logger.error("clientAuthValidator - Middleware (CATCH Block)", error.message); if (error.name === "TokenExpiredError") { return res.status(401).json({ success: false, message: "Token expired" }); } if (error.name === "JsonWebTokenError") { return res.status(401).json({ success: false, message: "Invalid token" }); } return res.status(401).json({ success: false, message: "Authentication failed" }); } } export { authValidator, clientAuthValidator }