120 lines
4.4 KiB
JavaScript
120 lines
4.4 KiB
JavaScript
import { ProjectModel, VAModel, ClientModel } from "../../models/vaModel.js";
|
|
import { Types } from "mongoose";
|
|
import { updateEntityRelationships } from "../../helper/updateEntityRelationships.js";
|
|
// Register a new VA
|
|
async function project_add_sf(req, res) {
|
|
try {
|
|
const payload = req.body|| {};
|
|
const { name, hourlyRate, clientId, vaAssigned, dedicatedHours } = payload;
|
|
|
|
// Validate required fields
|
|
if (!name) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Project name is required"
|
|
});
|
|
}
|
|
|
|
if (!clientId) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Client ID is required"
|
|
});
|
|
}
|
|
|
|
// Validate and convert clientId to ObjectId
|
|
let clientObjectId;
|
|
try {
|
|
clientObjectId = new Types.ObjectId(clientId);
|
|
} catch (error) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Invalid Client ID format"
|
|
});
|
|
}
|
|
|
|
// Validate and convert vaAssigned to array of ObjectIds
|
|
let vaAssignedArray = [];
|
|
if (vaAssigned) {
|
|
if (Array.isArray(vaAssigned)) {
|
|
try {
|
|
vaAssignedArray = vaAssigned.map(vaId => new Types.ObjectId(vaId));
|
|
} catch (error) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Invalid VA ID format in vaAssigned array"
|
|
});
|
|
}
|
|
} else if (typeof vaAssigned === 'string') {
|
|
// Handle single VA ID as string
|
|
try {
|
|
vaAssignedArray = [new Types.ObjectId(vaAssigned)];
|
|
} catch (error) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: "Invalid VA ID format"
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// sanitize/construct allowed fields
|
|
const toCreate = {
|
|
name: name.trim(),
|
|
hourlyRate: hourlyRate || '0',
|
|
clientId: clientObjectId,
|
|
vaAssigned: vaAssignedArray,
|
|
dedicatedHours: dedicatedHours ? parseFloat(dedicatedHours) : 0,
|
|
};
|
|
|
|
const created = await ProjectModel.create(toCreate);
|
|
|
|
const relationshipUpdate = await updateEntityRelationships({
|
|
project: {
|
|
projectId: created._id,
|
|
clientId: clientObjectId,
|
|
vaId: vaAssignedArray
|
|
}
|
|
});
|
|
|
|
if (!relationshipUpdate.success) {
|
|
console.warn('Project created but relationship update failed:', relationshipUpdate.message);
|
|
}
|
|
|
|
// Send data to Salesforce API after successful registration
|
|
try {
|
|
// const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/`;
|
|
|
|
// const response = await fetch(salesforceUrl, {
|
|
// method: 'POST',
|
|
// headers: {
|
|
// 'Content-Type': 'application/json',
|
|
// },
|
|
// 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 });
|
|
res.status(201).json({ success: true, data: created, relationships: relationshipUpdate });
|
|
} catch (error) {
|
|
console.error("❌ Failed to sync with Salesforce:", error.message);
|
|
|
|
// 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("project_add_sf error:", error);
|
|
return res.status(500).json({ success: false, message: "Internal Server Error" });
|
|
}
|
|
}
|
|
|
|
export { project_add_sf }; |