From 6358564131cb554c0c89f6007e63104eca0ccabd Mon Sep 17 00:00:00 2001 From: =bhagwanSingh Date: Wed, 12 Nov 2025 20:05:09 +0530 Subject: [PATCH] Socket Update and Client Login UI --- ngrok.yml | 9 + public/images/logo-white-vertical.svg | 1 + .../vaProjects/vaProjectLogList.controller.js | 8 +- src/server.js | 60 ++++- views/client_login.ejs | 253 ++++++++++++++++++ views/va_live_tracker.ejs | 232 ++++++++-------- 6 files changed, 436 insertions(+), 127 deletions(-) create mode 100644 ngrok.yml create mode 100644 public/images/logo-white-vertical.svg create mode 100644 views/client_login.ejs diff --git a/ngrok.yml b/ngrok.yml new file mode 100644 index 0000000..85ccd67 --- /dev/null +++ b/ngrok.yml @@ -0,0 +1,9 @@ +version: 2 +authtoken: 2gibp9BBceUJDZtNScqH5ivAUTA_2EVNSsmY6HkNYuY6aw7a4 +tunnels: + myapp: + proto: http + addr: 3000 + hostname: wired-terminally-muskrat.ngrok-free.app + # No bind_tls here! + # Optionally, you can specify 'scheme: https' diff --git a/public/images/logo-white-vertical.svg b/public/images/logo-white-vertical.svg new file mode 100644 index 0000000..c84b182 --- /dev/null +++ b/public/images/logo-white-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/controllers/va/vaProjects/vaProjectLogList.controller.js b/src/controllers/va/vaProjects/vaProjectLogList.controller.js index be7b7fb..a168c72 100644 --- a/src/controllers/va/vaProjects/vaProjectLogList.controller.js +++ b/src/controllers/va/vaProjects/vaProjectLogList.controller.js @@ -52,7 +52,13 @@ async function va_projects_log_list_function(req, res) { projectList = [project]; } else { - projectList = await ProjectModel.find({ vaAssigned: vaId }); + + const all = await ProjectModel.find().lean(); + console.log(all.map(p => p.vaAssigned)); + + console.log("VA ID:", vaId.toString()); + + projectList = await ProjectModel.find({ vaAssigned: vaUser._id }); } if (!projectList.length) { diff --git a/src/server.js b/src/server.js index 7907508..7474313 100644 --- a/src/server.js +++ b/src/server.js @@ -17,6 +17,8 @@ import fs from "node:fs" import apiRoutes from './routes/index.js' +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + dotenv.config() const app = express(); @@ -55,13 +57,19 @@ app.get('/health', (req, res) => { res.status(201).send({ status: "Server is healthy" }); }) -app.get("/live", (req, res) => { - res.render("va_live_tracker") +app.get("/client/login", (req, res) => { + res.render("client_login") +}) + +app.get("/live/:projectId", (req, res) => { + const { projectId } = req.params; + res.render("va_live_tracker", { title: "VA Live Tracker", projectId }) }) // Handling Socket import jwt from "jsonwebtoken"; import { VAModel, ProjectModel, ClientModel } from './models/vaModel.js'; +import { ObjectId } from 'mongodb/lib/bson.js'; const vaSocketRespectToClient = new Map(); @@ -70,6 +78,7 @@ io.use(async (socket, next) => { try { const token = socket.handshake.auth?.token; const projectId = socket.handshake.auth?.projectId; + const userType = socket.handshake.auth?.userType; console.log("🔐 Received token:", token); @@ -84,32 +93,59 @@ io.use(async (socket, next) => { } /* ---------------------- 1️⃣ Check if VA ---------------------- */ - const vaUser = await VAModel.findOne({ "userDetails.email": decoded.email }); - const clientData = await ClientModel.findOne({ "projectIds": projectId }); - const vaProjClientId = clientData._id; + let vaUser = null; + let clientData = null; + + if (userType === "va") { + vaUser = await VAModel.findOne({ "userDetails.email": decoded.email }); + clientData = await ProjectModel.findById(projectId).populate("clientId"); + } else if (userType === "client") { + clientData = await ProjectModel.findById(projectId).populate("clientId"); + } + + if (clientData == null) return next(new Error("Invalid Project ID")); + const vaProjClientId = clientData.clientId._id; if (vaUser && vaUser.accessToken === token) { socket.data.role = "va"; socket.data.vaId = vaUser._id.toString(); socket.data.vaEmail = decoded.email; - - vaSocketRespectToClient.set(vaProjClientId, socket.id) + + const a = vaProjClientId.toString(); + const b = clientData.clientId._id.toString(); + const c = JSON.stringify(clientData); + + console.log(a, b, c, "vaProjClientId vs clientData.clientId"); + + vaSocketRespectToClient.set(vaProjClientId.toString(), socket.id) console.log("✅ Authenticated VA:", vaUser.userDetails.email); return next(); } /* ---------------------- 2️⃣ Check if Client ---------------------- */ - const clientUser = await ClientModel.findOne({ "userDetails.email": decoded.email }); + // const clientUser = await ClientModel.findOne({ "userDetails.email": decoded.email }); + + // if (clientUser) { + // socket.data.role = "client"; + // socket.data.clientId = clientUser._id.toString(); + + // // Get all VA IDs assigned to this client + // socket.data.allowedVAs = clientUser.vaIds.map((va) => va.toString()); + + // console.log("✅ Authenticated Client:", clientUser.userDetails.email); + // return next(); + // } + const clientUser = clientData.clientId; if (clientUser) { socket.data.role = "client"; socket.data.clientId = clientUser._id.toString(); // Get all VA IDs assigned to this client - socket.data.allowedVAs = clientUser.vaIds.map((va) => va.toString()); + socket.data.allowedVAs = clientData.vaAssigned.map((va) => va.toString()); - console.log("✅ Authenticated Client:", clientUser.userDetails.email); + // console.log("✅ Authenticated Client:", clientUser.userDetails.email); return next(); } @@ -189,8 +225,10 @@ io.on("connection", (socket) => { socket.on("selectApp", ({ appTitle, clientId }) => { console.log(`VA selected app: ${appTitle}`); + const sssrrrr = vaSocketRespectToClient.get(clientId); + console.log(vaSocketRespectToClient.get(clientId), sssrrrr, "vaSocketRespectToClient[clientId]") // You can forward this info to the respective Electron client - socket.to(vaSocketRespectToClient[clientId]).emit("appToCapture", { appTitle }); + socket.to(vaSocketRespectToClient.get(clientId)).emit("appToCapture", { appTitle }); }); socket.on("getVisibleApps", async ({ token, apps }) => { diff --git a/views/client_login.ejs b/views/client_login.ejs new file mode 100644 index 0000000..1db99a0 --- /dev/null +++ b/views/client_login.ejs @@ -0,0 +1,253 @@ + + + + + + + DocVA | Login + + + + + + + +
+

Log in to your account to continue

+ +
+ + + Forgot password? + + + +
OR
+ + +
+
+ + + + + \ No newline at end of file diff --git a/views/va_live_tracker.ejs b/views/va_live_tracker.ejs index dc1eb4d..3539a88 100644 --- a/views/va_live_tracker.ejs +++ b/views/va_live_tracker.ejs @@ -2,140 +2,142 @@ - - Live Screen Feed - + .no-image { + font-size: 14px; + color: #888; + } + - + -
-

Select an app to view

- Waiting for image... -
+
+

Select an app to view

+ Waiting for image... +
- - + + // 🟣 Receive images only for the selected app + socket.on("receiveImage", (base64, title) => { + if (currentApp && title === currentApp) { + liveImage.src = base64; + liveImage.classList.remove("no-image"); + } + }); + - + \ No newline at end of file