diff --git a/src/config/constants.json b/src/config/constants.json new file mode 100644 index 0000000000000000000000000000000000000000..e299e6f0e15ded1acab6e1dbd56ef1ca9ea7feeb --- /dev/null +++ b/src/config/constants.json @@ -0,0 +1,5 @@ +{ + "orgCacheKeyName": "allRootOrgs", + "orgCacheExpiryTime": "", + "orgfieldsAllowed": ["email","orgName"] +} \ No newline at end of file diff --git a/src/helpers/configHelper.js b/src/helpers/configHelper.js index a2c3524e2fb871cceb60e8f31b40dd82a6a6c458..00c000d14053c7a8eecf013bbc98d84f0f584f03 100644 --- a/src/helpers/configHelper.js +++ b/src/helpers/configHelper.js @@ -5,6 +5,9 @@ var LOG = require('sb_logger_util') const contentProvider = require('sb_content_provider_util') var async = require('async') var _ = require('lodash') +var CacheManager = require('sb_cache_manager') +var cacheManager = new CacheManager({}) +var configData = require('../config/constants') /** * This function executes the org search lms API to get all orgs @@ -25,6 +28,75 @@ function getRootOrgs (requestObj, cb) { }) } +/** + * This function tries to get the orgdetails from cache if not exits fetches from api and sets to cache + * @param requestObj is not needed bec all rootorgdetails are fetched here + * @param CBW callback after success or error + */ +function getRootOrgsFromCache (CBW) { + cacheManager.get(configData.orgCacheKeyName, function (err, cachedata) { + if (err || !cachedata) { + var inputObj = { + 'request': { + // 'limit': 50, + 'filters': { 'isRootOrg': true } + } + } + getRootOrgs(inputObj, function (err, res) { + if (err) { + CBW(err) + } else { + cacheManager.set({ key: configData.orgCacheKeyName, value: res.result.response.content }, + 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')) + } + }) + CBW(null, res.result.response.content) + } + }) + } else { + CBW(null, cachedata) + } + }) +} + +/** + * 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 data is array of objects, it might be content or course + * @param cb callback after success or error + */ +function populateOrgDetailsByHasTag (data, inputfields, cb) { + inputfields = inputfields.split(',') + var fields = configData.orgfieldsAllowed.filter(eachfield => inputfields.includes(eachfield)) + if (fields && fields.length) { + getRootOrgsFromCache(function (err, orgdata) { + if (!err) { + if (orgdata) { + var orgDetails = _.keyBy(orgdata, 'hashTagId') + _.forEach(data, (eachcontent, index) => { + if (eachcontent.channel) { + var eachorgdetail = orgDetails[eachcontent.channel] + if (eachorgdetail) { + data[index].orgDetails = _.pick(eachorgdetail, fields) + } + } + }) + } + cb(null, data) + } else { + cb(err) + } + }) + } else { + cb(null, data) + } +} + /** * This method gets all channels through 'getRootOrgs' method response * data asynchronously and return back a promise @@ -85,5 +157,6 @@ function getAllChannelsFromAPI () { } module.exports = { - getAllChannelsFromAPI: getAllChannelsFromAPI + getAllChannelsFromAPI: getAllChannelsFromAPI, + populateOrgDetailsByHasTag: populateOrgDetailsByHasTag } diff --git a/src/libs b/src/libs index 6f94c30164e01cda210abd5824919498be3f0824..89e35ce98f3a32171e24472fe03b15c8ee7e0673 160000 --- a/src/libs +++ b/src/libs @@ -1 +1 @@ -Subproject commit 6f94c30164e01cda210abd5824919498be3f0824 +Subproject commit 89e35ce98f3a32171e24472fe03b15c8ee7e0673 diff --git a/src/service/contentService.js b/src/service/contentService.js index 13f9ea629e604ec0089ea6e18180b77b4b31ea83..8cae44e0bf48983ba0579c3b7beede4ed59fa110 100644 --- a/src/service/contentService.js +++ b/src/service/contentService.js @@ -20,6 +20,7 @@ var contentModel = require('../models/contentModel').CONTENT var messageUtils = require('./messageUtil') var utilsService = require('../service/utilsService') var emailService = require('./emailService') +var configHelper = require('../helpers/configHelper') var CacheManager = require('sb_cache_manager') var cacheManager = new CacheManager({}) @@ -130,7 +131,18 @@ function search (defaultContentTypes, req, response, objectType) { lodash.get(data, 'result.framework.categories')) { modifyFacetsData(res.result.facets, data.result.framework.categories, language) } - CBW(null, res) + if (req.query && req.query.orgdetails) { + var fields = req.query.orgdetails + configHelper.populateOrgDetailsByHasTag(res.result.content, fields, function + (err, contentwithorgdetails) { + if (!err) { + res.result.content = contentwithorgdetails + } + CBW(null, res) + }) + } else { + CBW(null, res) + } } }) } else { @@ -624,6 +636,19 @@ function getContentAPI (req, response) { } }) }, + function (res, CBW) { + if (req.query && req.query.orgdetails) { + var fields = req.query.orgdetails + configHelper.populateOrgDetailsByHasTag([res.result.content], fields, function (err, courseswithorgdetails) { + if (!err) { + res.result.content = courseswithorgdetails[0] + } + CBW(null, res) + }) + } else { + CBW(null, res) + }; + }, function (res) { rspObj.result = res.result LOG.info(utilsService.getLoggerData(rspObj, 'INFO', filename, 'getContentAPI', 'Sending response back to user')) diff --git a/src/service/courseService.js b/src/service/courseService.js index 8d39463d133679682eaeafa47cd51bcfcfa4f42c..c5e5d82513027f8ecdc3f5b9848dd2632585d59d 100644 --- a/src/service/courseService.js +++ b/src/service/courseService.js @@ -16,6 +16,7 @@ var _ = require('underscore') var courseModel = require('../models/courseModel').COURSE var messageUtils = require('./messageUtil') var utilsService = require('../service/utilsService') +var configHelper = require('../helpers/configHelper') var filename = path.basename(__filename) var courseMessage = messageUtils.COURSE @@ -126,7 +127,19 @@ function searchCourseAPI (req, response) { } }) }, - + function (res, CBW) { + if (req.query && req.query.orgdetails) { + var fields = req.query.orgdetails + configHelper.populateOrgDetailsByHasTag(res.result.content, fields, function (err, courseswithorgdetails) { + if (!err) { + res.result.content = courseswithorgdetails + } + CBW(null, res) + }) + } else { + CBW(null, res) + }; + }, function (res) { rspObj.result = res.result if (res.result.content) { @@ -457,7 +470,19 @@ function getCourseAPI (req, response) { } }) }, - + function (res, CBW) { + if (req.query && req.query.orgdetails) { + var fields = req.query.orgdetails + configHelper.populateOrgDetailsByHasTag(res.result.content, fields, function (err, courseswithorgdetails) { + if (!err) { + res.result.content = courseswithorgdetails + } + CBW(null, res) + }) + } else { + CBW(null, res) + }; + }, function (res) { rspObj.result = transformResBody(res.result, 'content', 'course') LOG.info(utilsService.getLoggerData(rspObj, 'INFO', filename, 'getCourseAPI', @@ -574,7 +599,20 @@ function getCourseHierarchyAPI (req, response) { } }) }, - + function (res, CBW) { + if (req.query && req.query.orgdetails) { + var fields = req.query.orgdetails + // sending res.result.content as array bec populateOrgDetailsByHasTag expects data as array + configHelper.populateOrgDetailsByHasTag([res.result.content], fields, function (err, courseswithorgdetails) { + if (!err) { + res.result.content = courseswithorgdetails[0] + } + CBW(null, res) + }) + } else { + CBW(null, res) + }; + }, function (res) { rspObj.result = res.result LOG.info(utilsService.getLoggerData(rspObj, 'INFO', filename, 'getCourseHierarchyAPI',