Skip to content

Commit

Permalink
Merge pull request #22 from topcoder-platform/develop
Browse files Browse the repository at this point in the history
Handling Email Change Process
  • Loading branch information
urwithat authored Mar 12, 2021
2 parents 76aa2f7 + 93e333e commit fb6218f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 9 deletions.
1 change: 1 addition & 0 deletions src/common/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ function createError (name, statusCode) {
}

module.exports = {
EmailRegisteredError: createError('EmailRegisteredError', 409),
BadRequestError: createError('BadRequestError', 400),
UnauthorizedError: createError('UnauthorizedError', 401),
ForbiddenError: createError('ForbiddenError', 403),
Expand Down
36 changes: 27 additions & 9 deletions src/services/MemberService.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,31 @@ async function updateMember (currentUser, handle, query, data) {
(!member.email || data.email.trim().toLowerCase() !== member.email.trim().toLowerCase())

if (emailChanged) {
data.newEmail = data.email
delete data.email
data.emailVerifyToken = uuid()
data.emailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
data.newEmailVerifyToken = uuid()
data.newEmailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
// check if the new email exists in elastic
const esCheckEmail = {
index: config.ES.MEMBER_PROFILE_ES_INDEX,
type: config.ES.MEMBER_PROFILE_ES_TYPE,
body: {
query: {
bool: {
filter: [ {
match_phrase: { email : data.email }
} ]
}
}
}
}
let checkEmail = await esClient.count(esCheckEmail)
if (checkEmail.count == 0) {
data.newEmail = data.email
delete data.email
data.emailVerifyToken = uuid()
data.emailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
data.newEmailVerifyToken = uuid()
data.newEmailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
} else {
throw new errors.EmailRegisteredError(`Email "${data.email}" is already registered`)
}
}
// update member in db
member.updatedAt = new Date().getTime()
Expand All @@ -152,7 +171,7 @@ async function updateMember (currentUser, handle, query, data) {
data: {
subject: 'Topcoder - Email Change Verification',
userHandle: member.handle,
verificationAgreeUrl: (decodeURI(query.verifyUrl) || config.EMAIL_VERIFY_AGREE_URL).replace(
verificationAgreeUrl: (config.EMAIL_VERIFY_AGREE_URL).replace(
'<emailVerifyToken>', data.emailVerifyToken),
verificationDisagreeUrl: config.EMAIL_VERIFY_DISAGREE_URL
},
Expand All @@ -163,7 +182,7 @@ async function updateMember (currentUser, handle, query, data) {
data: {
subject: 'Topcoder - Email Change Verification',
userHandle: member.handle,
verificationAgreeUrl: (decodeURI(query.verifyUrl) || config.EMAIL_VERIFY_AGREE_URL).replace(
verificationAgreeUrl: (config.EMAIL_VERIFY_AGREE_URL).replace(
'<emailVerifyToken>', data.newEmailVerifyToken),
verificationDisagreeUrl: config.EMAIL_VERIFY_DISAGREE_URL
},
Expand All @@ -178,7 +197,6 @@ updateMember.schema = {
currentUser: Joi.any(),
handle: Joi.string().required(),
query: Joi.object().keys({
verifyUrl: Joi.string().uri(),
fields: Joi.string()
}),
data: Joi.object().keys({
Expand Down

0 comments on commit fb6218f

Please sign in to comment.