Skip to content

Commit

Permalink
Merge pull request #135 from topcoder-platform/feature/emsi_skills_se…
Browse files Browse the repository at this point in the history
…arch

Refactor additional data generation into individual functions
  • Loading branch information
jmgasper committed Aug 15, 2023
2 parents 972365e + 9b7c4d0 commit 91d8667
Showing 1 changed file with 75 additions and 57 deletions.
132 changes: 75 additions & 57 deletions src/services/SearchService.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,18 +105,46 @@ searchMembers.schema = {
})
}

async function fillMembers(docsMembers, query, fields) {
// get the total
const total = eshelper.getTotal(docsMembers)
async function addStats(results, query){
console.log("Adding stats to results")
// get stats for the members fetched
const docsStats = await eshelper.getMembersStats(query, esClient)
// extract data from hits
const mbrsSkillsStats = _.map(docsStats.hits.hits, (item) => item._source)

// merge overall members and stats
const mbrsSkillsStatsKeys = _.keyBy(mbrsSkillsStats, 'userId')
const resultsWithStats = _.map(results, function (item) {
item.numberOfChallengesWon = 0;
item.numberOfChallengesPlaced = 0;
if (mbrsSkillsStatsKeys[item.userId]) {
item.stats = []
if (mbrsSkillsStatsKeys[item.userId].maxRating) {
// add the maxrating
item.maxRating = mbrsSkillsStatsKeys[item.userId].maxRating
// set the rating color
if (item.maxRating.hasOwnProperty('rating')) {
item.maxRating.ratingColor = helper.getRatingColor(item.maxRating.rating)
}
}
if (mbrsSkillsStatsKeys[item.userId].wins > item.numberOfChallengesWon) {
item.numberOfChallengesWon = mbrsSkillsStatsKeys[item.userId].wins
}

let results = []
if (total > 0) {
// extract member profiles from hits
const members = _.map(docsMembers.hits.hits, (item) => item._source)
item.numberOfChallengesPlaced = mbrsSkillsStatsKeys[item.userId].challenges

// search for a list of members
query.handlesLower = _.map(members, 'handleLower')
query.memberIds = _.map(members, 'userId')
// clean up stats fileds and filter on stats fields
item.stats.push(_.pick(mbrsSkillsStatsKeys[item.userId], MEMBER_STATS_FIELDS))
} else {
item.stats = []
}
return item
})

return resultsWithStats
}

async function addNamesAndHandleAppearance(results, query){

// get stats for the members fetched
const docsTraits = await eshelper.getMemberTraits(query, esClient)
Expand All @@ -125,7 +153,7 @@ async function fillMembers(docsMembers, query, fields) {

// Pull out availableForGigs to add to the search results, for talent search
// TODO - can we make this faster / more efficient?
let resultMbrTraits = _.map(members, function (item) {
let resultsWithTraits = _.map(results, function (item) {
item.traits = []
let memberTraits = _.filter(mbrsTraits, ['userId', item.userId])
_.forEach(memberTraits, (trait) => {
Expand All @@ -151,60 +179,50 @@ async function fillMembers(docsMembers, query, fields) {
return item
})

if(!query.includeStats || query.includeStats=="true"){
// get stats for the members fetched
const docsStats = await eshelper.getMembersStats(query, esClient)
// extract data from hits
const mbrsSkillsStats = _.map(docsStats.hits.hits, (item) => item._source)

// merge overall members and stats
const mbrsSkillsStatsKeys = _.keyBy(mbrsSkillsStats, 'userId')
const resultMbrsSkillsStats = _.map(resultMbrTraits, function (item) {
item.numberOfChallengesWon = 0;
item.numberOfChallengesPlaced = 0;
if (mbrsSkillsStatsKeys[item.userId]) {
item.stats = []
if (mbrsSkillsStatsKeys[item.userId].maxRating) {
// add the maxrating
item.maxRating = mbrsSkillsStatsKeys[item.userId].maxRating
// set the rating color
if (item.maxRating.hasOwnProperty('rating')) {
item.maxRating.ratingColor = helper.getRatingColor(item.maxRating.rating)
}
}
if (mbrsSkillsStatsKeys[item.userId].wins > item.numberOfChallengesWon) {
item.numberOfChallengesWon = mbrsSkillsStatsKeys[item.userId].wins
}

item.numberOfChallengesPlaced = mbrsSkillsStatsKeys[item.userId].challenges
return resultsWithTraits
}

// clean up stats fileds and filter on stats fields
item.stats.push(_.pick(mbrsSkillsStatsKeys[item.userId], MEMBER_STATS_FIELDS))
} else {
item.stats = []
}
return item
})
// sort the data
results = _.orderBy(resultMbrsSkillsStats, [query.sortBy, "handleLower"], [query.sortOrder])
async function addVerifiedFlag(results){
// Get the verification data from Looker
for (let i = 0; i < results.length; i += 1) {
if (await lookerService.isMemberVerified(results[i].userId)) {
results[i].verified = true
}
else{
// sort the data
results = _.orderBy(resultMbrTraits, [query.sortBy, "handleLower"], [query.sortOrder])
else {
results[i].verified = false
}
}
return results
}

// Get the verification data from Looker
for (let i = 0; i < results.length; i += 1) {
if (await lookerService.isMemberVerified(results[i].userId)) {
results[i].verified = true
}
else {
results[i].verified = false
}
async function fillMembers(docsMembers, query, fields) {
// get the total
const total = eshelper.getTotal(docsMembers)

let results = []
if (total > 0) {
// extract member profiles from hits
const members = _.map(docsMembers.hits.hits, (item) => item._source)

// search for a list of members
query.handlesLower = _.map(members, 'handleLower')
query.memberIds = _.map(members, 'userId')

results = await addNamesAndHandleAppearance(members, query)

// Include the stats by default, but allow them to be ignored with ?includeStats=false
// This is for performance reasons - pulling the stats is a bit of a resource hog
if(!query.includeStats || query.includeStats=="true"){
results = await addStats(results, query)
}

results = await addVerifiedFlag(results)

// filter member based on fields
results = _.map(results, (item) => _.pick(item, fields))

// Sort the results
results = _.orderBy(members, [query.sortBy, "handleLower"], [query.sortOrder])
}

results = helper.paginate(results, query.perPage, query.page - 1)
Expand Down

0 comments on commit 91d8667

Please sign in to comment.