|
@@ -1,37 +1,68 @@
|
|
|
async = require('async')
|
|
async = require('async')
|
|
|
-Request = require('request')
|
|
|
|
|
logger = require 'logger-sharelatex'
|
|
logger = require 'logger-sharelatex'
|
|
|
Settings = require 'settings-sharelatex'
|
|
Settings = require 'settings-sharelatex'
|
|
|
|
|
+crypto = require('crypto')
|
|
|
|
|
+Mailchimp = require('mailchimp-api-v3')
|
|
|
|
|
+
|
|
|
|
|
+if !Settings.mailchimp?.api_key?
|
|
|
|
|
+ logger.info "Using newsletter provider: none"
|
|
|
|
|
+ mailchimp =
|
|
|
|
|
+ request: (opts, cb)-> cb()
|
|
|
|
|
+else
|
|
|
|
|
+ logger.info "Using newsletter provider: mailchimp"
|
|
|
|
|
+ mailchimp = new Mailchimp(Settings.mailchimp?.api_key)
|
|
|
|
|
|
|
|
module.exports =
|
|
module.exports =
|
|
|
|
|
+
|
|
|
subscribe: (user, callback = () ->)->
|
|
subscribe: (user, callback = () ->)->
|
|
|
- if !Settings.markdownmail?
|
|
|
|
|
- logger.warn "No newsletter provider configured so not subscribing user"
|
|
|
|
|
- return callback()
|
|
|
|
|
- logger.log user:user, email:user.email, "trying to subscribe user to the mailing list"
|
|
|
|
|
options = buildOptions(user, true)
|
|
options = buildOptions(user, true)
|
|
|
- Request.post options, (err, response, body)->
|
|
|
|
|
- logger.log body:body, user:user, "finished attempting to subscribe the user to the news letter"
|
|
|
|
|
|
|
+ logger.log options:options, user:user, email:user.email, "trying to subscribe user to the mailing list"
|
|
|
|
|
+ mailchimp.request options, (err)->
|
|
|
|
|
+ if err?
|
|
|
|
|
+ logger.err err:err, "error subscribing person to newsletter"
|
|
|
|
|
+ else
|
|
|
|
|
+ logger.log user:user, "finished subscribing user to the newsletter"
|
|
|
callback(err)
|
|
callback(err)
|
|
|
|
|
|
|
|
unsubscribe: (user, callback = () ->)->
|
|
unsubscribe: (user, callback = () ->)->
|
|
|
- if !Settings.markdownmail?
|
|
|
|
|
- logger.warn "No newsletter provider configured so not unsubscribing user"
|
|
|
|
|
- return callback()
|
|
|
|
|
logger.log user:user, email:user.email, "trying to unsubscribe user to the mailing list"
|
|
logger.log user:user, email:user.email, "trying to unsubscribe user to the mailing list"
|
|
|
options = buildOptions(user, false)
|
|
options = buildOptions(user, false)
|
|
|
- Request.post options, (err, response, body)->
|
|
|
|
|
- logger.log err:err, body:body, email:user.email, "compled newsletter unsubscribe attempt"
|
|
|
|
|
|
|
+ mailchimp.request options, (err)->
|
|
|
|
|
+ if err?
|
|
|
|
|
+ logger.err err:err, "error unsubscribing person to newsletter"
|
|
|
|
|
+ else
|
|
|
|
|
+ logger.log user:user, "finished unsubscribing user to the newsletter"
|
|
|
callback(err)
|
|
callback(err)
|
|
|
|
|
|
|
|
|
|
+ changeEmail: (oldEmail, newEmail, callback = ()->)->
|
|
|
|
|
+ options = buildOptions({email:oldEmail})
|
|
|
|
|
+ delete options.body.status
|
|
|
|
|
+ options.body.email_address = newEmail
|
|
|
|
|
+ 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"
|
|
|
|
|
+ return callback(err)
|
|
|
|
|
+ else
|
|
|
|
|
+ logger.log "finished changing email in the newsletter"
|
|
|
|
|
+ return callback()
|
|
|
|
|
+
|
|
|
|
|
+hashEmail = (email)->
|
|
|
|
|
+ crypto.createHash('md5').update(email.toLowerCase()).digest("hex")
|
|
|
|
|
+
|
|
|
buildOptions = (user, is_subscribed)->
|
|
buildOptions = (user, is_subscribed)->
|
|
|
- options =
|
|
|
|
|
- json:
|
|
|
|
|
- secret_token: Settings.markdownmail.secret
|
|
|
|
|
- name: "#{user.first_name} #{user.last_name}"
|
|
|
|
|
- email: user.email
|
|
|
|
|
- subscriber_list_id: Settings.markdownmail.list_id
|
|
|
|
|
- is_subscribed: is_subscribed
|
|
|
|
|
- url: "https://www.markdownmail.io/lists/subscribe"
|
|
|
|
|
- timeout: 30 * 1000
|
|
|
|
|
- return options
|
|
|
|
|
|
|
+ status = if is_subscribed then "subscribed" else "unsubscribed"
|
|
|
|
|
+ subscriber_hash = hashEmail(user.email)
|
|
|
|
|
+ opts =
|
|
|
|
|
+ method: "PUT"
|
|
|
|
|
+ path: "/lists/#{Settings.mailchimp?.list_id}/members/#{subscriber_hash}"
|
|
|
|
|
+ body:
|
|
|
|
|
+ status_if_new: status
|
|
|
|
|
+ status: status
|
|
|
|
|
+ email_address:user.email
|
|
|
|
|
+ merge_fields:
|
|
|
|
|
+ FNAME: user.first_name
|
|
|
|
|
+ LNAME: user.last_name
|
|
|
|
|
+ MONGO_ID:user._id
|
|
|
|
|
+ return opts
|
|
|
|
|
+
|