va-tracker-middleware/src/helper/updateEntityRelationships.js

346 lines
12 KiB
JavaScript

import { ClientModel, VAModel, ProjectModel } from "../models/vaModel.js";
/**
* Generic function to update relationships between Client, VA, and Project
* @param {Object} data - The update data object
* @returns {Object} - Result of the update operations
*/
async function updateEntityRelationships(data) {
try {
let results = {};
// Handle Project updates
if (data.project) {
const { projectId, vaId, clientId } = data.project;
if (!projectId) {
throw new Error('Project ID is required for project updates');
}
// Update Client with projectId
if (clientId) {
const clientUpdate = await ClientModel.findByIdAndUpdate(
clientId,
{
$addToSet: {
projectIds: projectId,
vaIds: vaId
}
},
{ new: true }
);
results.clientUpdate = clientUpdate ? 'Client updated successfully' : 'Client not found';
}
// Update VAs with projectId
if (vaId && Array.isArray(vaId) && vaId.length > 0) {
const vaUpdateResult = await VAModel.updateMany(
{ _id: { $in: vaId } },
{
$addToSet: {
projectIds: projectId,
clientIds: clientId
}
}
);
results.vaUpdate = `Updated ${vaUpdateResult.modifiedCount} VAs`;
}
// // Update Project with clientId and vaId
// const projectUpdateData = {};
// if (clientId) {
// projectUpdateData.clientId = clientId;
// }
// // 🐞🐞🐞 Here Duplicate Entry of Va is Created if SF pass same va multiple times in same req
// if (vaId && Array.isArray(vaId)) {
// projectUpdateData.vaAssigned = vaId;
// }
// if (Object.keys(projectUpdateData).length > 0) {
// const projectUpdate = await ProjectModel.findByIdAndUpdate(
// projectId,
// projectUpdateData,
// { new: true }
// );
// results.projectUpdate = projectUpdate ? 'Project updated successfully' : 'Project not found';
// }
if (vaId && Array.isArray(vaId)) {
await ProjectModel.findByIdAndUpdate(
projectId,
{ $addToSet: { vaAssigned: { $each: vaId } } }
);
}
// Update other fields normally
const projectUpdateData = {};
if (clientId) {
projectUpdateData.clientId = clientId;
}
if (Object.keys(projectUpdateData).length > 0) {
const projectUpdate = await ProjectModel.findByIdAndUpdate(
projectId,
projectUpdateData,
{ new: true }
);
results.projectUpdate = projectUpdate ? 'Project updated successfully' : 'Project not found';
}
}
// Handle VA updates
if (data.va) {
const { vaId, projectId, clientId } = data.va;
if (!vaId) {
throw new Error('VA ID is required for VA updates');
}
// Update Projects with vaId
if (projectId && Array.isArray(projectId) && projectId.length > 0) {
const projectUpdateResult = await ProjectModel.updateMany(
{ _id: { $in: projectId } },
{
$addToSet: {
vaAssigned: vaId
}
}
);
results.projectUpdate = `Updated ${projectUpdateResult.modifiedCount} projects`;
}
// Update Clients with vaId
if (clientId && Array.isArray(clientId) && clientId.length > 0) {
const clientUpdateResult = await ClientModel.updateMany(
{ _id: { $in: clientId } },
{
$addToSet: {
vaIds: vaId
}
}
);
results.clientUpdate = `Updated ${clientUpdateResult.modifiedCount} clients`;
}
// Update VA with clientId and projectId
const vaUpdateData = {};
if (clientId && Array.isArray(clientId)) {
vaUpdateData.clientIds = clientId;
}
if (projectId && Array.isArray(projectId)) {
vaUpdateData.projectIds = projectId;
}
if (Object.keys(vaUpdateData).length > 0) {
const vaUpdate = await VAModel.findByIdAndUpdate(
vaId,
{ $addToSet: vaUpdateData },
{ new: true }
);
results.vaUpdate = vaUpdate ? 'VA updated successfully' : 'VA not found';
}
}
// Handle Client updates
if (data.client) {
const { clientId, projectId, vaId } = data.client;
if (!clientId) {
throw new Error('Client ID is required for client updates');
}
// Update Projects with clientId
if (projectId && Array.isArray(projectId) && projectId.length > 0) {
const projectUpdateResult = await ProjectModel.updateMany(
{ _id: { $in: projectId } },
{ clientId: clientId }
);
results.projectUpdate = `Updated ${projectUpdateResult.modifiedCount} projects`;
}
// Update VAs with clientId
if (vaId && Array.isArray(vaId) && vaId.length > 0) {
const vaUpdateResult = await VAModel.updateMany(
{ _id: { $in: vaId } },
{
$addToSet: {
clientIds: clientId
}
}
);
results.vaUpdate = `Updated ${vaUpdateResult.modifiedCount} VAs`;
}
// Update Client with projectId and vaId
const clientUpdateData = {};
if (projectId && Array.isArray(projectId)) {
clientUpdateData.projectIds = projectId;
}
if (vaId && Array.isArray(vaId)) {
clientUpdateData.vaIds = vaId;
}
if (Object.keys(clientUpdateData).length > 0) {
const clientUpdate = await ClientModel.findByIdAndUpdate(
clientId,
{ $addToSet: clientUpdateData },
{ new: true }
);
results.clientUpdate = clientUpdate ? 'Client updated successfully' : 'Client not found';
}
}
return {
success: true,
message: 'Relationships updated successfully',
results
};
} catch (error) {
console.error('Error updating entity relationships:', error);
return {
success: false,
message: error.message,
results: {}
};
}
}
/**
* Remove relationships (for deletion cases)
* @param {Object} data - The removal data object
* @returns {Object} - Result of the removal operations
*/
async function removeEntityRelationships(data) {
try {
let results = {};
// Handle Project removal
if (data.project) {
const { projectId, vaId, clientId } = data.project;
if (!projectId) {
throw new Error('Project ID is required for project removal');
}
// Remove projectId from Client
if (clientId) {
await ClientModel.findByIdAndUpdate(
clientId,
{$pull: {
projectIds: projectId,
vaIds: vaId
}}
);
}
// Remove projectId from VAs
if (vaId && Array.isArray(vaId)) {
// await VAModel.updateMany(
// { _id: { $in: vaId } },
// { $pull: {
// projectIds: projectId,
// // 🐞🐞🐞 Here before removing we need to check if VA is still assigned to other projects of the same client
// clientIds: clientId
// }}
// );
for (const va of vaId) {
// Check if VA is still assigned to other projects of the same client
const otherProjectsWithSameClient = await ProjectModel.countDocuments({
_id: { $ne: projectId },
clientId: clientId,
vaAssigned: va
});
// Prepare update operation
const updateOperation = {
$pull: { projectIds: projectId }
};
// Only remove clientId if VA is not assigned to any other projects from this client
if (!otherProjectsWithSameClient) {
updateOperation.$pull = {
...updateOperation.$pull,
clientIds: clientId
};
}
await VAModel.findByIdAndUpdate(va, updateOperation);
}
}
results.projectRemoval = 'Project relationships removed successfully';
}
// Handle VA removal
if (data.va) {
const { vaId, projectId, clientId } = data.va;
if (!vaId) {
throw new Error('VA ID is required for VA removal');
}
// Remove vaId from Projects
if (projectId && Array.isArray(projectId)) {
await ProjectModel.updateMany(
{ _id: { $in: projectId } },
{ $pull: { vaAssigned: vaId } }
);
}
// Remove vaId from Clients
if (clientId && Array.isArray(clientId)) {
await ClientModel.updateMany(
{ _id: { $in: clientId } },
{ $pull: { vaIds: vaId } }
);
}
results.vaRemoval = 'VA relationships removed successfully';
}
// Handle Client removal
if (data.client) {
const { clientId, projectId, vaId } = data.client;
if (!clientId) {
throw new Error('Client ID is required for client removal');
}
// Remove clientId from Projects
if (projectId && Array.isArray(projectId)) {
await ProjectModel.updateMany(
{ _id: { $in: projectId } },
{ clientId: null }
);
}
// Remove clientId from VAs
if (vaId && Array.isArray(vaId)) {
await VAModel.updateMany(
{ _id: { $in: vaId } },
{ $pull: { clientIds: clientId } }
);
}
results.clientRemoval = 'Client relationships removed successfully';
}
return {
success: true,
message: 'Relationships removed successfully',
results
};
} catch (error) {
console.error('Error removing entity relationships:', error);
return {
success: false,
message: error.message,
results: {}
};
}
}
export { updateEntityRelationships, removeEntityRelationships };