diff --git a/README.md b/README.md index d428a55..2f356fc 100644 --- a/README.md +++ b/README.md @@ -32,5 +32,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/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 2fae050..3741678 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,11 +7,13 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - if email.present? + 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'} + else payment = DiscourseDonations::Stripe.new(secret_key, stripe_options) response = payment.charge(email, params) - else - response = {} end response['rewards'] = [] diff --git a/assets/javascripts/discourse/components/stripe-card.js.es6 b/assets/javascripts/discourse/components/stripe-card.js.es6 index 82a63f1..ec65bdc 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('anon') && this.get('settings').discourse_donations_enable_create_accounts); this.set('stripe', Stripe(this.get('settings').discourse_donations_public_key)); }, @@ -35,14 +36,41 @@ export default Ember.Component.extend({ this.get('card').mount('#card-element'); }, + setSuccess() { + this.set('paymentSuccess', 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.set('result', self.get('result') + data.message); + self.endTranscation(); + }); + }); + }, + actions: { submitStripeCard() { let self = this; 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); @@ -53,14 +81,33 @@ 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'), + create_account: this.get('create_accounts') }; - 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(!self.get('paymentSuccess')) { + ajax('/charges', { data: params, method: 'post' }).then(data => { + self.set('result', data.message); + + if(!this.get('create_accounts')) { + if(data.status == 'succeeded') { this.setSuccess() }; + self.endTranscation(); + } + else { + if(data.status == 'succeeded') { + this.createUser(); + } + else { + self.endTranscation(); + } + } + }); + } + else if (this.get('create_accounts')) { + self.set('result', ''); + self.createUser(); + } } }); } diff --git a/assets/javascripts/discourse/templates/components/stripe-card.hbs b/assets/javascripts/discourse/templates/components/stripe-card.hbs index 73b7471..674077d 100644 --- a/assets/javascripts/discourse/templates/components/stripe-card.hbs +++ b/assets/javascripts/discourse/templates/components/stripe-card.hbs @@ -22,29 +22,50 @@ {{text-field value=email}} + + {{#if create_accounts}} +
+ +
+ {{text-field value=username}} +
+
+ +
+ +
+ {{text-field value=name}} +
+
+ +
+ +
+ {{input type="password" value=password}} +
+
+ {{/if}} {{/if}}
{{#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}} {{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}} 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/config/locales/server.en.yml b/config/locales/server.en.yml index 875b019..49a1544 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: "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/config/settings.yml b/config/settings.yml index 4ef3212..0a3770d 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' diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 1804b76..8df8f62 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') @@ -13,17 +14,32 @@ 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, { email: '' } + 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 for logged in user' do + it 'responds ok when the email is empty' do + post :create, { create_account: 'true' } + expect(body['message']).to eq('Please enter your email address') + 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 'does not expect a username or email if accounts are not being created' do current_user = log_in(:coding_horror) - post :create + post :create, { create_account: 'false' } + expect(body['message']).to eq('Payment complete.') expect(response).to have_http_status(200) end