NewsletterManager.coffee 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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.warn "No newsletter provider configured so not chaning email on user"
  8. mailchimp =
  9. request: (opts, cb)-> cb()
  10. else
  11. mailchimp = new Mailchimp(Settings.mailchimp?.api_key)
  12. module.exports =
  13. subscribe: (user, callback = () ->)->
  14. options = buildOptions(user, true)
  15. logger.log options:options, user:user, email:user.email, "trying to subscribe user to the mailing list"
  16. mailchimp.request options, (err)->
  17. if err?
  18. logger.err err:err, "error subscribing person to newsletter"
  19. else
  20. logger.log user:user, "finished subscribing user to the newsletter"
  21. callback(err)
  22. unsubscribe: (user, callback = () ->)->
  23. logger.log user:user, email:user.email, "trying to unsubscribe user to the mailing list"
  24. options = buildOptions(user, false)
  25. mailchimp.request options, (err)->
  26. if err?
  27. logger.err err:err, "error unsubscribing person to newsletter"
  28. else
  29. logger.log user:user, "finished unsubscribing user to the newsletter"
  30. callback(err)
  31. changeEmail: (oldEmail, newEmail, callback = ()->)->
  32. options = buildOptions({email:oldEmail})
  33. delete options.body.status
  34. options.body.email_address = newEmail
  35. mailchimp.request options, (err)->
  36. # if the user has unsubscribed mailchimp will error on email address change
  37. if err? and err?.message.indexOf("could not be validated") == -1
  38. logger.err err:err, "error changing email in newsletter"
  39. return callback(err)
  40. else
  41. logger.log "finished changing email in the newsletter"
  42. return callback()
  43. hashEmail = (email)->
  44. crypto.createHash('md5').update(email.toLowerCase()).digest("hex")
  45. buildOptions = (user, is_subscribed)->
  46. status = if is_subscribed then "subscribed" else "unsubscribed"
  47. subscriber_hash = hashEmail(user.email)
  48. opts =
  49. method: "PUT"
  50. path: "/lists/#{Settings.mailchimp?.list_id}/members/#{subscriber_hash}"
  51. body:
  52. status_if_new: status
  53. status: status
  54. email_address:user.email
  55. merge_fields:
  56. FNAME: user.first_name
  57. LNAME: user.last_name
  58. MONGO_ID:user._id
  59. return opts