From 35f8c17e91457e8cc0bf1c46d178e95dc0b2887e Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 20 Mar 2017 14:33:17 +1100 Subject: [PATCH 01/18] initial create account fields --- .../discourse/components/stripe-card.js.es6 | 1 + .../templates/components/stripe-card.hbs | 23 +++++++++++++++++++ config/locales/server.en.yml | 1 + config/settings.yml | 3 +++ 4 files changed, 28 insertions(+) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 82a63f1..68a3bea 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -20,6 +20,7 @@ export default Ember.Component.extend({ this._super(); this.set('anon', (Discourse.User.current() == null)); this.set('settings', getRegister(this).lookup('site-settings:main')); + this.set('create_accounts', this.get('settings').discourse_donations_enable_create_accounts); this.set('stripe', Stripe(this.get('settings').discourse_donations_public_key)); }, diff --git a/assets/javascripts/discourse/templates/components/stripe-card.hbs b/assets/javascripts/discourse/templates/components/stripe-card.hbs index 73b7471..baf57f6 100644 --- a/assets/javascripts/discourse/templates/components/stripe-card.hbs +++ b/assets/javascripts/discourse/templates/components/stripe-card.hbs @@ -22,6 +22,29 @@ {{text-field value=email}} + + {{#if create_accounts}} +
+ +
+ {{text-field value=username}} +
+
+ +
+ +
+ {{text-field value=name}} +
+
+ +
+ +
+ {{input type="password" value=password}} +
+
+ {{/if}} {{/if}}
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index a1013db..29e6c3f 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1,6 +1,7 @@ en: site_settings: discourse_donations_enabled: Enable the discourse donations plugin. + discourse_donations_enable_create_accounts: Enable anonymous users to create accounts after successful payment discourse_donations_secret_key: Stripe Secret Key discourse_donations_public_key: Stripe Public Key discourse_donations_currency: Currency Code diff --git a/config/settings.yml b/config/settings.yml index bbf80c2..46b68d8 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -6,6 +6,9 @@ plugins: client: false discourse_donations_public_key: client: true + discourse_donations_enable_create_accounts: + client: true + default: false discourse_donations_description: client: true default: 'Donation' From f77ddeba310928d046d9fefbbde7d091a643f45c Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 21 Mar 2017 11:52:48 +1100 Subject: [PATCH 02/18] create a user account --- .../discourse_donations/charges_controller.rb | 15 ++++++++++++++- .../discourse/components/stripe-card.js.es6 | 5 ++++- config/locales/server.en.yml | 2 +- .../charges_controller_spec.rb | 17 +++++++++++++---- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index c45122c..9de96ff 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -10,8 +10,10 @@ module DiscourseDonations Stripe.api_key = SiteSetting.discourse_donations_secret_key currency = SiteSetting.discourse_donations_currency + current_user = create_user(params) if current_user.nil? + customer = Stripe::Customer.create( - :email => params[:email] || current_user.email, + :email => current_user.email, :source => params[:stripeToken] ) @@ -24,5 +26,16 @@ module DiscourseDonations render :json => charge end + +private + + def create_user(options) + User.create( + email: options[:email], + username: options[:username], + name: options[:name], + password: options[:password] + ) + end end end diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 68a3bea..8ce5e87 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -54,7 +54,10 @@ export default Ember.Component.extend({ let params = { stripeToken: data.token.id, amount: self.get('amount') * 100, - email: self.get('email') + email: self.get('email'), + username: self.get('username'), + name: self.get('name'), + password: self.get('password') }; ajax('/charges', { data: params, method: 'post' }).then(data => { diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 29e6c3f..52fd59d 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1,7 +1,7 @@ en: site_settings: discourse_donations_enabled: Enable the discourse donations plugin. - discourse_donations_enable_create_accounts: Enable anonymous users to create accounts after successful payment + discourse_donations_enable_create_accounts: "EXPERIMENTAL: Enable anonymous users to create accounts after successful payment" discourse_donations_secret_key: Stripe Secret Key discourse_donations_public_key: Stripe Public Key discourse_donations_currency: Currency Code diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 09aab13..9ed3761 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -7,12 +7,21 @@ module DiscourseDonations before do SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') - current_user = log_in(:coding_horror) end - it 'responds with ok' do - post :create - expect(response).to have_http_status(200) + describe 'creating user accounts' do + it 'creates a new user account' do + controller.expects(:create_user).once + post :create, { email: 'foobar@example.com' } + expect(response).to have_http_status(200) + end + + it 'does not create a new user account' do + controller.expects(:create_user).never + current_user = log_in(:coding_horror) + post :create + expect(response).to have_http_status(200) + end end end end From e26b73a57db0b0b5a877eecd19249cbc45583128 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 21 Mar 2017 12:49:31 +1100 Subject: [PATCH 03/18] fix tests, active user --- .../discourse_donations/charges_controller.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 9de96ff..fc2b1c6 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -10,10 +10,8 @@ module DiscourseDonations Stripe.api_key = SiteSetting.discourse_donations_secret_key currency = SiteSetting.discourse_donations_currency - current_user = create_user(params) if current_user.nil? - customer = Stripe::Customer.create( - :email => current_user.email, + :email => params[:email] || current_user.email, :source => params[:stripeToken] ) @@ -24,6 +22,8 @@ module DiscourseDonations :currency => currency ) + create_user(params) if current_user.nil? + render :json => charge end @@ -34,7 +34,8 @@ private email: options[:email], username: options[:username], name: options[:name], - password: options[:password] + password: options[:password], + active: true ) end end From 61361bb69dfd81b4756afb9c77735d3c79853a22 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 21 Mar 2017 14:28:26 +1100 Subject: [PATCH 04/18] approve user --- app/controllers/discourse_donations/charges_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index fc2b1c6..7db07a6 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -36,7 +36,7 @@ private name: options[:name], password: options[:password], active: true - ) + ).approve(-1, false) end end end From 3896866d5bb19f5181dbbffdc46361ea3c6691bd Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 22 Mar 2017 13:56:45 +1100 Subject: [PATCH 05/18] send another ajax request to create account --- .../discourse_donations/charges_controller.rb | 14 ----------- .../discourse/components/stripe-card.js.es6 | 25 +++++++++++++++---- .../templates/components/stripe-card.hbs | 6 ++++- config/locales/client.en.yml | 1 + .../charges_controller_spec.rb | 20 ++++++--------- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 7db07a6..c45122c 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -22,21 +22,7 @@ module DiscourseDonations :currency => currency ) - create_user(params) if current_user.nil? - render :json => charge end - -private - - def create_user(options) - User.create( - email: options[:email], - username: options[:username], - name: options[:name], - password: options[:password], - active: true - ).approve(-1, false) - end end end diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 8ce5e87..0418dc0 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -55,15 +55,30 @@ export default Ember.Component.extend({ stripeToken: data.token.id, amount: self.get('amount') * 100, email: self.get('email'), - username: self.get('username'), - name: self.get('name'), - password: self.get('password') }; ajax('/charges', { data: params, method: 'post' }).then(data => { - if(data.status == 'succeeded') { self.set('success', true) }; - self.set('transactionInProgress', false); self.set('result', data.outcome.seller_message); + + if(!this.get('create_accounts')) { + if(data.status == 'succeeded') { self.set('success', true) }; + self.set('transactionInProgress', false); + } + else { + + let params = { + email: self.get('email'), + username: self.get('username'), + name: self.get('name'), + password: self.get('password') + }; + + ajax('/users', { data: params, method: 'post' }).then(data => { + self.set('success', data.success); + self.set('transactionInProgress', false); + self.set('result', self.get('result') + data.message); + }); + } }); } }); diff --git a/assets/javascripts/discourse/templates/components/stripe-card.hbs b/assets/javascripts/discourse/templates/components/stripe-card.hbs index baf57f6..3fbcaa6 100644 --- a/assets/javascripts/discourse/templates/components/stripe-card.hbs +++ b/assets/javascripts/discourse/templates/components/stripe-card.hbs @@ -50,7 +50,11 @@
{{#d-button action="submitStripeCard" disabled=transactionInProgress class="btn btn-primary btn-payment"}} - {{i18n 'discourse_donations.submit'}} + {{#if create_accounts}} + {{i18n 'discourse_donations.submit_with_create_account'}} + {{else}} + {{i18n 'discourse_donations.submit'}} + {{/if}} {{/d-button}} {{#if transactionInProgress}} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 7ecbe12..bcd8b03 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -6,5 +6,6 @@ en: amount: Amount card: Credit or debit card submit: Make Payment + submit_with_create_account: Make Payment and Create Account messages: success: Thank you for your donation! diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 9ed3761..2eedfbd 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -9,19 +9,15 @@ module DiscourseDonations SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') end - describe 'creating user accounts' do - it 'creates a new user account' do - controller.expects(:create_user).once - post :create, { email: 'foobar@example.com' } - expect(response).to have_http_status(200) - end + it 'responds ok for anonymous users' do + post :create, { email: 'foobar@example.com' } + expect(response).to have_http_status(200) + end - it 'does not create a new user account' do - controller.expects(:create_user).never - current_user = log_in(:coding_horror) - post :create - expect(response).to have_http_status(200) - end + it 'responds ok for logged in user' do + current_user = log_in(:coding_horror) + post :create + expect(response).to have_http_status(200) end end end From ed9c847669ffced988c12291c8cdebea0809aef6 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 22 Mar 2017 15:05:06 +1100 Subject: [PATCH 06/18] create accounts only for anon users --- assets/javascripts/discourse/components/stripe-card.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 0418dc0..640e631 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -20,7 +20,7 @@ export default Ember.Component.extend({ this._super(); this.set('anon', (Discourse.User.current() == null)); this.set('settings', getRegister(this).lookup('site-settings:main')); - this.set('create_accounts', this.get('settings').discourse_donations_enable_create_accounts); + this.set('create_accounts', this.get('anon') && this.get('settings').discourse_donations_enable_create_accounts); this.set('stripe', Stripe(this.get('settings').discourse_donations_public_key)); }, From 191a9736888352d8f597ee7ec7885127f9c6d548 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 29 Mar 2017 14:29:07 +1100 Subject: [PATCH 07/18] get the info for security challenge --- .../discourse/components/stripe-card.js.es6 | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 640e631..0d813d9 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -65,19 +65,22 @@ export default Ember.Component.extend({ self.set('transactionInProgress', false); } else { + if(data.status == 'succeeded') { + ajax('/users/hp', { method: 'get' }).then(data => { + let params = Ember.assign(data, { + email: self.get('email'), + username: self.get('username'), + name: self.get('name'), + password: self.get('password') + }); - let params = { - email: self.get('email'), - username: self.get('username'), - name: self.get('name'), - password: self.get('password') - }; - - ajax('/users', { data: params, method: 'post' }).then(data => { - self.set('success', data.success); - self.set('transactionInProgress', false); - self.set('result', self.get('result') + data.message); - }); + ajax('/users', { data: params, method: 'post' }).then(data => { + self.set('success', data.success); + self.set('transactionInProgress', false); + self.set('result', self.get('result') + data.message); + }); + }); + } } }); } From 5f4be822789dedcea67ba80560440d03a3590876 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 29 Mar 2017 15:26:34 +1100 Subject: [PATCH 08/18] add challenge values to params --- .../javascripts/discourse/components/stripe-card.js.es6 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 0d813d9..ac2266c 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -67,12 +67,14 @@ export default Ember.Component.extend({ else { if(data.status == 'succeeded') { ajax('/users/hp', { method: 'get' }).then(data => { - let params = Ember.assign(data, { + let params = { email: self.get('email'), username: self.get('username'), name: self.get('name'), - password: self.get('password') - }); + password: self.get('password'), + password_confirmation: data.value, + challenge: data.challenge.split('').reverse().join(''), + }; ajax('/users', { data: params, method: 'post' }).then(data => { self.set('success', data.success); From 7ad6951b1c5314fe1552019bc5313cf55c892bcf Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 30 Mar 2017 10:40:08 +1100 Subject: [PATCH 09/18] upgrade stripe gem --- plugin.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin.rb b/plugin.rb index 4e4bfd6..78a8033 100644 --- a/plugin.rb +++ b/plugin.rb @@ -1,10 +1,10 @@ # name: discourse-donations # about: Integrating Discourse with Stripe for donations -# version: 1.7.0 +# version: 1.7.1 # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins -gem 'stripe', '2.0.3' +gem 'stripe', '2.1.0' load File.expand_path('../lib/discourse_donations/engine.rb', __FILE__) From e0b2bd522bf3cb010cef67c8034a83f924dcdfa5 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 3 Apr 2017 09:47:01 +1000 Subject: [PATCH 10/18] format html in result message --- README.md | 2 +- .../discourse/templates/components/stripe-card.hbs | 14 ++++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 041d932..226582b 100644 --- a/README.md +++ b/README.md @@ -30,5 +30,5 @@ Visit `/admin/customize/site_texts` and search for 'discourse_donations'. You'll ## TODO * Donate when creating account -* Add a plugin outlet for custom user fields. +* Handle custom fields * Handle fails from stripe diff --git a/assets/javascripts/discourse/templates/components/stripe-card.hbs b/assets/javascripts/discourse/templates/components/stripe-card.hbs index 3fbcaa6..674077d 100644 --- a/assets/javascripts/discourse/templates/components/stripe-card.hbs +++ b/assets/javascripts/discourse/templates/components/stripe-card.hbs @@ -60,18 +60,12 @@ {{#if transactionInProgress}} {{loading-spinner size="small"}} {{/if}} - {{#if result}} - {{result}} +

{{{result}}}

+ {{/if}} + {{#if success}} +

{{i18n 'discourse_donations.messages.success'}}

{{/if}}
- - {{#if success}} -
-
- {{i18n 'discourse_donations.messages.success'}} -
-
- {{/if}} From b565f69fc6043e8e2368ba9e99a9f73fb8a03404 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 3 Apr 2017 11:05:22 +1000 Subject: [PATCH 11/18] abstract out create user --- .../discourse/components/stripe-card.js.es6 | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index ac2266c..879be21 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -36,6 +36,34 @@ export default Ember.Component.extend({ this.get('card').mount('#card-element'); }, + setSuccess() { + this.set('success', true); + }, + + endTranscation() { + this.set('transactionInProgress', false); + }, + + createUser() { + let self = this; + ajax('/users/hp', { method: 'get' }).then(data => { + let params = { + email: self.get('email'), + username: self.get('username'), + name: self.get('name'), + password: self.get('password'), + password_confirmation: data.value, + challenge: data.challenge.split('').reverse().join(''), + }; + + ajax('/users', { data: params, method: 'post' }).then(data => { + self.setSuccess(); + self.endTranscation(); + self.set('result', self.get('result') + data.message); + }); + }); + }, + actions: { submitStripeCard() { let self = this; @@ -61,27 +89,12 @@ export default Ember.Component.extend({ self.set('result', data.outcome.seller_message); if(!this.get('create_accounts')) { - if(data.status == 'succeeded') { self.set('success', true) }; - self.set('transactionInProgress', false); + if(data.status == 'succeeded') { this.setSuccess(false) }; + self.endTranscation(); } else { if(data.status == 'succeeded') { - ajax('/users/hp', { method: 'get' }).then(data => { - let params = { - email: self.get('email'), - username: self.get('username'), - name: self.get('name'), - password: self.get('password'), - password_confirmation: data.value, - challenge: data.challenge.split('').reverse().join(''), - }; - - ajax('/users', { data: params, method: 'post' }).then(data => { - self.set('success', data.success); - self.set('transactionInProgress', false); - self.set('result', self.get('result') + data.message); - }); - }); + this.createUser(); } } }); From 7754513b49c81a973ea9f6c4faad9d67ee994e54 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 3 Apr 2017 12:49:23 +1000 Subject: [PATCH 12/18] do not create the transaction if it has already happened --- .../discourse/components/stripe-card.js.es6 | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 879be21..bd96acb 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -37,7 +37,7 @@ export default Ember.Component.extend({ }, setSuccess() { - this.set('success', true); + this.set('paymentSuccess', true); }, endTranscation() { @@ -59,6 +59,7 @@ export default Ember.Component.extend({ ajax('/users', { data: params, method: 'post' }).then(data => { self.setSuccess(); self.endTranscation(); + self.set('result', self.get('result') + data.message); }); }); @@ -70,8 +71,7 @@ export default Ember.Component.extend({ this.get('stripe').createToken(this.get('card')).then(data => { - self.set('result', null); - self.set('success', false); + self.set('result', ''); if (data.error) { self.set('result', data.error.message); @@ -85,19 +85,25 @@ export default Ember.Component.extend({ email: self.get('email'), }; - ajax('/charges', { data: params, method: 'post' }).then(data => { - self.set('result', data.outcome.seller_message); + if(!self.get('paymentSuccess')) { + ajax('/charges', { data: params, method: 'post' }).then(data => { + self.set('result', data.outcome.seller_message); - if(!this.get('create_accounts')) { - if(data.status == 'succeeded') { this.setSuccess(false) }; - self.endTranscation(); - } - else { - if(data.status == 'succeeded') { - this.createUser(); + if(!this.get('create_accounts')) { + if(data.status == 'succeeded') { this.setSuccess() }; + self.endTranscation(); } - } - }); + else { + if(data.status == 'succeeded') { + this.createUser(); + } + } + }); + } + else if (this.get('create_accounts')) { + self.set('result', ''); + self.createUser(); + } } }); } From 391171d560d83f205e351372f27f7fbc5858c9f7 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 11:18:35 +1000 Subject: [PATCH 13/18] respond with empty json if email does not exist --- .../discourse_donations/charges_controller.rb | 38 ++++++++++++------- .../charges_controller_spec.rb | 5 +++ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index c45122c..308747b 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,22 +7,34 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - Stripe.api_key = SiteSetting.discourse_donations_secret_key - currency = SiteSetting.discourse_donations_currency + if email.nil? + response = { - customer = Stripe::Customer.create( - :email => params[:email] || current_user.email, - :source => params[:stripeToken] - ) + } + else + Stripe.api_key = SiteSetting.discourse_donations_secret_key + currency = SiteSetting.discourse_donations_currency - charge = Stripe::Charge.create( - :customer => customer.id, - :amount => params[:amount], - :description => SiteSetting.discourse_donations_description, - :currency => currency - ) + customer = Stripe::Customer.create( + :email => email, + :source => params[:stripeToken] + ) - render :json => charge + response = Stripe::Charge.create( + :customer => customer.id, + :amount => params[:amount], + :description => SiteSetting.discourse_donations_description, + :currency => currency + ) + end + + render :json => response + end + + private + + def email + params[:email] || current_user.try(:email) end end end diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 2eedfbd..13b51d4 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -14,6 +14,11 @@ module DiscourseDonations expect(response).to have_http_status(200) end + it 'responds ok when the email is empty' do + post :create, { } + expect(response).to have_http_status(200) + end + it 'responds ok for logged in user' do current_user = log_in(:coding_horror) post :create From 3fa6130f2381d8afd96b2a795f4cf6f574f8b363 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 13:10:31 +1000 Subject: [PATCH 14/18] normalise the message in the response --- app/controllers/discourse_donations/charges_controller.rb | 6 +++--- assets/javascripts/discourse/components/stripe-card.js.es6 | 2 +- .../discourse_donations/charges_controller_spec.rb | 4 ++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 308747b..375c625 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -8,9 +8,7 @@ module DiscourseDonations def create if email.nil? - response = { - - } + response = {'message' => 'Please enter your email address'} else Stripe.api_key = SiteSetting.discourse_donations_secret_key currency = SiteSetting.discourse_donations_currency @@ -26,6 +24,8 @@ module DiscourseDonations :description => SiteSetting.discourse_donations_description, :currency => currency ) + + response['message'] = response['outcome']['seller_message'] end render :json => response diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index bd96acb..0efd136 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -87,7 +87,7 @@ export default Ember.Component.extend({ if(!self.get('paymentSuccess')) { ajax('/charges', { data: params, method: 'post' }).then(data => { - self.set('result', data.outcome.seller_message); + self.set('result', data.message); if(!this.get('create_accounts')) { if(data.status == 'succeeded') { this.setSuccess() }; diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 13b51d4..355327c 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -4,6 +4,7 @@ require_relative '../../support/dd_helper' module DiscourseDonations RSpec.describe ChargesController, type: :controller do routes { DiscourseDonations::Engine.routes } + let(:body) { JSON.parse(response.body) } before do SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') @@ -11,17 +12,20 @@ module DiscourseDonations it 'responds ok for anonymous users' do post :create, { email: 'foobar@example.com' } + expect(body['message']).to eq(body['outcome']['seller_message']) expect(response).to have_http_status(200) end it 'responds ok when the email is empty' do post :create, { } + expect(body['message']).to eq('Please enter your email address') expect(response).to have_http_status(200) end it 'responds ok for logged in user' do current_user = log_in(:coding_horror) post :create + expect(body['message']).to eq(body['outcome']['seller_message']) expect(response).to have_http_status(200) end end From 4a2f13f32ce376752508b5ace68b94049c4788da Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 13:25:51 +1000 Subject: [PATCH 15/18] end transaction when email is empty --- assets/javascripts/discourse/components/stripe-card.js.es6 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 0efd136..4841207 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -58,9 +58,8 @@ export default Ember.Component.extend({ ajax('/users', { data: params, method: 'post' }).then(data => { self.setSuccess(); - self.endTranscation(); - self.set('result', self.get('result') + data.message); + self.endTranscation(); }); }); }, @@ -97,6 +96,9 @@ export default Ember.Component.extend({ if(data.status == 'succeeded') { this.createUser(); } + else { + self.endTranscation(); + } } }); } From 671731771746a342d358751711dc0196ceddeffa Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 13:44:13 +1000 Subject: [PATCH 16/18] expect a username if an account is being created --- app/controllers/discourse_donations/charges_controller.rb | 6 ++++++ assets/javascripts/discourse/components/stripe-card.js.es6 | 2 ++ .../discourse_donations/charges_controller_spec.rb | 6 ++++++ 3 files changed, 14 insertions(+) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 375c625..df91aeb 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -9,6 +9,8 @@ module DiscourseDonations def create if email.nil? response = {'message' => 'Please enter your email address'} + elsif create_account && params[:username].nil? + response = {'message' => 'Please enter a username'} else Stripe.api_key = SiteSetting.discourse_donations_secret_key currency = SiteSetting.discourse_donations_currency @@ -33,6 +35,10 @@ module DiscourseDonations private + def create_account + params[:create_account] + end + def email params[:email] || current_user.try(:email) end diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 4841207..ec65bdc 100644 --- a/assets/javascripts/discourse/components/stripe-card.js.es6 +++ b/assets/javascripts/discourse/components/stripe-card.js.es6 @@ -82,6 +82,8 @@ export default Ember.Component.extend({ stripeToken: data.token.id, amount: self.get('amount') * 100, email: self.get('email'), + username: self.get('username'), + create_account: this.get('create_accounts') }; if(!self.get('paymentSuccess')) { diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 355327c..a6a73c1 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -22,6 +22,12 @@ module DiscourseDonations expect(response).to have_http_status(200) end + it 'expects a username if accounts are being created' do + post :create, { email: 'zipitydoodah@example.com', create_account: 'true' } + expect(body['message']).to eq('Please enter a username') + expect(response).to have_http_status(200) + end + it 'responds ok for logged in user' do current_user = log_in(:coding_horror) post :create From aaff445019091b0e226e62da4986de2f90c51c12 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 14:34:33 +1000 Subject: [PATCH 17/18] check email is not empty --- app/controllers/discourse_donations/charges_controller.rb | 2 +- .../discourse_donations/charges_controller_spec.rb | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index df91aeb..8cf51f2 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,7 +7,7 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - if email.nil? + if email.nil? || email.empty? response = {'message' => 'Please enter your email address'} elsif create_account && params[:username].nil? response = {'message' => 'Please enter a username'} diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index a6a73c1..2153aed 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -17,7 +17,13 @@ module DiscourseDonations end it 'responds ok when the email is empty' do - post :create, { } + post :create, { create_account: 'true', email: '' } + expect(body['message']).to eq('Please enter your email address') + expect(response).to have_http_status(200) + end + + it 'responds ok when the email is empty' do + post :create, { create_account: 'false' } expect(body['message']).to eq('Please enter your email address') expect(response).to have_http_status(200) end From 906952a11a81907a5a5fb44917be30d3b4decb1d Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Tue, 4 Apr 2017 15:05:50 +1000 Subject: [PATCH 18/18] check account create and email is not empty --- app/controllers/discourse_donations/charges_controller.rb | 4 ++-- .../discourse_donations/charges_controller_spec.rb | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 8cf51f2..4e6912b 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,7 +7,7 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - if email.nil? || email.empty? + if create_account && (email.nil? || email.empty?) response = {'message' => 'Please enter your email address'} elsif create_account && params[:username].nil? response = {'message' => 'Please enter a username'} @@ -36,7 +36,7 @@ module DiscourseDonations private def create_account - params[:create_account] + params[:create_account] == 'true' end def email diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 2153aed..678199f 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -23,7 +23,7 @@ module DiscourseDonations end it 'responds ok when the email is empty' do - post :create, { create_account: 'false' } + post :create, { create_account: 'true' } expect(body['message']).to eq('Please enter your email address') expect(response).to have_http_status(200) end @@ -34,10 +34,10 @@ module DiscourseDonations expect(response).to have_http_status(200) end - it 'responds ok for logged in user' do + it 'does not expect a username or email if accounts are not being created' do current_user = log_in(:coding_horror) - post :create - expect(body['message']).to eq(body['outcome']['seller_message']) + post :create, { create_account: 'false' } + expect(body['message']).to eq('Payment complete.') expect(response).to have_http_status(200) end end