An error occurred while loading the file. Please try again.
-
Harishkumar Gangula authorededf93401
var path = require('path')
var filename = path.basename(__filename)
var utilsService = require('../service/utilsService')
var LOG = require('sb_logger_util')
const contentProvider = require('sb_content_provider_util')
var _ = require('lodash')
var CacheManager = require('sb_cache_manager')
var cacheManager = new CacheManager({})
var configData = require('../config/constants')
var async = require('async')
/**
* This function executes the org search lms API to get all orgs
* @param requestObj js object which contains the search request with filters,offset,limit,query etc
* @param cb callback after success or error
*/
function getRootOrgs (requestObj, cb, noExitOnError) {
LOG.info(utilsService.getLoggerData({}, 'INFO',
filename, 'getRootOrgs', 'getRootOrgs called', requestObj))
contentProvider.getAllRootOrgs(requestObj, (err, res) => {
if (!err) {
return cb(err, res)
} else {
LOG.error(utilsService.getLoggerData({}, 'ERROR',
filename, 'getRootOrgs', 'error in getting root orgs.', err))
if (!noExitOnError) process.exit(1)
}
})
}
/**
* This function tries to get the orgdetails from cache if not exits fetches from api and sets to cache
* @param requestObj is filter query that is sent to fetch org api call, tryfromcache is a boolean flag,
inputdata is array of contents that needs org data
* @param CBW callback after success or error
*/
function getRootOrgsFromCache (orgfetchquery, tryfromcache, inputdata, cb) {
async.waterfall([
function (CBW) {
if (tryfromcache) {
var keyNames = getKeyNames(inputdata)
cacheManager.mget(keyNames, function (err, cacheresponse) {
var cachedata = _.compact(cacheresponse)
if (!err && _.size(cachedata) > 0) {
return cb(null, cachedata)
} else {
if (err) {
LOG.error(utilsService.getLoggerData({}, 'ERROR', filename, 'getRootOrgsFromCache',
'Feching Org details from cache failed.', err))
}
CBW()
}
})
} else {
CBW()
}
},
function (CBW) {
getRootOrgs(orgfetchquery, function (err, res) {
if (err) {
return cb(err)
} else {
if (_.get(res, 'result.response') && _.get(res.result, 'response.content')) {
var cacheinputdata = prepareCacheDataToInsert(res.result.response.content)
insertDataToCache(cacheinputdata)
return cb(null, res.result.response.content)
} else {
return cb(null, [])
}
}
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
}, true)
}
])
}
function insertDataToCache (cacheinputdata) {
cacheManager.mset({ data: cacheinputdata, ttl: configData.orgCacheExpiryTime }, function (err, data) {
if (err) {
LOG.error(utilsService.getLoggerData({}, 'ERROR', filename, 'Setting allRootOrgs cache failed',
'Setting allRootOrgs cache data failed', err))
} else {
LOG.info(utilsService.getLoggerData({}, 'INFO', filename,
'Setting allRootOrgs cache data success'))
}
})
}
/**
* This function loops each object from the input and maps channel id with hasTagId from orgdetails and prepares orgDetails obj for each obj in the array
* @param inputdata is array of objects, it might be content or course
* @param cb callback after success or error
*/
function populateOrgDetailsByHasTag (contents, inputfields, cb) {
var orgDetails = []
var orgFetchQuery = {
'request': {
'filters': { 'isRootOrg': true }
}
}
var tryFromCache = true
async.waterfall([
// intially fetch all the orgs till the default limit
function (CBW) {
getRootOrgsFromCache(orgFetchQuery, tryFromCache, contents, function (err, orgdata) {
if (!err && orgdata) {
orgDetails = orgdata
return CBW()
} else {
return cb(null, contents)
}
})
},
// fetch the orgs which are not fetched from initial api call
function (CBW) {
var inputHashTagIds = _.uniq(_.map(contents, 'channel'))
var fetchedhashTagIds = _.uniq(_.map(orgDetails, 'hashTagId'))
// diff of channels which doesnt exists in inital fetch
var hasTagIdsNeedToFetch = _.difference(inputHashTagIds, fetchedhashTagIds)
orgFetchQuery.request.filters.hashTagId = hasTagIdsNeedToFetch
if (hasTagIdsNeedToFetch.length) {
// fetch directly from api , as hashTagIdsNeedToFetch are the data which are not found from first api query
tryFromCache = false
getRootOrgsFromCache(orgFetchQuery, tryFromCache, contents, function (err, orgdata) {
if (!err && orgdata) {
orgDetails = _.concat(orgDetails, orgdata)
return CBW()
} else {
return cb(null, contents)
}
})
} else {
CBW()
}
},
// mapping channel with orgdetails in contents
function (CBW) {
var orgDetailsWithKey = _.keyBy(orgDetails, 'hashTagId')
_.forEach(contents, (eachcontent, index) => {
if (eachcontent.channel) {
var eachorgdetail = orgDetailsWithKey[eachcontent.channel]
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
contents[index].orgDetails = eachorgdetail ? _.pick(eachorgdetail, inputfields) : {}
}
})
return cb(null, contents)
}
])
}
/**
* This function loops each object from the input and includes org details in it
* @param inputdata is req object and res object
* @param cb there will be no error callback , always returns success
*/
function includeOrgDetails (req, res, cb) {
if (_.get(req, 'query.orgdetails') && _.get(res, 'result.content')) {
var inputfields = req.query.orgdetails.split(',')
var fieldsToPopulate = configData.orgfieldsAllowedToSend.filter(eachfield => inputfields.includes(eachfield))
var inputContentIsArray = _.isArray(res.result.content)
// contents need to send as array bec populateOrgDetailsByHasTag expects data as array
var contents = inputContentIsArray ? res.result.content : [res.result.content]
if (_.size(fieldsToPopulate) && _.size(contents)) {
populateOrgDetailsByHasTag(contents, fieldsToPopulate, function
(err, contentwithorgdetails) {
if (!err) {
res.result.content = inputContentIsArray ? contentwithorgdetails : contentwithorgdetails[0]
}
return cb(null, res)
})
} else {
return cb(null, res)
}
} else {
return cb(null, res)
}
}
// prepares the set data for inserting in cache
function prepareCacheDataToInsert (data) {
var cacheKeyValuePairs = []
_.forEach(data, function (eachdata) {
if (eachdata.hashTagId) {
var keyname = configData.orgCacheKeyNamePrefix + eachdata.hashTagId
cacheKeyValuePairs.push(keyname)
cacheKeyValuePairs.push(eachdata)
}
})
return cacheKeyValuePairs
}
// prepares the get data for fetching from cache
function getKeyNames (data) {
var keyNames = []
_.forEach(data, function (eachdata) {
if (eachdata.channel) {
var keyname = configData.orgCacheKeyNamePrefix + eachdata.channel
keyNames.push(keyname)
}
})
return _.uniq(keyNames)
}
module.exports = {
getRootOrgs: getRootOrgs,
includeOrgDetails: includeOrgDetails,
populateOrgDetailsByHasTag: populateOrgDetailsByHasTag
}