From adce955f69daf49899d50b30a0fcd875c3c2061e Mon Sep 17 00:00:00 2001 From: Aakash Date: Tue, 4 Nov 2025 20:01:02 +0530 Subject: [PATCH] Added login and refresh token routes --- src/controllers/va.controller.js | 87 ++++++++++++++++++++++++++++---- src/routes/v1/va.routes.js | 6 ++- 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/controllers/va.controller.js b/src/controllers/va.controller.js index 69171db..4555cd7 100644 --- a/src/controllers/va.controller.js +++ b/src/controllers/va.controller.js @@ -86,7 +86,8 @@ async function va_register(req, res) { // Login VA async function va_login_callback(req, res) { try { - const payload = req.body ? JSON.parse(req.body) : {}; + // const payload = req.body ? JSON.parse(req.body) : {}; + const payload = req.body || {}; const { userDetails } = payload; 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" }); } - // Generate JWT token with 24h expiry - const token = jwt.sign( + // Generate JWT accessToken with 24h expiry + const accessToken = jwt.sign( { id: user._id, email: user.userDetails.email, name: user.userDetails.firstName, }, - process.env.JWT_SECRET, // e.g. "mySuperSecretKey" + process.env.JWT_SECRET_ACCESS_TOKEN || "DocTrackerSecretKey", { 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({ success: true, message: "Login successful", - token, + accessToken, + refreshToken, user: { id: user._id, name: user.userDetails.firstName, 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) { console.error("va_register error:", error); return res.status(500).json({ success: false, message: "Internal Server Error" }); @@ -420,5 +486,6 @@ export { va_filter_search, va_register, va_projects_callback, - va_login_callback + va_login_callback, + va_refresh_token_callback }; diff --git a/src/routes/v1/va.routes.js b/src/routes/v1/va.routes.js index 1009aba..be2c8b0 100644 --- a/src/routes/v1/va.routes.js +++ b/src/routes/v1/va.routes.js @@ -1,11 +1,13 @@ import express from "express"; 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("/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