소스 검색

Merge pull request #857 from sharelatex/ho-mailchimp-change-email

add error handling for changing email in newsletter of user who has not subscribed
Timothée Alby 8 년 전
부모
커밋
c2ef2326b9
1개의 변경된 파일과 25개의 추가작업 그리고 13개의 파일을 삭제
  1. 25 13
      services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee

+ 25 - 13
services/web/app/coffee/Features/Newsletter/NewsletterManager.coffee

@@ -16,10 +16,10 @@ module.exports =
 
 
 	subscribe: (user, callback = () ->)->
 	subscribe: (user, callback = () ->)->
 		options = buildOptions(user, true)
 		options = buildOptions(user, true)
-		logger.log options:options, user:user, email:user.email, "trying to subscribe user to the mailing list"
+		logger.log options:options, user:user, email:user.email, "subscribing user to the mailing list"
 		mailchimp.request options, (err)->
 		mailchimp.request options, (err)->
 			if err?
 			if err?
-				logger.err err:err, "error subscribing person to newsletter"
+				logger.err err:err, user:user, "error subscribing person to newsletter"
 			else
 			else
 				logger.log user:user, "finished subscribing user to the newsletter"
 				logger.log user:user, "finished subscribing user to the newsletter"
 			callback(err)
 			callback(err)
@@ -29,7 +29,7 @@ module.exports =
 		options = buildOptions(user, false)
 		options = buildOptions(user, false)
 		mailchimp.request options, (err)->
 		mailchimp.request options, (err)->
 			if err?
 			if err?
-				logger.err err:err, "error unsubscribing person to newsletter"
+				logger.err err:err, user:user, "error unsubscribing person to newsletter"
 			else
 			else
 				logger.log user:user, "finished unsubscribing user to the newsletter"
 				logger.log user:user, "finished unsubscribing user to the newsletter"
 			callback(err)
 			callback(err)
@@ -38,10 +38,17 @@ module.exports =
 		options = buildOptions({email:oldEmail})
 		options = buildOptions({email:oldEmail})
 		delete options.body.status
 		delete options.body.status
 		options.body.email_address = newEmail
 		options.body.email_address = newEmail
+		logger.log {oldEmail, newEmail, options}, "changing email in newsletter"
 		mailchimp.request options, (err)->
 		mailchimp.request options, (err)->
-			# if the user has unsubscribed mailchimp will error on email address change
-			if err? and err?.message.indexOf("could not be validated") == -1
-				logger.err err:err, "error changing email in newsletter"
+			if err? and err?.message?.indexOf("merge fields were invalid") != -1
+				logger.log {oldEmail, newEmail}, "unable to change email in newsletter, user has never subscribed"
+				return callback()
+			else if err? and err?.message?.indexOf("could not be validated") != -1
+				logger.log {oldEmail, newEmail}, 
+					"unable to change email in newsletter, user has previously unsubscribed or new email already exist on list"
+				return callback(err)
+			else if err?
+				logger.err {err, oldEmail, newEmail}, "error changing email in newsletter"
 				return callback(err)
 				return callback(err)
 			else
 			else
 				logger.log "finished changing email in the newsletter"
 				logger.log "finished changing email in the newsletter"
@@ -51,18 +58,23 @@ hashEmail = (email)->
 	crypto.createHash('md5').update(email.toLowerCase()).digest("hex")
 	crypto.createHash('md5').update(email.toLowerCase()).digest("hex")
 
 
 buildOptions = (user, is_subscribed)->
 buildOptions = (user, is_subscribed)->
-	status =  if is_subscribed then "subscribed" else "unsubscribed"
 	subscriber_hash = hashEmail(user.email)
 	subscriber_hash = hashEmail(user.email)
 	opts =
 	opts =
 		method: "PUT"
 		method: "PUT"
 		path: "/lists/#{Settings.mailchimp?.list_id}/members/#{subscriber_hash}"
 		path: "/lists/#{Settings.mailchimp?.list_id}/members/#{subscriber_hash}"
 		body:
 		body:
-			status_if_new: status
-			status: status
 			email_address:user.email
 			email_address:user.email
-			merge_fields:
-				FNAME: user.first_name
-				LNAME: user.last_name
-				MONGO_ID:user._id
+				
+	status = if is_subscribed then "subscribed" else "unsubscribed"
+	if is_subscribed?
+		opts.body.status = status
+		opts.body.status_if_new = status
+
+	if user._id?
+		opts.body.merge_fields = 
+			FNAME: user.first_name
+			LNAME: user.last_name
+			MONGO_ID:user._id
+
 	return opts
 	return opts