NewsletterManager.coffee 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. async = require('async')
  2. logger = require 'logger-sharelatex'
  3. Settings = require 'settings-sharelatex'
  4. crypto = require('crypto')
  5. Mailchimp = require('mailchimp-api-v3')
  6. if !Settings.mailchimp?.api_key?
  7. logger.info "Using newsletter provider: none"
  8. mailchimp =
  9. request: (opts, cb)-> cb()
  10. else
  11. logger.info "Using newsletter provider: mailchimp"
  12. mailchimp = new Mailchimp(Settings.mailchimp?.api_key)
  13. module.exports =
  14. subscribe: (user, callback = () ->)->
  15. options = buildOptions(user, true)
  16. logger.log options:options, user:user, email:user.email, "subscribing user to the mailing list"
  17. mailchimp.request options, (err)->
  18. if err?
  19. logger.err err:err, user:user, "error subscribing person to newsletter"
  20. else
  21. logger.log user:user, "finished subscribing user to the newsletter"
  22. callback(err)
  23. unsubscribe: (user, callback = () ->)->
  24. logger.log user:user, email:user.email, "trying to unsubscribe user to the mailing list"
  25. options = buildOptions(user, false)
  26. mailchimp.request options, (err)->
  27. if err?
  28. logger.err err:err, user:user, "error unsubscribing person to newsletter"
  29. else
  30. logger.log user:user, "finished unsubscribing user to the newsletter"
  31. callback(err)
  32. changeEmail: (oldEmail, newEmail, callback = ()->)->
  33. options = buildOptions({email:oldEmail})
  34. delete options.body.status
  35. options.body.email_address = newEmail
  36. logger.log {oldEmail, newEmail, options}, "changing email in newsletter"
  37. mailchimp.request options, (err)->
  38. if err? and err?.message?.indexOf("merge fields were invalid") != -1
  39. logger.log {oldEmail, newEmail}, "unable to change email in newsletter, user has never subscribed"
  40. return callback()
  41. else if err? and err?.message?.indexOf("could not be validated") != -1
  42. logger.log {oldEmail, newEmail},
  43. "unable to change email in newsletter, user has previously unsubscribed or new email already exist on list"
  44. return callback()
  45. else if err? and err.message.indexOf("is already a list member") != -1
  46. logger.log {oldEmail, newEmail},
  47. "unable to change email in newsletter, new email is already on mailing list"
  48. return callback()
  49. else if err? and err?.message?.indexOf("looks fake or invalid") != -1
  50. logger.log {oldEmail, newEmail},
  51. "unable to change email in newsletter, email looks fake to mailchimp"
  52. return callback()
  53. else if err?
  54. logger.err {err, oldEmail, newEmail}, "error changing email in newsletter"
  55. return callback(err)
  56. else
  57. logger.log "finished changing email in the newsletter"
  58. return callback()
  59. hashEmail = (email)->
  60. crypto.createHash('md5').update(email.toLowerCase()).digest("hex")
  61. buildOptions = (user, is_subscribed)->
  62. subscriber_hash = hashEmail(user.email)
  63. status = if is_subscribed then "subscribed" else "unsubscribed"
  64. opts =
  65. method: "PUT"
  66. path: "/lists/#{Settings.mailchimp?.list_id}/members/#{subscriber_hash}"
  67. body:
  68. email_address:user.email
  69. status_if_new: status
  70. #only set status if we explictly want to set it
  71. if is_subscribed?
  72. opts.body.status = status
  73. if user._id?
  74. opts.body.merge_fields =
  75. FNAME: user.first_name
  76. LNAME: user.last_name
  77. MONGO_ID:user._id
  78. return opts