Skip to content

Commit 1f86e20

Browse files
committed
feat: lookup from dynamodb if member is not found in ES
if member is not found in ES lookup from DynamoDB and on success emit profile created event to let member-processor-es index the member in ES
1 parent b0b5530 commit 1f86e20

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

app-constants.js

Lines changed: 1 addition & 0 deletions
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

Lines changed: 16 additions & 1 deletion
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,25 @@ 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+
}
95+
catch (e) {
96+
logger.debug(`Member ${handle} not found in DynamoDB.`)
97+
throw new errors.NotFoundError(`Member with handle: "${handle}" doesn't exist`)
98+
}
8599
} else {
86100
members = _.map(members.hits.hits, '_source')
87101
}
102+
88103
// get the 'maxRating' from stats
89104
if (_.includes(selectFields, 'maxRating')) {
90105
for (let i = 0; i < members.length; i += 1) {

0 commit comments

Comments
 (0)