From fca45a3c0b5b13a22b0fccd16402f812051551a1 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Sat, 13 Sep 2014 14:28:11 +0200 Subject: [PATCH] feat(emails): add emails on signup, subscription begin and donation --- config.json.example | 5 +- package.json | 75 +++++++++--------- .../emails/images/subscription-begins-v1.png | Bin 0 -> 5495 bytes src/controllers/auth.js | 43 ++++++++++ src/controllers/payments.js | 57 +++++++++++++ 5 files changed, 142 insertions(+), 38 deletions(-) create mode 100644 public/emails/images/subscription-begins-v1.png diff --git a/config.json.example b/config.json.example index ccf97ff489..4078868cec 100644 --- a/config.json.example +++ b/config.json.example @@ -20,5 +20,8 @@ "GA_ID": "GA_ID", "PAYPAL_USERNAME": "PAYPAL_USERNAME", "PAYPAL_PASSWORD": "PAYPAL_PASSWORD", - "PAYPAL_SIGNATURE": "PAYPAL_SIGNATURE" + "PAYPAL_SIGNATURE": "PAYPAL_SIGNATURE", + "EMAIL_SERVER_URL": "http://example.com", + "EMAIL_SERVER_AUTH_USER": "user", + "EMAIL_SERVER_AUTH_PASSWORD": "password" } diff --git a/package.json b/package.json index 8cc66956c5..8051d8bd9a 100644 --- a/package.json +++ b/package.json @@ -4,56 +4,57 @@ "version": "0.0.0-152", "main": "./src/server.js", "dependencies": { - "habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared#develop", - "connect-mongo": "*", - "express": "3.5.x", - "gzippo": "*", - "guid": "*", - "moment": "~2.4.0", - "stripe": "*", - "coffee-script": "1.6.x", - "nconf": "*", - "icalendar": "git://github.com/lefnire/node-icalendar#master", - "resolve": "~0.2.3", - "lodash": "~2.2.1", "async": "~0.2.9", - "optimist": "~0.5.2", - "stylus": "~0.37.0", + "bower": "~1.3.8", + "coffee-script": "1.6.x", + "connect-mongo": "*", + "connect-ratelimit": "0.0.6", + "coupon-code": "~0.3.0", + "domain-middleware": "~0.1.0", + "express": "3.5.x", + "express-csv": "~0.6.0", "grunt": "~0.4.1", - "grunt-contrib-uglify": "~0.2.4", - "grunt-contrib-stylus": "~0.8.0", + "grunt-cli": "~0.1.9", + "grunt-concurrent": "~0.3.1", "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-cssmin": "~0.6.1", - "grunt-contrib-watch": "~0.5.3", "grunt-contrib-copy": "~0.4.1", + "grunt-contrib-cssmin": "~0.6.1", + "grunt-contrib-stylus": "~0.8.0", + "grunt-contrib-uglify": "~0.2.4", + "grunt-contrib-watch": "~0.5.3", "grunt-hashres": "~0.3.2", "grunt-nodemon": "~0.1.1", - "grunt-concurrent": "~0.3.1", - "bower": "~1.3.8", - "nib": "~1.0.1", + "guid": "*", + "gzippo": "*", + "habitrpg-shared": "git://github.com/HabitRPG/habitrpg-shared#develop", + "icalendar": "git://github.com/lefnire/node-icalendar#master", "jade": "~0.35.0", - "validator": "~3.11.2", - "nodemailer": "~0.5.2", - "grunt-cli": "~0.1.9", - "express-csv": "~0.6.0", - "pretty-data": "git://github.com/vkiryukhin/pretty-data#master", "js2xmlparser": "~0.1.2", + "lodash": "~2.2.1", + "moment": "~2.4.0", "mongoose": "3.8.5", - "swagger-node-express": "git://github.com/lefnire/swagger-node-express#habitrpg", + "mongoose-id-autoinc": "~2013.7.14-4", + "nconf": "*", + "newrelic": "~1.10.3", + "nib": "~1.0.1", + "nodemailer": "~0.5.2", + "optimist": "~0.5.2", "passport": "~0.1.18", "passport-facebook": "~1.0.2", - "newrelic": "~1.10.3", - "connect-ratelimit": "0.0.6", + "paypal-express-checkout": "git://github.com/HabitRPG/node-paypal-express-checkout#habitrpg", + "paypal-ipn": "~1.0.1", + "paypal-recurring": "git://github.com/jaybryant/paypal-recurring#656b496f43440893c984700191666a5c5c535dca", + "pretty-data": "git://github.com/vkiryukhin/pretty-data#master", + "request": "~2.42.0", + "resolve": "~0.2.3", + "stripe": "*", + "stylus": "~0.37.0", + "swagger-node-express": "git://github.com/lefnire/swagger-node-express#habitrpg", + "universal-analytics": "~0.3.2", + "validator": "~3.11.2", "winston": "~0.7.2", "winston-mail": "~0.2.7", - "winston-newrelic": "~0.1.4", - "domain-middleware": "~0.1.0", - "universal-analytics": "~0.3.2", - "paypal-express-checkout": "git://github.com/HabitRPG/node-paypal-express-checkout#habitrpg", - "paypal-recurring": "git://github.com/jaybryant/paypal-recurring#656b496f43440893c984700191666a5c5c535dca", - "paypal-ipn": "~1.0.1", - "coupon-code": "~0.3.0", - "mongoose-id-autoinc": "~2013.7.14-4" + "winston-newrelic": "~0.1.4" }, "private": true, "subdomain": "habitrpg", diff --git a/public/emails/images/subscription-begins-v1.png b/public/emails/images/subscription-begins-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..856a67622c95c549d6b94be0a337132f7a526c40 GIT binary patch literal 5495 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 Stripe").send(); } @@ -74,6 +103,34 @@ function buyGems(user, data) { user.purchased.txnCount++; ga.event('checkout', data.paymentMethod).send(); ga.transaction(data.customerId, 5).item(5, 1, data.paymentMethod.toLowerCase() + "-checkout", "Gems > " + data.paymentMethod).send(); + if(isProduction){ + var email, name; + if(user.auth.local){ + email = user.auth.local.email; + name = user.profile.name || user.auth.local.username; + }else if(user.auth.facebook && user.auth.facebook.emails && user.auth.facebook.emails[0] && user.auth.facebook.emails[0].value){ + email = user.auth.facebook.emails[0].value; + name = user.auth.facebook.displayName || user.auth.facebook.username; + } + request({ + url: nconf.get('EMAIL_SERVER_URL') + '/job', + method: 'POST', + auth: { + user: nconf.get('EMAIL_SERVER_AUTH_USER'), + pass: nconf.get('EMAIL_SERVER_AUTH_PASSWORD') + }, + json: { + type: 'email', + data: { + emailType: 'donation', + to: { + name: req.user.displayName || req.user.username, + email: req.user.emails[0].value + } + } + } + }); + } } // Expose some functions for tests