Added login and refresh token routes

This commit is contained in:
Aakash Mittal 2025-11-04 20:01:02 +05:30
parent 48276d7161
commit adce955f69
2 changed files with 81 additions and 12 deletions

View File

@ -86,7 +86,8 @@ async function va_register(req, res) {
// Login VA // Login VA
async function va_login_callback(req, res) { async function va_login_callback(req, res) {
try { try {
const payload = req.body ? JSON.parse(req.body) : {}; // const payload = req.body ? JSON.parse(req.body) : {};
const payload = req.body || {};
const { userDetails } = payload; const { userDetails } = payload;
if (!userDetails || !userDetails.email || !userDetails.password) { if (!userDetails || !userDetails.email || !userDetails.password) {
@ -112,32 +113,97 @@ async function va_login_callback(req, res) {
return res.status(401).json({ success: false, message: "Invalid password" }); return res.status(401).json({ success: false, message: "Invalid password" });
} }
// Generate JWT token with 24h expiry // Generate JWT accessToken with 24h expiry
const token = jwt.sign( const accessToken = jwt.sign(
{ {
id: user._id, id: user._id,
email: user.userDetails.email, email: user.userDetails.email,
name: user.userDetails.firstName, name: user.userDetails.firstName,
}, },
process.env.JWT_SECRET, // e.g. "mySuperSecretKey" process.env.JWT_SECRET_ACCESS_TOKEN || "DocTrackerSecretKey",
{ expiresIn: "24h" } { expiresIn: "24h" }
); );
// Return token and user info // Generate JWT refreshToken with 24h expiry
const refreshToken = jwt.sign(
{
id: user._id,
email: user.userDetails.email,
name: user.userDetails.firstName,
},
process.env.JWT_SECRET_REFRESH_TOKEN || "DocTrackerSecretKeyRefreshToken",
{ expiresIn: "30d" }
);
// Return accessToken and user info
return res.status(200).json({ return res.status(200).json({
success: true, success: true,
message: "Login successful", message: "Login successful",
token, accessToken,
refreshToken,
user: { user: {
id: user._id, id: user._id,
name: user.userDetails.firstName, name: user.userDetails.firstName,
email: user.userDetails.email, email: user.userDetails.email,
}, },
}); });
} catch (error) {
console.error("va_register error:", error);
return res.status(500).json({ success: false, message: "Internal Server Error" });
}
}
return res.status(201).json({ success: true, data: 'created' }); // Refresh Token VA
async function va_refresh_token_callback(req, res) {
try {
const { refreshToken } = req.body || {};
if (!refreshToken) {
return res.status(400).json({
success: false,
message: "Refresh token missing",
});
}
// 🔍 Verify refresh token
jwt.verify(
refreshToken,
process.env.JWT_SECRET_REFRESH_TOKEN || "DocTrackerSecretKeyRefreshToken",
async (err, decoded) => {
if (err) {
return res.status(403).json({
success: false,
message: "Invalid or expired refresh token",
});
}
// Check if user still exists
const user = await VAModel.findById(decoded.id);
if (!user) {
return res.status(404).json({
success: false,
message: "User no longer exists",
});
}
// Generate a new access token
const newAccessToken = jwt.sign(
{
id: user._id,
email: user.userDetails.email,
name: user.userDetails.firstName,
},
process.env.JWT_SECRET_ACCESS_TOKEN || "DocTrackerAccessKey",
{ expiresIn: "24h" }
);
return res.status(200).json({
success: true,
message: "New access token generated",
accessToken: newAccessToken,
});
}
);
} catch (error) { } catch (error) {
console.error("va_register error:", error); console.error("va_register error:", error);
return res.status(500).json({ success: false, message: "Internal Server Error" }); return res.status(500).json({ success: false, message: "Internal Server Error" });
@ -420,5 +486,6 @@ export {
va_filter_search, va_filter_search,
va_register, va_register,
va_projects_callback, va_projects_callback,
va_login_callback va_login_callback,
va_refresh_token_callback
}; };

View File

@ -1,11 +1,13 @@
import express from "express"; import express from "express";
const vaRoutes = express.Router(); const vaRoutes = express.Router();
import { va_callback, va_username_callback, va_clients_callback, va_clients_projects_callback, va_log_callback, va_project_log_callback, va_filter_search, va_projects_callback, va_register, va_login_callback } from "../../controllers/va.controller.js"; import { va_callback, va_username_callback, va_clients_callback, va_clients_projects_callback, va_log_callback, va_project_log_callback, va_filter_search, va_projects_callback, va_register, va_login_callback, va_refresh_token_callback } from "../../controllers/va.controller.js";
vaRoutes.get("/", va_callback); // VA Callback for getting active VA vaRoutes.get("/", va_callback); // VA Callback for getting active VA
vaRoutes.get("/login", va_login_callback); // VA Callback for login VA vaRoutes.post("/login", va_login_callback); // VA Callback for login VA
vaRoutes.post("/refreshToken", va_refresh_token_callback); // VA Callback for refresh token
vaRoutes.post("/register", va_register); // Register a new VA vaRoutes.post("/register", va_register); // Register a new VA