Skip to content
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 40 additions & 2 deletions src/controllers/orchestration.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
'use strict'
const { bodyValueReplacer } = require('@helpers/bodyValueReplacer')
const { routesConfigs } = require('@root/configs/routesConfigs')
const routes = routesConfigs.routes

const removeArraySuffix = (obj) => {
if (Array.isArray(obj)) {
Expand Down Expand Up @@ -55,10 +57,30 @@ const packageRouterCaller = async (req, res, responses, servicePackage, packages
}
return true
}
/**
* Calls a custom merge handler defined in one of the packages based on the provided merge configuration.
*
* @async
* @function
* @param {Array<Object>} result - An array of response objects from service packages to be merged.
* @param {Object} mergeOption - The merge configuration object.
* @param {Object} mergeOption.mergeConfig - Configuration that includes the base package name and the function name to call.
* @param {string} mergeOption.mergeConfig.basePackageName - Identifier used to find the relevant package.
* @param {string} mergeOption.mergeConfig.functionName - The name of the custom merge handler function to invoke.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
* @param {Array<Object>} packages - Array of package objects, each expected to have a `packageMeta.basePackageName` and a `customMergeFunctionHandler` function.
* @returns {Promise<Object>} The result of the custom merge function.
*/
const customMergeFunctionCaller = async (result,mergeOption, packages) => {
const selectedPackage = packages.find((obj) => obj.packageMeta.basePackageName === mergeOption.basePackageName)
Comment thread
borkarsaish65 marked this conversation as resolved.
return selectedPackage.customMergeFunctionHandler(result, mergeOption.functionName, packages)
}

const orchestrationHandler = async (packages, req, res) => {
try {
const { targetPackages, inSequence, responseMessage } = req
let sourceRoute = req.sourceRoute;
let selectedRouteConfig = routes.find((obj) => obj.sourceRoute === sourceRoute);
let mergeOption = selectedRouteConfig?.mergeConfiguration || {}
const responses = {}
let asyncRequestsStatues = []
if (inSequence)
Expand All @@ -78,6 +100,7 @@ const orchestrationHandler = async (packages, req, res) => {
})
)
let response = {}
let responseArray = []
for (const servicePackage of targetPackages) {
let body
if(servicePackage.merge == true && servicePackage.mergeKey != ''){
Expand All @@ -87,9 +110,24 @@ const orchestrationHandler = async (packages, req, res) => {
} else {
body = responses[servicePackage.basePackageName]?.result
}
response = { ...response, ...body }
response = bodyValueReplacer(response, servicePackage.responseBody)
body = bodyValueReplacer(body, servicePackage.responseBody)
responseArray.push(body)
}

// Check if custom merge options are provided in the configuration
if (mergeOption && mergeOption.basePackageName && mergeOption.functionName && mergeOption.packageName) {
// If all required fields for custom merging exist,
// call the custom merge function to handle merging logic
let result = await customMergeFunctionCaller(responseArray,mergeOption, packages)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
response = result
}else {
// Fallback to default merging behavior
for(let resp of responseArray){
response = { ...response, ...resp }
}
}


if (!asyncRequestsStatues.includes(false))
res.status(200).send({
responseCode: 'OK',
Expand Down