From 0a53a5717e534ce6422a8e18e714a9e0ef028166 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Sun, 30 Nov 2014 14:01:58 -0700 Subject: [PATCH] refactor(payments): move payments into it's own service, out of rootCtrl --- public/js/app.js | 2 +- public/js/controllers/rootCtrl.js | 62 ++-------------------- public/js/services/paymentServices.js | 74 +++++++++++++++++++++++++++ public/manifest.json | 1 + views/options/settings.jade | 10 ++-- views/shared/modals/buy-gems.jade | 2 +- views/shared/modals/members.jade | 2 +- 7 files changed, 87 insertions(+), 66 deletions(-) create mode 100644 public/js/services/paymentServices.js diff --git a/public/js/app.js b/public/js/app.js index 575e8357ba..c12ba3aa08 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -2,7 +2,7 @@ window.habitrpg = angular.module('habitrpg', ['ngResource', 'ngSanitize', 'userServices', 'groupServices', 'memberServices', 'challengeServices', - 'authServices', 'notificationServices', 'guideServices', 'authCtrl', + 'authServices', 'notificationServices', 'guideServices', 'authCtrl', 'paymentServices', 'ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter']) // @see https://github.com/angular-ui/ui-router/issues/110 and https://github.com/HabitRPG/habitrpg/issues/1705 diff --git a/public/js/controllers/rootCtrl.js b/public/js/controllers/rootCtrl.js index 4b30f7f6ec..004660dd6a 100644 --- a/public/js/controllers/rootCtrl.js +++ b/public/js/controllers/rootCtrl.js @@ -3,8 +3,8 @@ /* Make user and settings available for everyone through root scope. */ -habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content', '$modal', '$timeout', 'ApiUrlService', '$filter', - function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content, $modal, $timeout, ApiUrlService, $filter) { +habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$http', '$state', '$stateParams', 'Notification', 'Groups', 'Shared', 'Content', '$modal', '$timeout', 'ApiUrlService', 'Payments', + function($scope, $rootScope, $location, User, $http, $state, $stateParams, Notification, Groups, Shared, Content, $modal, $timeout, ApiUrlService, Payments) { var user = User.user; var initSticky = _.once(function(){ @@ -33,6 +33,7 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ $rootScope.Math = Math; $rootScope.Groups = Groups; $rootScope.toJson = angular.toJson; + $rootScope.Payments = Payments; // Angular UI Router $rootScope.$state = $state; @@ -144,63 +145,6 @@ habitrpg.controller("RootCtrl", ['$scope', '$rootScope', '$location', 'User', '$ return JSON.stringify(gift); } - $rootScope.showStripe = function(data) { - var sub = - data.subscription ? data.subscription - : data.gift && data.gift.type=='subscription' ? data.gift.subscription.months - : false; - sub = sub && Content.subscriptionBlocks[sub]; - var amount = // 500 = $5 - sub ? sub.price*100 - : data.gift && data.gift.type=='gems' ? data.gift.gems.amount/4*100 - : 500; - StripeCheckout.open({ - key: window.env.STRIPE_PUB_KEY, - address: false, - amount: amount, - name: sub ? window.env.t('subscribe') : window.env.t('checkout'), - description: sub ? window.env.t('buySubsText') : window.env.t('donationDesc'), - panelLabel: sub ? window.env.t('subscribe') : window.env.t('checkout'), - token: function(res) { - var url = '/stripe/checkout?a=a'; // just so I can concat &x=x below - if (data.gift) url += '&gift=' + $rootScope.encodeGift(data.uuid, data.gift); - if (data.subscription) url += '&sub='+sub.months; - $scope.$apply(function(){ - $http.post(url, res).success(function() { - window.location.reload(true); - }).error(function(res) { - alert(res.err); - }); - }) - } - }); - } - - $rootScope.showStripeEdit = function(){ - StripeCheckout.open({ - key: window.env.STRIPE_PUB_KEY, - address: false, - name: 'Update', - description: 'Update the card to be charged for your subscription', - panelLabel: 'Update Card', - token: function(data) { - var url = '/stripe/subscribe/edit?plan=basic_earned'; - $scope.$apply(function(){ - $http.post(url, data).success(function() { - window.location.reload(true); - }).error(function(data) { - alert(data.err); - }); - }) - } - }); - } - - $rootScope.cancelSubscription = function(){ - if (!confirm(window.env.t('sureCancelSub'))) return; - window.location.href = '/' + user.purchased.plan.paymentMethod.toLowerCase() + '/subscribe/cancel?_id=' + user._id + '&apiToken=' + user.apiToken; - } - $scope.contribText = function(contrib, backer){ if (!contrib && !backer) return; if (backer && backer.npc) return backer.npc; diff --git a/public/js/services/paymentServices.js b/public/js/services/paymentServices.js new file mode 100644 index 0000000000..e3dcddf6e8 --- /dev/null +++ b/public/js/services/paymentServices.js @@ -0,0 +1,74 @@ +'use strict'; + +angular.module('paymentServices',[]).factory('Payments', +['$rootScope', 'User', '$http', 'Content', +function($rootScope, User, $http, Content) { + var user = User.user; + var plan = User.user.purchased.plan; + var Payments = {}; + + Payments.currentSub = _.find(Content.subscriptionBlocks, function(b){ + switch (plan.paymentMethod) { + case 'Stripe': + return b.key == plan.planId; + case 'Paypal': + return b.paypalKey == plan.planId; + default: return undefined; + } + }) + + Payments.showStripe = function(data) { + var sub = + data.subscription ? data.subscription + : data.gift && data.gift.type=='subscription' ? data.gift.subscription.months + : false; + sub = sub && Content.subscriptionBlocks[sub]; + var amount = // 500 = $5 + sub ? sub.price*100 + : data.gift && data.gift.type=='gems' ? data.gift.gems.amount/4*100 + : 500; + StripeCheckout.open({ + key: window.env.STRIPE_PUB_KEY, + address: false, + amount: amount, + name: sub ? window.env.t('subscribe') : window.env.t('checkout'), + description: sub ? window.env.t('buySubsText') : window.env.t('donationDesc'), + panelLabel: sub ? window.env.t('subscribe') : window.env.t('checkout'), + token: function(res) { + var url = '/stripe/checkout?a=a'; // just so I can concat &x=x below + if (data.gift) url += '&gift=' + $rootScope.encodeGift(data.uuid, data.gift); + if (data.subscription) url += '&sub='+sub.months; + $http.post(url, res).success(function() { + window.location.reload(true); + }).error(function(res) { + alert(res.err); + }); + } + }); + } + + Payments.showStripeEdit = function(){ + StripeCheckout.open({ + key: window.env.STRIPE_PUB_KEY, + address: false, + name: 'Update', + description: 'Update the card to be charged for your subscription', + panelLabel: 'Update Card', + token: function(data) { + var url = '/stripe/subscribe/edit?plan=basic_earned'; + $http.post(url, data).success(function() { + window.location.reload(true); + }).error(function(data) { + alert(data.err); + }); + } + }); + } + + Payments.cancelSubscription = function(){ + if (!confirm(window.env.t('sureCancelSub'))) return; + window.location.href = '/' + plan.paymentMethod.toLowerCase() + '/subscribe/cancel?_id=' + user._id + '&apiToken=' + user.apiToken; + } + + return Payments; +}]); diff --git a/public/manifest.json b/public/manifest.json index 2e8a5b4ee1..dd4e9abe2a 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -46,6 +46,7 @@ "js/services/memberServices.js", "js/services/guideServices.js", "js/services/challengeServices.js", + "js/services/paymentServices.js", "js/filters/filters.js", diff --git a/views/options/settings.jade b/views/options/settings.jade index 899cabb999..da842b27c9 100644 --- a/views/options/settings.jade +++ b/views/options/settings.jade @@ -236,7 +236,9 @@ script(id='partials/options.settings.subscription.html',type='text/ng-template') tr(ng-if='p.dateTerminated'): td.alert.alert-warning i.glyphicon.glyphicon-time | #{env.t('subCanceled')} {{moment(p.dateTerminated).format('MM/DD/YYYY')}} - tr(ng-if='!p.dateTerminated'): td: h4=env.t('subscribed') + tr(ng-if='!p.dateTerminated'): td + h4=env.t('subscribed') + p(ng-if='Payments.currentSub') Recurring ${{Payments.currentSub.price}} each {{Payments.currentSub.months}} Month(s) ({{p.paymentMethod}}) tr(ng-if='p.extraMonths'): td span.glyphicon.glyphicon-credit-card | You have {{p.extraMonths | number:2}} months of subscription credit. @@ -256,8 +258,8 @@ script(id='partials/options.settings.subscription.html',type='text/ng-template') | #{block.months} Month(s) Recurring: $#{block.price} #{env.t('monthUSD')} h3(ng-if='(p.customerId && p.dateTerminated)') Resubscribe - button.btn.btn-primary(ng-click='showStripe({subscription:_subscription.months})', ng-disabled='!_subscription.months') Card + button.btn.btn-primary(ng-click='Payments.showStripe({subscription:_subscription.months})', ng-disabled='!_subscription.months') Card button.btn.btn-warning(href='/paypal/subscribe?_id={{user._id}}&apiToken={{user.apiToken}}&sub={{_subscription.months}}', ng-disabled='!_subscription.months') PayPal div(ng-if='p.customerId') - .btn.btn-primary(ng-if='!p.dateTerminated && p.paymentMethod=="Stripe"', ng-click='showStripeEdit()') Update Card - .btn.btn-sm.btn-danger(ng-if='!p.dateTerminated', ng-click='cancelSubscription()')=env.t('cancelSub') \ No newline at end of file + .btn.btn-primary(ng-if='!p.dateTerminated && p.paymentMethod=="Stripe"', ng-click='Payments.showStripeEdit()') Update Card + .btn.btn-sm.btn-danger(ng-if='!p.dateTerminated', ng-click='Payments.cancelSubscription()')=env.t('cancelSub') \ No newline at end of file diff --git a/views/shared/modals/buy-gems.jade b/views/shared/modals/buy-gems.jade index b1caf50816..8cb78cc0b2 100644 --- a/views/shared/modals/buy-gems.jade +++ b/views/shared/modals/buy-gems.jade @@ -20,7 +20,7 @@ script(id='modals/buyGems.html', type='text/ng-template') td p small.muted=env.t('paymentMethods') - .btn.btn-primary(ng-click='showStripe({})')=env.t('card') + .btn.btn-primary(ng-click='Payments.showStripe({})')=env.t('card') a.btn.btn-warning(href='/paypal/checkout?_id={{user._id}}&apiToken={{user.apiToken}}') PayPal div(ng-include="'partials/options.settings.subscription.html'") diff --git a/views/shared/modals/members.jade b/views/shared/modals/members.jade index 60eaf2f79f..b495489078 100644 --- a/views/shared/modals/members.jade +++ b/views/shared/modals/members.jade @@ -86,6 +86,6 @@ script(type='text/ng-template', id='modals/send-gift.html') .modal-footer - var fromBal = "gift.type=='gems' && gift.gems.fromBalance" button.btn.btn-primary(ng-show=fromBal, ng-click='sendGift(profile._id, gift)')=env.t("send") - a.btn.btn-primary(ng-hide=fromBal, ng-click='showStripe({gift:gift, uuid:profile._id})')=env.t('card') + a.btn.btn-primary(ng-hide=fromBal, ng-click='Payments.showStripe({gift:gift, uuid:profile._id})')=env.t('card') a.btn.btn-warning(ng-hide=fromBal, href='/paypal/checkout?_id={{::user._id}}&apiToken={{::user.apiToken}}&gift={{encodeGift(profile._id, gift)}}') PayPal button.btn.btn-default(ng-click='$close()')=env.t('cancel') \ No newline at end of file