merge in create account

This commit is contained in:
Rimian Perkins
2017-05-01 10:42:34 +10:00
8 changed files with 117 additions and 26 deletions
+1 -1
View File
@@ -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
@@ -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'] = []
@@ -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();
}
}
});
}
@@ -22,29 +22,50 @@
{{text-field value=email}}
</div>
</div>
{{#if create_accounts}}
<div class="control-group">
<label class="control-label" for="card-element">{{i18n 'user.username.title'}}</label>
<div class="controls">
{{text-field value=username}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="card-element">{{i18n 'user.name.title'}}</label>
<div class="controls">
{{text-field value=name}}
</div>
</div>
<div class="control-group">
<label class="control-label" for="card-element">{{i18n 'user.password.title'}}</label>
<div class="controls">
{{input type="password" value=password}}
</div>
</div>
{{/if}}
{{/if}}
<div class="control-group save-button">
<div class="controls">
{{#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}}
<span>{{result}}</span>
<p>{{{result}}}</p>
{{/if}}
{{#if success}}
<p>{{i18n 'discourse_donations.messages.success'}}</p>
{{/if}}
</div>
</div>
{{#if success}}
<div class="control-group">
<div class="controls">
<span>{{i18n 'discourse_donations.messages.success'}}</span>
</div>
</div>
{{/if}}
</form>
+1
View File
@@ -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!
+1
View File
@@ -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
+3
View File
@@ -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'
@@ -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: '[email protected]' }
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: '[email protected]', 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