From 320d44f4b58509b1671b0c6cfc3455570ee821e6 Mon Sep 17 00:00:00 2001 From: =bhagwanSingh Date: Tue, 16 Dec 2025 19:01:13 +0530 Subject: [PATCH] Added authFetch currently getting access toke for all request as health check api is not available on sf ye --- .../project/projectAddSf.controller.js | 2 +- .../project/projectUpdateSf.controller.js | 2 +- .../va/vaAuth/vaLogin.controller.js | 3 +- .../va/vaLeaves/vaLeavesApply.controller.js | 3 +- .../va/vaPayroll/vaPaySlip.controller.js | 3 +- .../vaPayroll/vaPayrollSchedule.controller.js | 2 +- .../va/vaProfile/vaRegister.controller.js | 3 +- .../va/vaProjects/vaProjectLog.controller.js | 9 ++-- .../vaTimesheetAdjustment.controller.js | 3 +- .../va/vaTips/vaTipsManage.controller.js | 5 +- src/models/vaModel.js | 4 +- src/utils/authFetch.js | 49 +++++++++++++++++++ 12 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 src/utils/authFetch.js diff --git a/src/controllers/project/projectAddSf.controller.js b/src/controllers/project/projectAddSf.controller.js index 9bad91a..62ee381 100644 --- a/src/controllers/project/projectAddSf.controller.js +++ b/src/controllers/project/projectAddSf.controller.js @@ -71,7 +71,7 @@ async function project_add_sf(req, res) { hourlyRate: hourlyRate || '0', clientId: clientObjectId, vaAssigned: vaAssigned, - dedicatedHours: dedicatedHours ? parseFloat(dedicatedHours) : 0, + dedicatedHours: dedicatedHours || ["0", "0", "0", "0", "0", "0", "0"], vaWorkingScheduleStart: vaWorkingScheduleStart || null, vaWorkingScheduleEnd: vaWorkingScheduleEnd || null, isFlexibleAllowed: isFlexibleAllowed || true, diff --git a/src/controllers/project/projectUpdateSf.controller.js b/src/controllers/project/projectUpdateSf.controller.js index ff7a035..2896448 100644 --- a/src/controllers/project/projectUpdateSf.controller.js +++ b/src/controllers/project/projectUpdateSf.controller.js @@ -74,7 +74,7 @@ async function update_project_sf(req, res) { // Update dedicated hours if provided if (dedicatedHours !== undefined) { - updateData.dedicatedHours = parseFloat(dedicatedHours) || 0; + updateData.dedicatedHours = dedicatedHours || ["0", "0", "0", "0", "0", "0", "0"]; } // Update total logged hours if provided diff --git a/src/controllers/va/vaAuth/vaLogin.controller.js b/src/controllers/va/vaAuth/vaLogin.controller.js index cff77bc..a95a5ea 100644 --- a/src/controllers/va/vaAuth/vaLogin.controller.js +++ b/src/controllers/va/vaAuth/vaLogin.controller.js @@ -1,6 +1,7 @@ import bcrypt from "bcrypt"; import jwt from "jsonwebtoken"; import { VAModel, LoggedModel, WorkTrackModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // function to close open work tracks and create logout async function closePreviousSession(vaId, lastLog) { @@ -53,7 +54,7 @@ async function closePreviousSession(vaId, lastLog) { "time": logoutLog.time, } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaLeaves/vaLeavesApply.controller.js b/src/controllers/va/vaLeaves/vaLeavesApply.controller.js index b6d6bae..7e86e13 100644 --- a/src/controllers/va/vaLeaves/vaLeavesApply.controller.js +++ b/src/controllers/va/vaLeaves/vaLeavesApply.controller.js @@ -1,5 +1,6 @@ import jwt from "jsonwebtoken"; import { VAModel, LeavesModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // Apply for leave async function va_leave_apply_function(req, res) { @@ -164,7 +165,7 @@ async function va_leave_apply_function(req, res) { "rejectionReason": "" } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaPayroll/vaPaySlip.controller.js b/src/controllers/va/vaPayroll/vaPaySlip.controller.js index 475132d..0842809 100644 --- a/src/controllers/va/vaPayroll/vaPaySlip.controller.js +++ b/src/controllers/va/vaPayroll/vaPaySlip.controller.js @@ -1,4 +1,5 @@ import { VAModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; async function va_payslip_data_function(req, res) { try { @@ -11,7 +12,7 @@ async function va_payslip_data_function(req, res) { const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/va-payslip/${vaId}`; - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaPayroll/vaPayrollSchedule.controller.js b/src/controllers/va/vaPayroll/vaPayrollSchedule.controller.js index 3edd4a3..2f62950 100644 --- a/src/controllers/va/vaPayroll/vaPayrollSchedule.controller.js +++ b/src/controllers/va/vaPayroll/vaPayrollSchedule.controller.js @@ -2,7 +2,7 @@ async function va_payroll_schedule_function(req, res) { try { const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/payroll-schedule`; - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaProfile/vaRegister.controller.js b/src/controllers/va/vaProfile/vaRegister.controller.js index 47b0442..f72ed47 100644 --- a/src/controllers/va/vaProfile/vaRegister.controller.js +++ b/src/controllers/va/vaProfile/vaRegister.controller.js @@ -1,5 +1,6 @@ import bcrypt from "bcrypt"; import { VAModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // Register a new VA async function va_register(req, res) { @@ -53,7 +54,7 @@ async function va_register(req, res) { const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/virtualassistant`; delete created.userDetails._id; created.userDetails._id = created._id; // Include VA's MongoDB ID - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaProjects/vaProjectLog.controller.js b/src/controllers/va/vaProjects/vaProjectLog.controller.js index c456407..60687da 100644 --- a/src/controllers/va/vaProjects/vaProjectLog.controller.js +++ b/src/controllers/va/vaProjects/vaProjectLog.controller.js @@ -1,4 +1,5 @@ import { LoggedModel, WorkTrackModel, ProjectModel, VAModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // Helper function to get start and end of day in UTC function getDayRange(date = new Date()) { @@ -197,7 +198,7 @@ async function closePreviousSession(vaId, lastLog, logTime = new Date()) { "time": logoutLog.time, } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -373,7 +374,7 @@ async function va_project_log_callback(req, res) { "time": createdLog.time, } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -471,7 +472,7 @@ async function va_project_log_callback(req, res) { "time": createdLog.time, } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -533,7 +534,7 @@ async function va_project_log_callback(req, res) { "time": createdLog.time, } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaTimesheetAdjustment/vaTimesheetAdjustment.controller.js b/src/controllers/va/vaTimesheetAdjustment/vaTimesheetAdjustment.controller.js index 8cba7ee..91a745b 100644 --- a/src/controllers/va/vaTimesheetAdjustment/vaTimesheetAdjustment.controller.js +++ b/src/controllers/va/vaTimesheetAdjustment/vaTimesheetAdjustment.controller.js @@ -1,5 +1,6 @@ import jwt from "jsonwebtoken"; import { VAModel, ProjectModel, AdjustedHoursModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // Adjust missing hours by creating new records async function va_timesheet_adjustment_function(req, res) { @@ -155,7 +156,7 @@ async function va_timesheet_adjustment_function(req, res) { "adjustedHours": formatTime(adjustedSeconds) } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/src/controllers/va/vaTips/vaTipsManage.controller.js b/src/controllers/va/vaTips/vaTipsManage.controller.js index bcaf10b..76bd603 100644 --- a/src/controllers/va/vaTips/vaTipsManage.controller.js +++ b/src/controllers/va/vaTips/vaTipsManage.controller.js @@ -1,4 +1,5 @@ import { VAModel, TipsModel, ClientModel } from "../../../models/vaModel.js"; +import authFetch from "../../../utils/authFetch.js"; // Approve or reject leave async function va_tips_manage_function(req, res) { @@ -38,7 +39,7 @@ async function va_tips_manage_function(req, res) { "tipAmount": Number(parseFloat(createdTip.amount).toFixed(2)), // Convert to cents } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -116,7 +117,7 @@ async function va_tips_delete(req, res) { // "tipAmount": Number(parseFloat(createdTip.amount).toFixed(2)), // Convert to cents // } - const response = await fetch(salesforceUrl, { + const response = await authFetch(salesforceUrl, { method: 'DELETE', headers: { 'Content-Type': 'application/json', diff --git a/src/models/vaModel.js b/src/models/vaModel.js index 30138d6..d585f87 100644 --- a/src/models/vaModel.js +++ b/src/models/vaModel.js @@ -101,8 +101,8 @@ const projectSchema = new Schema({ } ], dedicatedHours: { - type: String, - default: "0" + type: Array, + default: ["0", "0", "0", "0", "0", "0", "0"] }, status: { type: String, diff --git a/src/utils/authFetch.js b/src/utils/authFetch.js new file mode 100644 index 0000000..eea6295 --- /dev/null +++ b/src/utils/authFetch.js @@ -0,0 +1,49 @@ +import fetch from "node-fetch"; // or global fetch in Node 18+ + +let options = { + token: '' +} + + +const getAccessToken = async () => { + try { + + + const response = await fetch(`${process.env.SF_DOCTRACKER_API_URL}services/oauth2/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'client_credentials', + client_id: process.env.SF_CLIENT_ID, + client_secret: process.env.SF_CLIENT_SECRET, + }), + }); + + + console.log(response) + options.token = (await response.json()).access_token; + return options.token; + } catch (error) { + console.error('Error fetching access token:', error); + throw error; + } + +}; + +export const authFetch = async (url, options = {}) => { + const token = await getAccessToken(); + + return fetch(url, { + ...options, + headers: { + ...(options.headers || {}), + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }); +}; + +export default authFetch; +export { getAccessToken } \ No newline at end of file