Skip to content

Commit fb6218f

Browse files
authored
Merge pull request #22 from topcoder-platform/develop
Handling Email Change Process
2 parents 76aa2f7 + 93e333e commit fb6218f

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

src/common/errors.js

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ function createError (name, statusCode) {
3131
}
3232

3333
module.exports = {
34+
EmailRegisteredError: createError('EmailRegisteredError', 409),
3435
BadRequestError: createError('BadRequestError', 400),
3536
UnauthorizedError: createError('UnauthorizedError', 401),
3637
ForbiddenError: createError('ForbiddenError', 403),

src/services/MemberService.js

+27-9
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,31 @@ async function updateMember (currentUser, handle, query, data) {
133133
(!member.email || data.email.trim().toLowerCase() !== member.email.trim().toLowerCase())
134134

135135
if (emailChanged) {
136-
data.newEmail = data.email
137-
delete data.email
138-
data.emailVerifyToken = uuid()
139-
data.emailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
140-
data.newEmailVerifyToken = uuid()
141-
data.newEmailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
136+
// check if the new email exists in elastic
137+
const esCheckEmail = {
138+
index: config.ES.MEMBER_PROFILE_ES_INDEX,
139+
type: config.ES.MEMBER_PROFILE_ES_TYPE,
140+
body: {
141+
query: {
142+
bool: {
143+
filter: [ {
144+
match_phrase: { email : data.email }
145+
} ]
146+
}
147+
}
148+
}
149+
}
150+
let checkEmail = await esClient.count(esCheckEmail)
151+
if (checkEmail.count == 0) {
152+
data.newEmail = data.email
153+
delete data.email
154+
data.emailVerifyToken = uuid()
155+
data.emailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
156+
data.newEmailVerifyToken = uuid()
157+
data.newEmailVerifyTokenDate = new Date(new Date().getTime() + Number(config.VERIFY_TOKEN_EXPIRATION) * 60000).toISOString()
158+
} else {
159+
throw new errors.EmailRegisteredError(`Email "${data.email}" is already registered`)
160+
}
142161
}
143162
// update member in db
144163
member.updatedAt = new Date().getTime()
@@ -152,7 +171,7 @@ async function updateMember (currentUser, handle, query, data) {
152171
data: {
153172
subject: 'Topcoder - Email Change Verification',
154173
userHandle: member.handle,
155-
verificationAgreeUrl: (decodeURI(query.verifyUrl) || config.EMAIL_VERIFY_AGREE_URL).replace(
174+
verificationAgreeUrl: (config.EMAIL_VERIFY_AGREE_URL).replace(
156175
'<emailVerifyToken>', data.emailVerifyToken),
157176
verificationDisagreeUrl: config.EMAIL_VERIFY_DISAGREE_URL
158177
},
@@ -163,7 +182,7 @@ async function updateMember (currentUser, handle, query, data) {
163182
data: {
164183
subject: 'Topcoder - Email Change Verification',
165184
userHandle: member.handle,
166-
verificationAgreeUrl: (decodeURI(query.verifyUrl) || config.EMAIL_VERIFY_AGREE_URL).replace(
185+
verificationAgreeUrl: (config.EMAIL_VERIFY_AGREE_URL).replace(
167186
'<emailVerifyToken>', data.newEmailVerifyToken),
168187
verificationDisagreeUrl: config.EMAIL_VERIFY_DISAGREE_URL
169188
},
@@ -178,7 +197,6 @@ updateMember.schema = {
178197
currentUser: Joi.any(),
179198
handle: Joi.string().required(),
180199
query: Joi.object().keys({
181-
verifyUrl: Joi.string().uri(),
182200
fields: Joi.string()
183201
}),
184202
data: Joi.object().keys({

0 commit comments

Comments
 (0)