90 lines
3.9 KiB
JavaScript
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 }; |