Skip to content

Commit

Permalink
refactored project reosurce mapping logic (#1204)
Browse files Browse the repository at this point in the history
* refactored project reosurce mapping logic

* added new function ot search project after campaign creation time

* added reference id  params in project search

* added logic for adding resources only for newly created projects

* refactored and code clean up for project resource mapppings in update and create flow

* refactor getProjectMappingBody func

* some condition check

* correction

* removed project departments
  • Loading branch information
nitish-egov authored Dec 3, 2024
1 parent c587a40 commit 776fb5f
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 76 deletions.
24 changes: 12 additions & 12 deletions health-services/project-factory/src/server/api/campaignApis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1846,21 +1846,21 @@ async function projectCreate(projectCreateBody: any, request: any) {
logger.info(
`for boundary type ${projectCreateResponse?.Project[0]?.address?.boundaryType} and code ${projectCreateResponse?.Project[0]?.address?.boundary}`
);
if (
!request.body.newlyCreatedBoundaryProjectMap[
projectCreateBody?.Projects?.[0]?.address?.boundary
]
) {
request.body.newlyCreatedBoundaryProjectMap[
projectCreateBody?.Projects?.[0]?.address?.boundary
] = {};
}
// if (
// !request.body.newlyCreatedBoundaryProjectMap[
// projectCreateBody?.Projects?.[0]?.address?.boundary
// ]
// ) {
// request.body.newlyCreatedBoundaryProjectMap[
// projectCreateBody?.Projects?.[0]?.address?.boundary
// ] = {};
// }
request.body.boundaryProjectMapping[
projectCreateBody?.Projects?.[0]?.address?.boundary
].projectId = projectCreateResponse?.Project[0]?.id;
request.body.newlyCreatedBoundaryProjectMap[
projectCreateBody?.Projects?.[0]?.address?.boundary
].projectId = projectCreateResponse?.Project[0]?.id;
// request.body.newlyCreatedBoundaryProjectMap[
// projectCreateBody?.Projects?.[0]?.address?.boundary
// ].projectId = projectCreateResponse?.Project[0]?.id;
} else {
throwError(
"PROJECT",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import config from "../config/index";
import { httpRequest } from "./request";
import { processBoundary } from "./campaignUtils";

async function consolidateBoundaries(messageObject: any, hierarchyType: any, tenantId: any, code: any, boundaries: any) {
const params = {
tenantId: tenantId,
codes: code,
hierarchyType: hierarchyType,
includeChildren: true,
};
const header = {
cachekey: `boundaryRelationShipSearch${params?.hierarchyType}${params?.tenantId
}${params.codes || ""}${params?.includeChildren || ""}`,
};
const boundaryResponse = await httpRequest(
config.host.boundaryHost + config.paths.boundaryRelationship,
messageObject?.RequestInfo,
params,
undefined,
undefined,
header
);
if (boundaryResponse?.TenantBoundary?.[0]?.boundary?.[0]) {
var boundaryChildren = boundaries.reduce((acc: any, boundary: any) => {
acc[boundary.code] = boundary?.includeAllChildren;
return acc;
}, {});
var boundaryCodes = new Set(
boundaries.map((boundary: any) => boundary.code)
);
await processBoundary(
boundaryResponse?.TenantBoundary?.[0]?.boundary?.[0],
boundaries,
boundaryChildren[
boundaryResponse?.TenantBoundary?.[0]?.boundary?.[0]?.code
],
boundaryCodes,
boundaryChildren
);
return boundaries;
}
}
export { consolidateBoundaries, }
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import { defaultheader, httpRequest } from "./request";
import { produceModifiedMessages } from "../kafka/Producer";
import { enrichAndPersistCampaignWithError, getLocalizedName } from "./campaignUtils";
import { campaignStatuses, resourceDataStatuses } from "../config/constants";
import { createCampaignService } from "../service/campaignManageService";
import { createCampaignService, searchProjectTypeCampaignService } from "../service/campaignManageService";
import { persistTrack } from "./processTrackUtils";
import { processTrackTypes, processTrackStatuses } from "../config/constants";
import { createProjectFacilityHelper, createProjectResourceHelper, createStaffHelper } from "../api/genericApis";
import { buildSearchCriteria, delinkAndLinkResourcesWithProjectCorrespondingToGivenBoundary, processResources } from "./onGoingCampaignUpdateUtils";
import { searchDataService } from "../service/dataManageService";
import { getHierarchy } from "../api/campaignApis";
import { consolidateBoundaries } from "./boundariesConsolidationUtils";


async function createBoundaryWithProjectMapping(projects: any, boundaryWithProject: any) {
Expand Down Expand Up @@ -336,29 +338,82 @@ async function enrichBoundaryWithProject(messageObject: any, boundaryWithProject
logger.debug(`boundaryWise Project mapping : ${getFormattedStringForDebug(boundaryWithProject)}`);
logger.info("boundaryCodes mapping : " + JSON.stringify(boundaryCodes));
}
function filterBoundariesByHierarchy(hierarchy: any, boundaries: any) {
// Iterate through the hierarchy in order
for (const level of hierarchy) {
// Find boundaries matching the current level type
const matchingBoundaries = boundaries.filter((boundary: any) => boundary.type === level);

if (matchingBoundaries.length > 0) {
// If matches are found, return them
return matchingBoundaries;
}
}

// If no matches are found, return an empty array
return [];
}

async function getProjectMappingBody(messageObject: any, boundaryWithProject: any, boundaryCodes: any) {
const Campaign: any = {
id: messageObject?.Campaign?.id,
tenantId: messageObject?.Campaign?.tenantId,
CampaignDetails: []
}
let newlyAddedBoundaryCodes = new Set(); // A set to store unique boundary codes
if (messageObject?.CampaignDetails?.parentId) {
const CampaignDetails = {
"ids": [messageObject?.CampaignDetails?.id],
"tenantId": messageObject?.CampaignDetails?.tenantId
}
const campaignSearchResponse = await searchProjectTypeCampaignService(CampaignDetails);
const boundaries = campaignSearchResponse?.CampaignDetails?.[0]?.boundaries;
const hierarchy = await getHierarchy(messageObject, messageObject?.CampaignDetails?.tenantId, messageObject?.CampaignDetails?.hierarchyType);
const boundariesWhichAreRootInThisFlow = filterBoundariesByHierarchy(hierarchy, boundaries);
for (const boundary of boundariesWhichAreRootInThisFlow) {
const boundaryCodesFetchedFromGivenRoot = await consolidateBoundaries(
messageObject,
messageObject?.CampaignDetails?.hierarchyType,
messageObject?.CampaignDetails?.tenantId,
boundary?.code,
boundaries
);
// Add each boundary code to the set if it exists
if (boundaryCodesFetchedFromGivenRoot &&
Array.isArray(boundaryCodesFetchedFromGivenRoot) &&
boundaryCodesFetchedFromGivenRoot.length > 0) {
boundaryCodesFetchedFromGivenRoot
.filter((boundary: any) => boundary?.code) // Filter boundaries with valid codes
.forEach((boundary: any) => newlyAddedBoundaryCodes.add(boundary.code));
}
}
}


for (const key of Object.keys(boundaryWithProject)) {
if (boundaryWithProject[key]) {
const resources: any[] = [];
if (messageObject?.Campaign?.newlyCreatedBoundaryProjectMap?.hasOwnProperty(key)) {
if (messageObject.Campaign.newlyCreatedBoundaryProjectMap[key]?.projectId) {
const pvarIds = getPvarIds(messageObject);
if (pvarIds && Array.isArray(pvarIds) && pvarIds.length > 0) {
resources.push({
type: "resource",
resourceIds: pvarIds
})
}
if (messageObject?.CampaignDetails?.parentId && newlyAddedBoundaryCodes.has(key)) {
logger.info("project resource mapping for newly creted projects in update flow")
const pvarIds = getPvarIds(messageObject);
if (pvarIds && Array.isArray(pvarIds) && pvarIds.length > 0) {
resources.push({
type: "resource",
resourceIds: pvarIds
})
}
}

if (!messageObject?.CampaignDetails?.parentId) {
const pvarIds = getPvarIds(messageObject);
if (pvarIds && Array.isArray(pvarIds) && pvarIds.length > 0) {
resources.push({
type: "resource",
resourceIds: pvarIds
})
}
}

for (const type of Object.keys(boundaryCodes)) {
if (boundaryCodes[type][key] && Array.isArray(boundaryCodes[type][key]) && boundaryCodes[type][key].length > 0) {
resources.push({
Expand Down
94 changes: 49 additions & 45 deletions health-services/project-factory/src/server/utils/campaignUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ import {
} from "./targetUtils";
import {
callGenerateWhenChildCampaigngetsCreated,
fetchProjectsWithBoundaryCodeAndName,
fetchProjectsWithParentRootProjectId,
fetchProjectsWithBoundaryCodeAndReferenceId,
fetchProjectsWithProjectId,
getBoundariesFromCampaignSearchResponse,
getBoundaryProjectMappingFromParentCampaign,
getColumnIndexByHeader,
Expand Down Expand Up @@ -1205,8 +1205,8 @@ async function persistForCampaignProjectMapping(
Campaign: {},
};
requestBody.Campaign.id = request?.body?.CampaignDetails?.id;
requestBody.Campaign.newlyCreatedBoundaryProjectMap =
request?.body?.newlyCreatedBoundaryProjectMap;
// requestBody.Campaign.newlyCreatedBoundaryProjectMap =
// request?.body?.newlyCreatedBoundaryProjectMap;
requestBody.Campaign.hierarchyType =
request?.body?.CampaignDetails?.hierarchyType;
requestBody.Campaign.tenantId = request?.body?.CampaignDetails?.tenantId;
Expand Down Expand Up @@ -1942,10 +1942,10 @@ async function reorderBoundariesOfDataAndValidate(
if (request?.body?.ResourceDetails?.campaignId) {
// const searchBody = {
// RequestInfo: request?.body?.RequestInfo,
const CampaignDetails = {
ids: [request?.body?.ResourceDetails?.campaignId],
tenantId: request?.body?.ResourceDetails?.tenantId,
}
const CampaignDetails = {
ids: [request?.body?.ResourceDetails?.campaignId],
tenantId: request?.body?.ResourceDetails?.tenantId,
}
// };
// const req: any = replicateRequest(request, searchBody);
const response = await searchProjectTypeCampaignService(CampaignDetails);
Expand Down Expand Up @@ -2235,9 +2235,10 @@ async function createProject(
boundaries = await reorderBoundaries(request, localizationMap);
let boundariesAlreadyWithProjects: any;
if (request?.body?.parentCampaign) {
// make search to project with root project id
// make search to project with parent campaign root project id
const { projectId, tenantId } = request?.body?.parentCampaign;
const projectSearchResponse =
await fetchProjectsWithParentRootProjectId(request);
await fetchProjectsWithProjectId(request, projectId, tenantId);
boundariesAlreadyWithProjects =
getBoundaryProjectMappingFromParentCampaign(
request,
Expand All @@ -2255,10 +2256,10 @@ async function createProject(
boundariesAlreadyWithProjects.has(boundary)
) {
const projectSearchResponse =
await fetchProjectsWithBoundaryCodeAndName(
await fetchProjectsWithBoundaryCodeAndReferenceId(
boundary,
tenantId,
request?.body?.CampaignDetails?.campaignName,
request?.body?.CampaignDetails?.campaignNumber,
request?.body?.RequestInfo
);
const projectToUpdate = projectSearchResponse?.Project?.[0];
Expand Down Expand Up @@ -2339,9 +2340,7 @@ async function createProject(
}

// Set the reference ID and project targets
Projects[0].referenceID = request?.body?.CampaignDetails?.id;
(Projects[0].department =
request?.body?.CampaignDetails?.campaignName),
Projects[0].referenceID = request?.body?.CampaignDetails?.campaignNumber;
(Projects[0].targets = [
{
beneficiaryType:
Expand Down Expand Up @@ -2974,16 +2973,16 @@ async function updateAndPersistResourceDetails(
lastModifiedTime: Date.now(),
},
additionalDetails:
{
...request?.body?.ResourceDetails?.additionalDetails,
sheetErrors: request?.body?.additionalDetailsErrors,
source:
request?.body?.ResourceDetails?.additionalDetails?.source ==
"microplan"
? "microplan"
: null,
[name]: [fileStoreId],
} ,
{
...request?.body?.ResourceDetails?.additionalDetails,
sheetErrors: request?.body?.additionalDetailsErrors,
source:
request?.body?.ResourceDetails?.additionalDetails?.source ==
"microplan"
? "microplan"
: null,
[name]: [fileStoreId],
},
};
} else {
request.body.ResourceDetails = {
Expand All @@ -2999,14 +2998,14 @@ async function updateAndPersistResourceDetails(
lastModifiedTime: Date.now(),
},
additionalDetails:
{
...getLatestResourceDetails.additionalDetails,
sheetErrors: request?.body?.additionalDetailsErrors,
source:
getLatestResourceDetails.additionalDetails?.source == "microplan"
? "microplan"
: null,
} ,
{
...getLatestResourceDetails.additionalDetails,
sheetErrors: request?.body?.additionalDetailsErrors,
source:
getLatestResourceDetails.additionalDetails?.source == "microplan"
? "microplan"
: null,
},
};
let additionalDetails = request?.body?.ResourceDetails?.additionalDetails;
if (additionalDetails && additionalDetails[name]) {
Expand Down Expand Up @@ -3393,10 +3392,10 @@ async function getTargetBoundariesRelatedToCampaignId(
if (request?.body?.ResourceDetails?.campaignId) {
// const searchBody = {
// RequestInfo: request?.body?.RequestInfo,
const CampaignDetails= {
ids: [request?.body?.ResourceDetails?.campaignId],
tenantId: request?.body?.ResourceDetails?.tenantId,
}
const CampaignDetails = {
ids: [request?.body?.ResourceDetails?.campaignId],
tenantId: request?.body?.ResourceDetails?.tenantId,
}
// const req: any = replicateRequest(request, searchBody);
const response = await searchProjectTypeCampaignService(CampaignDetails);
if (response?.CampaignDetails?.[0]) {
Expand Down Expand Up @@ -3627,6 +3626,10 @@ async function getBoundaryOnWhichWeSplit(request: any, tenantId: any) {
},
};
const mdmsResponse: any = await searchMDMSDataViaV2Api(MdmsCriteria);
if (!Array.isArray(mdmsResponse?.mdms) || mdmsResponse.mdms.length === 0) {
throwError("MDMS", 500, "MDMS_DATA_NOT_FOUND_ERROR", `${responseFromCampaignSearch?.CampaignDetails?.[0].hierarchyType} hierarchy not configured in mdms data
${config.values.moduleName}.${config.masterNameForSplitBoundariesOn}`)
}
return mdmsResponse?.mdms?.[0]?.data?.splitBoundariesOn;
}

Expand Down Expand Up @@ -3680,9 +3683,9 @@ async function processFetchMicroPlan(request: any) {
try {
logger.info("Waiting for 1 second for templates to get generated...");
await new Promise((resolve) => setTimeout(resolve, 1000));

logger.info("Started processing fetch microplan");

const { tenantId } = request.body.MicroplanDetails;
const localizationMap = await getLocalizedMessagesHandler(request, tenantId);
const resources: any = request?.body?.CampaignDetails?.resources || [];
Expand Down Expand Up @@ -3720,19 +3723,19 @@ async function processFetchMicroPlan(request: any) {
}


async function updateCampaignAfterSearch(request: any, source = "MICROPLAN_FETCHING") {
async function updateCampaignAfterSearch(request: any, source = "MICROPLAN_FETCHING") {
logger.info("search campaign with id ")
const { tenantId, campaignId } = request.body.MicroplanDetails;
const campaignDetails = {
tenantId: tenantId,
ids: [campaignId]
}
tenantId: tenantId,
ids: [campaignId]
}
const searchedCampaignResponse = await searchProjectTypeCampaignService(campaignDetails)
const searchedCamapignObject = searchedCampaignResponse?.CampaignDetails;
if (Array.isArray(searchedCamapignObject) && searchedCamapignObject.length > 0) {
const newRequestBody = {
RequestInfo: request.body.RequestInfo, // Retain the original RequestInfo
CampaignDetails :searchedCamapignObject?.[0] // campaigndetails from search response
CampaignDetails: searchedCamapignObject?.[0] // campaigndetails from search response
};
const req: any = replicateRequest(request, newRequestBody)
logger.info("Updating the received campaign object, source & its key");
Expand All @@ -3743,7 +3746,7 @@ async function updateCampaignAfterSearch(request: any, source = "MICROPLAN_FETCH
(!req.body?.CampaignDetails?.additionalDetails?.["disease"]) && (req.body.CampaignDetails.additionalDetails["disease"] = "MALARIA"),
(!req.body?.CampaignDetails?.additionalDetails?.["beneficiaryType"]) && (req.body.CampaignDetails.additionalDetails["beneficiaryType"] =
"INDIVIDUAL");
req.body.CampaignDetails.additionalDetails["key"] = 1;
req.body.CampaignDetails.additionalDetails["key"] = 1;
logger.debug(
`updated object with new source , disease & beneficiarytype ${getFormattedStringForDebug(req.body.CampaignDetails)}`
);
Expand Down Expand Up @@ -3792,4 +3795,5 @@ export {
enrichInnerCampaignDetails,
processFetchMicroPlan,
updateCampaignAfterSearch,
processBoundary,
};
Loading

0 comments on commit 776fb5f

Please sign in to comment.