refactor(payments): move payments into it's own service, out of rootCtrl

This commit is contained in:
Tyler Renelle 2014-11-30 14:01:58 -07:00
parent 8c5842eb52
commit 0a53a5717e
7 changed files with 87 additions and 66 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;
}]);

View file

@ -46,6 +46,7 @@
"js/services/memberServices.js",
"js/services/guideServices.js",
"js/services/challengeServices.js",
"js/services/paymentServices.js",
"js/filters/filters.js",

View file

@ -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')} <strong>{{moment(p.dateTerminated).format('MM/DD/YYYY')}}</strong>
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')
.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')

View file

@ -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'")

View file

@ -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')