va-tracker-middleware/src/controllers/va/vaProfile/vaRegister.controller.js

90 lines
3.9 KiB
JavaScript

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) {
try {
const payload = req.body|| {};
const { userDetails } = payload;
if (!userDetails || !userDetails.email || !userDetails.firstName || !userDetails.password) {
return res.status(400).json({ success: false, message: "Missing required fields" });
}
// ✅ Check if user already exists by email
const existingUser = await VAModel.findOne({ "userDetails.email": userDetails.email.toLowerCase() });
if (existingUser) {
return res.status(409).json({ success: false, message: "User already exists with this email" });
}
const saltRounds = 10;
const hashedPassword = await bcrypt.hash(userDetails.password, saltRounds);
// sanitize/construct allowed fields
const toCreate = {
userDetails: {
firstName: userDetails.firstName,
lastName: userDetails.lastName || "",
email: userDetails.email,
dob: userDetails.dob || null,
age: userDetails.age || null,
address: userDetails.address || null,
city: userDetails.city || null,
state: userDetails.state || null,
country: userDetails.country || null,
password: hashedPassword,
paymentMethod: userDetails.paymentMethod || null,
payoneerAccount: userDetails.payoneerAccount || null,
veemAccount: userDetails.veemAccount || null,
wiseEmail: userDetails.wiseEmail || null,
phone: userDetails.phone || null,
skype: userDetails.skype || null,
},
tracking: payload.tracking || undefined,
clientIds: payload.clientIds || [],
schedule: payload.schedule || undefined,
status: payload.status || "FULLTIME",
};
const created = await VAModel.create(toCreate);
// Send data to Salesforce API after successful registration
try {
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 authFetch(salesforceUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// Add any required headers for Salesforce authentication
// 'Authorization': 'Bearer ' + process.env.SF_ACCESS_TOKEN
},
body: JSON.stringify(created)
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`);
}
const result = await response.json();
console.log("✅ Successfully synced VA data to Salesforce:", result);
res.status(201).json({ success: true, data: created, SyncSalesforce: result });
} catch (error) {
console.error("❌ Failed to sync with Salesforce:", error.message);
await VAModel.findOneAndDelete({_id: created.userDetails._id});
// Create a custom error to distinguish Salesforce errors
const salesforceError = new Error(`Salesforce sync failed: ${error.message}`);
salesforceError.isSalesforceError = true;
throw salesforceError;
}
} catch (error) {
console.error("va_register error:", error);
return res.status(500).json({ success: false, message: "Internal Server Error" });
}
}
export { va_register };