Skip to content

Commit be3208d

Browse files
author
sachin-maheshwari
authored
Merge pull request #75 from topcoder-platform/develop
JIRA-PLAT-346
2 parents 4125d07 + f04f7fa commit be3208d

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

app-constants.js

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const EVENT_ORIGINATOR = 'topcoder-member-api'
88
const EVENT_MIME_TYPE = 'application/json'
99

1010
const TOPICS = {
11+
MemberCreated: 'member.action.profile.create',
1112
MemberUpdated: 'member.action.profile.update',
1213
EmailChanged: 'member.action.email.profile.emailchange.verification',
1314
MemberTraitCreated: 'member.action.profile.trait.create',

src/services/MemberService.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ function omitMemberAttributes (currentUser, mb) {
6464
async function getMember (currentUser, handle, query) {
6565
// validate and parse query parameter
6666
const selectFields = helper.parseCommaSeparatedString(query.fields, MEMBER_FIELDS) || MEMBER_FIELDS
67+
6768
// query member from Elasticsearch
6869
const esQuery = {
6970
index: config.ES.MEMBER_PROFILE_ES_INDEX,
@@ -80,11 +81,24 @@ async function getMember (currentUser, handle, query) {
8081
}
8182
// Search with constructed query
8283
let members = await esClient.search(esQuery)
84+
8385
if (members.hits.total === 0) {
84-
throw new errors.NotFoundError(`Member with handle: "${handle}" doesn't exist`)
86+
logger.debug(`Member ${handle} not found in ES. Lookup in DynamoDB...`)
87+
try {
88+
// Check if the member handle exists in DynamoDB
89+
members = [ await helper.getMemberByHandle(handle) ]
90+
// Memember was found in DynamoDB but not ES. Send message to member-processor-es
91+
// to index the member in ES. It's safe to use the "create" topic since the processor
92+
// will only create a new item of the item doesn't exist, otherwise it'll perform an update operation.
93+
helper.postBusEvent(constants.TOPICS.MemberCreated, members[0].originalItem())
94+
} catch (e) {
95+
logger.debug(`Member ${handle} not found in DynamoDB.`)
96+
throw new errors.NotFoundError(`Member with handle: "${handle}" doesn't exist`)
97+
}
8598
} else {
8699
members = _.map(members.hits.hits, '_source')
87100
}
101+
88102
// get the 'maxRating' from stats
89103
if (_.includes(selectFields, 'maxRating')) {
90104
for (let i = 0; i < members.length; i += 1) {

src/services/MemberTraitService.js

+23
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,29 @@ async function getTraits (currentUser, handle, query) {
5151
// Search with constructed query
5252
const docs = await esClient.search(esQuery)
5353
let result = _.map(docs.hits.hits, (item) => item._source)
54+
55+
if (result.length == 0) {
56+
logger.debug(`MemberTraits for member ${handle} not found in ES. Lookup in DynamoDB...`)
57+
const resultDynamo = await helper.query('MemberTrait', { userId: { eq: member.userId } })
58+
result = resultDynamo.map(traits => {
59+
traits = traits.originalItem()
60+
traits.traits = JSON.parse(traits.traits)
61+
62+
if (traits.createdAt != null) {
63+
traits.createdAt = new Date(traits.createdAt).getTime()
64+
}
65+
66+
if (traits.updatedAt != null) {
67+
traits.updatedAt = new Date(traits.createdAt).getTime()
68+
}
69+
70+
// index in ES so subsequent API calls pull data from ES
71+
helper.postBusEvent(constants.TOPICS.MemberTraitUpdated, traits)
72+
73+
return traits
74+
})
75+
}
76+
5477
// keep only those of given trait ids
5578
if (traitIds) {
5679
result = _.filter(result, (item) => _.includes(traitIds, item.traitId))

0 commit comments

Comments
 (0)