Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merging kb packages #220

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
1,301 changes: 1,301 additions & 0 deletions elevate-mentoring/constants/routes.js

Large diffs are not rendered by default.

225 changes: 221 additions & 4 deletions elevate-mentoring/controllers/mentoring.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,258 @@
const requesters = require('../utils/requester')
const routeConfigs = require('../constants/routes')
const requestParser = require('../utils/requestParser')
const {convertIdsToString} = require('../utils/integerToStringConverter')


const createProfile = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => obj.sourceRoute === req.sourceRoute)
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)
req.body.skipValidation = true
return await requesters.post(req.baseUrl, selectedConfig.targetRoute.path, req.body, {
'X-auth-token': `bearer ${responses.user.result.access_token}`,
})
}
const updateUser = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => obj.sourceRoute === req.sourceRoute)
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

//const filteredRequestBody = requestParser.transformUpdateUserBody(req.body)
console.log(req.baseUrl, selectedConfig.targetRoute.path, req.headers, req.body, 'mentoring request')
return await requesters.patch(req.baseUrl, selectedConfig.targetRoute.path, req.body, req.headers)
}

const entityTypeRead = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => obj.sourceRoute === req.sourceRoute)
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)
return await requesters.post(req.baseUrl, selectedConfig.targetRoute.path, req.body, {
'X-auth-token': req.headers['x-auth-token'],
})
}

const rolePermissions = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => obj.sourceRoute === req.sourceRoute)
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

console.log("selected config",selectedConfig);

console.log("selected req.baseUrl",req.baseUrl);

console.log("selected req.responses",JSON.stringify(responses));

return await requesters.post(req.baseUrl, selectedConfig.targetRoute.path,req.body,{
'X-auth-token': `bearer ${responses.user.result.access_token}`,
})
}

const createUser = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)
return await requesters.post(req.baseUrl, selectedConfig.targetRoute.path, req.body,{
'device-info': req.headers['device-info'],
})
}


const loginUser = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)


let data = await requesters.post(req.baseUrl, selectedConfig.targetRoute.path, req.body,{
'captcha-token': req.headers['captcha-token'],
'device-info': req.headers['device-info'],
})
return data
}

const readOrganization = async (req, res, selectedConfig) => {
try {
const parameterisedRoute = req.query.organisation_code ? selectedConfig.targetRoute.path + `?organisation_code=${req.query.organisation_code}` : selectedConfig.targetRoute.path + `?organisation_id=${req.query.organisation_id}`
let response = await requesters.get(req.baseUrl, parameterisedRoute , {
'internal_access_token': req.headers['internal_access_token'],
'Content-Type':'application/json'
})
response.result = convertIdsToString(response.result)
return res.json(response)
} catch (error) {
console.error('Error fetching organization details:', error)
return res.status(500).json({ error: 'Internal Server Error' })
}
}

const readUser = async (req, res, selectedConfig) => {
try {
const parameterisedRoute = req.params.id ? selectedConfig.targetRoute.path.replace('/:id', `/${req.params.id}`) : selectedConfig.targetRoute.path;
let headers

if (req.params.id) {
headers = {
'internal_access_token': req.headers['internal_access_token'],
'Content-Type': 'application/json',
}
} else {
headers = {
'X-auth-token': req.headers['x-auth-token'],
'Content-Type': 'application/json',
}
}

let response = await requesters.get(req.baseUrl, parameterisedRoute, headers)

// Extract only the relevant data
response.result = convertIdsToString(response.result)
return res.json(response)
} catch (error) {
console.error('Error fetching user details:', error);
return res.status(500).json({ error: 'Internal Server Error' })
}
};


const accountsList = async (req, res, selectedConfig) => {
try {
const userIds = req.body.userIds // Extract userIds from the request body
const excludeDeletedRecords = req.query.exclude_deleted_records === 'true'

const parameterisedRoute = excludeDeletedRecords
? `${selectedConfig.targetRoute.path}?exclude_deleted_records=true`
: selectedConfig.targetRoute.path

const headers = {
'internal_access_token': req.headers['internal_access_token'],
'Content-Type': 'application/json',
}

const requestBody = { userIds } // Pass the request body
const accountsListResponse = await requesters.get(req.baseUrl, parameterisedRoute, headers, requestBody)

accountsListResponse.result = await convertIdsToString(accountsListResponse.result)

return res.json(accountsListResponse)
} catch (error) {
console.error('Error fetching list of user details:', error);
return res.status(500).json({ error: 'Internal Server Error' });
}
}


const validateEmails = async (req, res , selectedConfig) => {
try{
const emailIds = req.body.emailIds

const headers = {
'internal_access_token': req.headers['internal_access_token'],
'Content-Type': 'application/json',
}

const requestBody = { emailIds } // Pass the request body

const userListResponse = await requesters.post(req.baseUrl, selectedConfig.targetRoute.path, requestBody, headers)
userListResponse.result = await convertIdsToString(userListResponse.result)
return res.json(userListResponse)
} catch (error) {
console.error('Error fetching user details by email :', error)
return res.status(500).json({ error: 'Internal Server Error' })
}
}
const mentorDetails = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

const parameterisedRoute = req.params.id ? selectedConfig.targetRoute.path.replace('/:id', `/${req.params.id}`) : selectedConfig.targetRoute.path;
let headers

if (req.params.id) {
headers = {
'Content-Type': 'application/json',
'X-auth-token': req.headers['x-auth-token'],
}
}

console.log("response ============ headers ",headers);

let response = await requesters.get(req.baseUrl, parameterisedRoute,headers,{})
return response

}

const mentoringProfile = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

const parameterisedRoute = selectedConfig.targetRoute.path;
let headers

headers = {
'Content-Type': 'application/json',
'X-auth-token': req.headers['x-auth-token'],
}

console.error("------------------mentoringProfile ----------")

let response = await requesters.get(req.baseUrl, parameterisedRoute,headers,{})
console.error("------------------response in mentoring profile ----------",response)
return response

}
const getUserDetailsFromExternal = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

let parameterisedRoute = selectedConfig.targetRoute.path;

if(req.params.id){
parameterisedRoute = parameterisedRoute+'/'+req.params.id;
}
let headers = {
'Content-Type': 'application/json',
'X-auth-token': req.headers['x-auth-token'],
}

console.log("parameterisedRoute ---------------",parameterisedRoute);


let response = await requesters.get(req.baseUrl, parameterisedRoute,headers,{})
return response

}

const userDetails = async (req, res, responses) => {
const selectedConfig = routeConfigs.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)

const parameterisedRoute = selectedConfig.targetRoute.path;

console.error("============== cllaing user details")
let headers
if (req.params.id) {
headers = {
'internal_access_token': req.headers['internal_access_token'],
'Content-Type': 'application/json',
}
} else {
headers = {
'Content-Type': 'application/json',
'X-auth-token': req.headers['x-auth-token'],
}
}
console.log("parameterisedRoute API =========",parameterisedRoute);
console.error(" ----------- parameterisedRoute API =========",parameterisedRoute);


let response = await requesters.get(req.baseUrl, parameterisedRoute,headers,{})
console.log(req.baseUrl,"parameterisedRoute API =========",response);
return response

}

mentoringController = {
createProfile,
updateUser,
entityTypeRead,
rolePermissions,
createUser,
updateUser,
entityTypeRead,
loginUser,
readOrganization,
readUser,
accountsList,
validateEmails,
mentorDetails,
mentoringProfile,
userDetails,
getUserDetailsFromExternal
}

module.exports = mentoringController
13 changes: 11 additions & 2 deletions elevate-mentoring/controllers/orchestrationController.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
const routesConfig = require('../constants/routes')
const mentoringController = require('../controllers/mentoring')
const orchestrationHandler = async (req, res, responses) => {
console.log(req.targetPackages, req.inSequence, req.orchestrated, req.sourceRoute, responses)

console.log(req.service,req.targetPackages, req.inSequence, req.orchestrated, req.sourceRoute, responses)
console.log(req.body)
const selectedRouteConfig = routesConfig.routes.find((obj) => obj.sourceRoute === req.sourceRoute)

const selectedRouteConfig = routesConfig.routes.find((obj) => req.service === obj.service && obj.sourceRoute === req.sourceRoute)


console.log(" selectedRouteConfig ---------- ",selectedRouteConfig);

if(selectedRouteConfig && selectedRouteConfig.service){
req['baseUrl'] = process.env[`${selectedRouteConfig.service.toUpperCase()}_SERVICE_BASE_URL`]
}
return await mentoringController[selectedRouteConfig.targetRoute.functionName](req, res, responses)
}

Expand Down
2 changes: 1 addition & 1 deletion elevate-mentoring/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "elevate-mentoring",
"version": "1.1.55",
"version": "1.2.25",
"description": "Npm package for Elevate-Mentoring service integration with Interface service. ",
"main": "index.js",
"scripts": {
Expand Down
11 changes: 8 additions & 3 deletions elevate-mentoring/router/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
const { passThroughRequester } = require('../utils/requester')
const { orchestrationHandler } = require('../controllers/orchestrationController')

const { customHandler } = require('../controllers/customHandler')
const packageRouter = async (req, res, responses) => {
const response = req.orchestrated
? await orchestrationHandler(req, res, responses)
: await passThroughRequester(req, res)
let response
if (req.orchestrated) response = await orchestrationHandler(req, res, responses)
else if (req.requiresCustomHandling) {
response = await customHandler(req, res)
} else response = await passThroughRequester(req, res)
return response
}


module.exports = packageRouter
37 changes: 37 additions & 0 deletions elevate-mentoring/utils/integerToStringConverter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const convertIdsToString = (obj) => {
// Check if the input is an array of integers
if (Array.isArray(obj) && obj.every(item => typeof item === 'number')) {
return obj.map(item => item.toString())
}

// If not an array or not all elements are numbers, proceed with the existing logic
if (typeof obj !== 'object' || obj === null) {
return obj
}

if (Array.isArray(obj)) {
return obj.map(convertIdsToString)
}

const relevantKeys = ['id', 'organization_id', 'related_orgs']
const hasRelevantKeys = relevantKeys.some(key => key in obj)

if (!hasRelevantKeys) {
return obj
}

return Object.keys(obj).reduce((result, key) => {
if (relevantKeys.includes(key)) {
if (key === 'related_orgs' && Array.isArray(obj[key])) {
result[key] = obj[key].map(item => typeof item === 'number' ? item.toString() : item)
} else {
result[key] = typeof obj[key] === 'number' ? obj[key].toString() : obj[key]
}
} else {
result[key] = convertIdsToString(obj[key])
}
return result
}, {})
};

exports.convertIdsToString = convertIdsToString
23 changes: 23 additions & 0 deletions elevate-mentoring/utils/requester.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ const passThroughRequester = async (req, res) => {
const sourceBaseUrl = req.protocol + '://' + req.headers.host + '/'
const sourceUrl = new URL(req.originalUrl, sourceBaseUrl)
const route = routesConfig.routes.find((route) => route.sourceRoute === req.sourceRoute)

if(route.service){
req['baseUrl'] = process.env[`${route.service.toUpperCase()}_SERVICE_BASE_URL`]
}
const params = matchPathsAndExtractParams(route.sourceRoute, req.originalUrl)
const targetRoute = pathParamSetter(route.targetRoute.path, params)
const parsedUrl = new URL(targetRoute, req.baseUrl)
Expand Down Expand Up @@ -45,6 +49,7 @@ const passThroughRequester = async (req, res) => {
})
req.pipe(proxyReq, { end: true })
} catch (err) {
console.log()
handleInterfaceError(res, err)
}
}
Expand Down Expand Up @@ -89,11 +94,29 @@ const patch = async (baseUrl, route, requestBody, headers) => {
throw error // Re-throw the error to be caught by the caller
}
}
const get = (baseUrl, route, headers, requestBody = {}) => {
const url = baseUrl + route
const options = {
headers,
data: requestBody
};

return axios
.get(url, options) // Use POST to send body data
.then((response) => response.data)
.catch((error) => {
console.error('Error fetching data:', error)
if (error.response) {
return error.response
}
return error
})
}
const requesters = {
passThroughRequester,
post,
patch,
get
}

module.exports = requesters
Loading