From 316dc61af55ae6460b16ae2fd4f26562af3c10f6 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 6 Apr 2017 14:16:05 +1000 Subject: [PATCH 01/19] add discourse stripe service --- app/services/discourse_donations/stripe.rb | 23 +++++++++++++ .../discourse_donations/stripe_spec.rb | 32 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 app/services/discourse_donations/stripe.rb create mode 100644 spec/services/discourse_donations/stripe_spec.rb diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb new file mode 100644 index 0000000..4c02a6e --- /dev/null +++ b/app/services/discourse_donations/stripe.rb @@ -0,0 +1,23 @@ + +module DiscourseDonations + class Stripe + def initialize(secret_key, opts) + ::Stripe.api_key = secret_key + @description = opts[:description] + @currency = opts[:currency] + end + + def charge(email, opts) + customer = ::Stripe::Customer.create( + email: email, + source: opts[:source] + ) + ::Stripe::Charge.create( + customer: customer.id, + amount: opts[:amount], + description: @description, + currency: @currency + ) + end + end +end diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb new file mode 100644 index 0000000..b13924e --- /dev/null +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -0,0 +1,32 @@ +require 'rails_helper' +require_relative '../../support/dd_helper' + +module DiscourseDonations + RSpec.describe DiscourseDonations::Stripe do + before { SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') } + + let(:stripe_options) { { description: 'hi there', currency: 'AUD' } } + let(:email) { 'ray-zintoast@example.com' } + let(:customer) { stub(id: 1) } + let!(:subject) { described_class.new('secret-key-yo', stripe_options) } + + it 'sets the api key' do + expect(::Stripe.api_key).to eq 'secret-key-yo' + end + + it 'creates a customer and charges them an amount' do + options = { email: email, source: 'stripe-token', amount: '1234', other: 'redundant param' } + ::Stripe::Customer.expects(:create).with( + email: email, + source: 'stripe-token' + ).returns(customer) + ::Stripe::Charge.expects(:create).with( + customer: customer.id, + amount: options[:amount], + description: stripe_options[:description], + currency: stripe_options[:currency] + ) + subject.charge(email, options) + end + end +end From 392478adf3e4b9e9502399cc771005f4f783ef2d Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 6 Apr 2017 14:22:22 +1000 Subject: [PATCH 02/19] implement service --- .../discourse_donations/charges_controller.rb | 27 +++++++++---------- .../charges_controller_spec.rb | 2 ++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index f558cb4..562c871 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -10,20 +10,8 @@ module DiscourseDonations if email.nil? || email.empty? response = {} else - Stripe.api_key = SiteSetting.discourse_donations_secret_key - currency = SiteSetting.discourse_donations_currency - - customer = Stripe::Customer.create( - :email => email, - :source => params[:stripeToken] - ) - - response = Stripe::Charge.create( - :customer => customer.id, - :amount => params[:amount], - :description => SiteSetting.discourse_donations_description, - :currency => currency - ) + payment = DiscourseDonations::Stripe.new(secret_key, stripe_options) + response = payment.charge(email, params) end render :json => response @@ -31,6 +19,17 @@ module DiscourseDonations private + def secret_key + SiteSetting.discourse_donations_secret_key + end + + def stripe_options + { + description: SiteSetting.discourse_donations_description, + currency: SiteSetting.discourse_donations_currency + } + end + def email params[:email] || current_user.try(:email) end diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 9d01873..35398ff 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -7,6 +7,8 @@ module DiscourseDonations before do SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') + SiteSetting.stubs(:discourse_donations_description).returns('charity begins at discourse plugin') + SiteSetting.stubs(:discourse_donations_currency).returns('AUD') end it 'responds ok for anonymous users' do From e208ef3dfa8868d50216652c34f09b03bf96278c Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 6 Apr 2017 14:26:23 +1000 Subject: [PATCH 03/19] initial setting --- config/locales/server.en.yml | 2 ++ config/settings.yml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index a1013db..3ceec96 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -5,3 +5,5 @@ en: discourse_donations_public_key: Stripe Public Key discourse_donations_currency: Currency Code discourse_donations_hide_zip_code: Hide Zip Code + discourse_donations_grant_badge: Grant this badge to user when a payment is successful + discourse_donations_add_to_group: Add the user to this group when a payment is successful diff --git a/config/settings.yml b/config/settings.yml index bbf80c2..3bea51a 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -15,3 +15,9 @@ plugins: discourse_donations_hide_zip_code: default: true client: true + discourse_donations_grant_badge: + client: false + default: 'Donation' + discourse_donations_add_to_group: + client: false + default: 'Donation' From 81a42af4d950d97b3d924f9e14e43b425d906180 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 7 Apr 2017 03:22:53 +1000 Subject: [PATCH 04/19] fix improper param key --- app/services/discourse_donations/stripe.rb | 2 +- spec/services/discourse_donations/stripe_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb index 4c02a6e..21d1448 100644 --- a/app/services/discourse_donations/stripe.rb +++ b/app/services/discourse_donations/stripe.rb @@ -10,7 +10,7 @@ module DiscourseDonations def charge(email, opts) customer = ::Stripe::Customer.create( email: email, - source: opts[:source] + source: opts[:stripeToken] ) ::Stripe::Charge.create( customer: customer.id, diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb index b13924e..b1277e1 100644 --- a/spec/services/discourse_donations/stripe_spec.rb +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -15,7 +15,7 @@ module DiscourseDonations end it 'creates a customer and charges them an amount' do - options = { email: email, source: 'stripe-token', amount: '1234', other: 'redundant param' } + options = { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } ::Stripe::Customer.expects(:create).with( email: email, source: 'stripe-token' From 0d078c6131ba27987e4e7af638d731afeaf03d13 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 19 Apr 2017 10:43:40 +1000 Subject: [PATCH 05/19] the message --- .../discourse_donations/charges_controller.rb | 3 +- app/services/discourse_donations/stripe.rb | 7 +++- .../discourse_donations/stripe_spec.rb | 42 +++++++++++++++++-- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 562c871..753844b 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,9 +7,10 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - if email.nil? || email.empty? + if !email.nil? || email.empty? response = {} else + byebug payment = DiscourseDonations::Stripe.new(secret_key, stripe_options) response = payment.charge(email, params) end diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb index 21d1448..3cf82bf 100644 --- a/app/services/discourse_donations/stripe.rb +++ b/app/services/discourse_donations/stripe.rb @@ -12,12 +12,17 @@ module DiscourseDonations email: email, source: opts[:stripeToken] ) - ::Stripe::Charge.create( + @charge = ::Stripe::Charge.create( customer: customer.id, amount: opts[:amount], description: @description, currency: @currency ) + @charge + end + + def successful? + @charge[:paid] end end end diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb index b1277e1..32913b5 100644 --- a/spec/services/discourse_donations/stripe_spec.rb +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -6,6 +6,7 @@ module DiscourseDonations before { SiteSetting.stubs(:discourse_donations_secret_key).returns('secret-key-yo') } let(:stripe_options) { { description: 'hi there', currency: 'AUD' } } + let(:params) { { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } } let(:email) { 'ray-zintoast@example.com' } let(:customer) { stub(id: 1) } let!(:subject) { described_class.new('secret-key-yo', stripe_options) } @@ -15,18 +16,53 @@ module DiscourseDonations end it 'creates a customer and charges them an amount' do - options = { email: email, stripeToken: 'stripe-token', amount: '1234', other: 'redundant param' } ::Stripe::Customer.expects(:create).with( email: email, source: 'stripe-token' ).returns(customer) ::Stripe::Charge.expects(:create).with( customer: customer.id, - amount: options[:amount], + amount: params[:amount], description: stripe_options[:description], currency: stripe_options[:currency] ) - subject.charge(email, options) + subject.charge(email, params) + end + + it 'has a message' do + ::Stripe::Charge.expects(:create).with( + customer: customer.id, + amount: params[:amount], + description: stripe_options[:description], + currency: stripe_options[:currency] + ).returns( + { + paid: true, + outcome: { seller_message: 'yay!' } + } + ) + subject.charge(email, params) + expect(subject.message).to eq 'yay!' + end + + describe '.successful?' do + let(:charge_options) { { customer: customer.id, amount: params[:amount], description: stripe_options[:description], currency: stripe_options[:currency] } } + + before do + ::Stripe::Customer.expects(:create).with(email: email, source: 'stripe-token').returns(customer) + end + + it 'is successful' do + ::Stripe::Charge.expects(:create).with(charge_options).returns({paid: true}) + subject.charge(email, params) + expect(subject).to be_successful + end + + it 'is not successful' do + ::Stripe::Charge.expects(:create).with(charge_options).returns({paid: false}) + subject.charge(email, params) + expect(subject).not_to be_successful + end end end end From a0711a6a6ca1746be18fb794b129aee4bef152dc Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 19 Apr 2017 12:51:15 +1000 Subject: [PATCH 06/19] Implement new Theme * remove old SiteCustomization (deprecated) * Create a theme and add a field for the header --- plugin.rb | 15 ++++----------- spec/support/dd_helper.rb | 1 + 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/plugin.rb b/plugin.rb index c2acab6..8cd7b4a 100644 --- a/plugin.rb +++ b/plugin.rb @@ -1,6 +1,6 @@ # name: discourse-donations # about: Integrating Discourse with Stripe for donations -# version: 1.7.3 +# version: 1.8.0 # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins @@ -13,16 +13,9 @@ enabled_site_setting :discourse_donations_enabled after_initialize do # Must be placed on every page for fraud protection. header_script = '' - - discourse_donations_customization = SiteCustomization.find_or_create_by({ - name: 'Discourse Donations Header', - header: header_script, - mobile_header: header_script, - enabled: true, - user_id: -1 - }) - - SiteCustomization.where(name: discourse_donations_customization.name).where.not(id: discourse_donations_customization.id).delete_all + discourse_donations_theme = Theme.find_or_create_by(name: 'Discourse Donations Header', hidden: false, user_id: -1) + discourse_donations_theme.set_field('common', 'head_tag', header_script) + discourse_donations_theme.save end Discourse::Application.routes.prepend do diff --git a/spec/support/dd_helper.rb b/spec/support/dd_helper.rb index 6dd0ef8..3c196f0 100644 --- a/spec/support/dd_helper.rb +++ b/spec/support/dd_helper.rb @@ -1,3 +1,4 @@ +require 'fakeweb' #TODO register some fixtures From d98ba20d0ded6979c2da5a38f7c9dc00bbf41f40 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 19 Apr 2017 12:51:15 +1000 Subject: [PATCH 07/19] Implement new Theme * remove old SiteCustomization (deprecated) * Create a theme and add a field for the header --- plugin.rb | 15 ++++----------- spec/support/dd_helper.rb | 1 + 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/plugin.rb b/plugin.rb index c2acab6..8cd7b4a 100644 --- a/plugin.rb +++ b/plugin.rb @@ -1,6 +1,6 @@ # name: discourse-donations # about: Integrating Discourse with Stripe for donations -# version: 1.7.3 +# version: 1.8.0 # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins @@ -13,16 +13,9 @@ enabled_site_setting :discourse_donations_enabled after_initialize do # Must be placed on every page for fraud protection. header_script = '' - - discourse_donations_customization = SiteCustomization.find_or_create_by({ - name: 'Discourse Donations Header', - header: header_script, - mobile_header: header_script, - enabled: true, - user_id: -1 - }) - - SiteCustomization.where(name: discourse_donations_customization.name).where.not(id: discourse_donations_customization.id).delete_all + discourse_donations_theme = Theme.find_or_create_by(name: 'Discourse Donations Header', hidden: false, user_id: -1) + discourse_donations_theme.set_field('common', 'head_tag', header_script) + discourse_donations_theme.save end Discourse::Application.routes.prepend do diff --git a/spec/support/dd_helper.rb b/spec/support/dd_helper.rb index 6dd0ef8..3c196f0 100644 --- a/spec/support/dd_helper.rb +++ b/spec/support/dd_helper.rb @@ -1,3 +1,4 @@ +require 'fakeweb' #TODO register some fixtures From e09b852361cfe3705e81401db18ac7729e73ee21 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 20 Apr 2017 11:09:59 +1000 Subject: [PATCH 08/19] normalize the message from stripe --- .../discourse_donations/charges_controller.rb | 7 +++---- app/services/discourse_donations/stripe.rb | 1 + plugin.rb | 1 - .../discourse_donations/stripe_spec.rb | 18 +++++++----------- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 753844b..c6e6962 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -7,12 +7,11 @@ module DiscourseDonations skip_before_filter :verify_authenticity_token, only: [:create] def create - if !email.nil? || email.empty? - response = {} - else - byebug + if email.present? payment = DiscourseDonations::Stripe.new(secret_key, stripe_options) response = payment.charge(email, params) + else + response = {} end render :json => response diff --git a/app/services/discourse_donations/stripe.rb b/app/services/discourse_donations/stripe.rb index 3cf82bf..a8e4fa4 100644 --- a/app/services/discourse_donations/stripe.rb +++ b/app/services/discourse_donations/stripe.rb @@ -18,6 +18,7 @@ module DiscourseDonations description: @description, currency: @currency ) + @charge[:message] = @charge[:outcome][:seller_message] if @charge[:outcome] @charge end diff --git a/plugin.rb b/plugin.rb index 8cd7b4a..d8fdf77 100644 --- a/plugin.rb +++ b/plugin.rb @@ -15,7 +15,6 @@ after_initialize do header_script = '' discourse_donations_theme = Theme.find_or_create_by(name: 'Discourse Donations Header', hidden: false, user_id: -1) discourse_donations_theme.set_field('common', 'head_tag', header_script) - discourse_donations_theme.save end Discourse::Application.routes.prepend do diff --git a/spec/services/discourse_donations/stripe_spec.rb b/spec/services/discourse_donations/stripe_spec.rb index 32913b5..cc7f30c 100644 --- a/spec/services/discourse_donations/stripe_spec.rb +++ b/spec/services/discourse_donations/stripe_spec.rb @@ -20,16 +20,6 @@ module DiscourseDonations email: email, source: 'stripe-token' ).returns(customer) - ::Stripe::Charge.expects(:create).with( - customer: customer.id, - amount: params[:amount], - description: stripe_options[:description], - currency: stripe_options[:currency] - ) - subject.charge(email, params) - end - - it 'has a message' do ::Stripe::Charge.expects(:create).with( customer: customer.id, amount: params[:amount], @@ -42,7 +32,13 @@ module DiscourseDonations } ) subject.charge(email, params) - expect(subject.message).to eq 'yay!' + end + + it 'has a message' do + ::Stripe::Customer.expects(:create).returns(customer) + ::Stripe::Charge.expects(:create).returns({ outcome: { seller_message: 'yay!' } }) + response = subject.charge(email, params) + expect(response[:message]).to eq 'yay!' end describe '.successful?' do From 51087d53a39b457efb5907c481c39bd300be5fe2 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Thu, 20 Apr 2017 11:11:56 +1000 Subject: [PATCH 09/19] bumpus stripe --- plugin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.rb b/plugin.rb index d8fdf77..97f9f3c 100644 --- a/plugin.rb +++ b/plugin.rb @@ -4,7 +4,7 @@ # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins -gem 'stripe', '2.1.0' +gem 'stripe', '2.4.0' load File.expand_path('../lib/discourse_donations/engine.rb', __FILE__) From b2393cb2aaea63d5e450de28e067faf270eeb186 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 21 Apr 2017 10:26:43 +1000 Subject: [PATCH 10/19] add the current user to a group when the payment is successful --- .../discourse_donations/charges_controller.rb | 13 +++++++++++++ app/services/discourse_donations/rewards.rb | 14 ++++++++++++++ config/locales/server.en.yml | 4 ++-- config/settings.yml | 4 ++-- .../discourse_donations/rewards_spec.rb | 17 +++++++++++++++++ 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 app/services/discourse_donations/rewards.rb create mode 100644 spec/services/discourse_donations/rewards_spec.rb diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index c6e6962..8cb9f90 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -14,11 +14,24 @@ module DiscourseDonations response = {} end + if reward_user?(payment) + reward = DiscourseDonations::Rewards.new(current_user) + reward.add_to_group(SiteSetting.discourse_donations_reward_group) if add_to_group? + end + render :json => response end private + def reward_user?(payment) + payment.present? && payment.successful? && current_user.present? + end + + def add_to_group? + SiteSetting.discourse_donations_reward_group.present? + end + def secret_key SiteSetting.discourse_donations_secret_key end diff --git a/app/services/discourse_donations/rewards.rb b/app/services/discourse_donations/rewards.rb new file mode 100644 index 0000000..8e73448 --- /dev/null +++ b/app/services/discourse_donations/rewards.rb @@ -0,0 +1,14 @@ + + +module DiscourseDonations + class Rewards + def initialize(user) + @user = user + end + + def add_to_group(name) + group = ::Group.find_by_name(name) + group.add(@user) if group.present? + end + end +end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 3ceec96..0209ebe 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -5,5 +5,5 @@ en: discourse_donations_public_key: Stripe Public Key discourse_donations_currency: Currency Code discourse_donations_hide_zip_code: Hide Zip Code - discourse_donations_grant_badge: Grant this badge to user when a payment is successful - discourse_donations_add_to_group: Add the user to this group when a payment is successful + discourse_donations_reward_badge: Grant this badge to user when a payment is successful + discourse_donations_reward_group: Add the user to this group when a payment is successful diff --git a/config/settings.yml b/config/settings.yml index 3bea51a..8051b6f 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -15,9 +15,9 @@ plugins: discourse_donations_hide_zip_code: default: true client: true - discourse_donations_grant_badge: + discourse_donations_reward_badge: client: false default: 'Donation' - discourse_donations_add_to_group: + discourse_donations_reward_group: client: false default: 'Donation' diff --git a/spec/services/discourse_donations/rewards_spec.rb b/spec/services/discourse_donations/rewards_spec.rb new file mode 100644 index 0000000..2155dc1 --- /dev/null +++ b/spec/services/discourse_donations/rewards_spec.rb @@ -0,0 +1,17 @@ +require 'rails_helper' + +module DiscourseDonations + RSpec.describe DiscourseDonations::Rewards do + let(:grp) { Fabricate(:group, name: 'w00t') } + let(:user) { Fabricate(:user) } + subject { described_class.new(user) } + + it 'adds the user to a group' do + Group.expects(:find_by_name).with(grp.name).returns(grp) + grp.expects(:add).with(user) + subject.add_to_group(grp.name) + end + + it 'grants the user a badge' + end +end From c3fe90f4d1abc893caa1b024f9e285b0e5040691 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 21 Apr 2017 12:08:52 +1000 Subject: [PATCH 11/19] empty rewards --- .../discourse_donations/charges_controller.rb | 9 ++++----- .../discourse_donations/charges_controller_spec.rb | 6 ++++++ spec/services/discourse_donations/rewards_spec.rb | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index 8cb9f90..c7a04f8 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -14,9 +14,12 @@ module DiscourseDonations response = {} end + response['rewards'] = [] + if reward_user?(payment) reward = DiscourseDonations::Rewards.new(current_user) - reward.add_to_group(SiteSetting.discourse_donations_reward_group) if add_to_group? + group_name = SiteSetting.discourse_donations_reward_group + reward.add_to_group(group_name) if group_name.present? end render :json => response @@ -28,10 +31,6 @@ module DiscourseDonations payment.present? && payment.successful? && current_user.present? end - def add_to_group? - SiteSetting.discourse_donations_reward_group.present? - end - def secret_key SiteSetting.discourse_donations_secret_key end diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 35398ff..978c23b 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -26,5 +26,11 @@ module DiscourseDonations post :create expect(response).to have_http_status(200) end + + it 'has no rewards' do + current_user = log_in(:coding_horror) + post :create + expect(JSON.parse(response.body)['rewards']).to eq([]) + end end end diff --git a/spec/services/discourse_donations/rewards_spec.rb b/spec/services/discourse_donations/rewards_spec.rb index 2155dc1..7c40afa 100644 --- a/spec/services/discourse_donations/rewards_spec.rb +++ b/spec/services/discourse_donations/rewards_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' module DiscourseDonations RSpec.describe DiscourseDonations::Rewards do - let(:grp) { Fabricate(:group, name: 'w00t') } + let(:grp) { Fabricate(:group) } let(:user) { Fabricate(:user) } subject { described_class.new(user) } From f383a0c4f9ef4094e53e760b022e09ada928df67 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Fri, 21 Apr 2017 14:26:53 +1000 Subject: [PATCH 12/19] add rewards to response --- .../discourse_donations/charges_controller.rb | 6 +++-- app/services/discourse_donations/rewards.rb | 4 +++- .../charges_controller_spec.rb | 24 +++++++++++++++---- .../discourse_donations/rewards_spec.rb | 7 +++++- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index c7a04f8..18919e5 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -14,12 +14,14 @@ module DiscourseDonations response = {} end - response['rewards'] = [] + response['rewards'] = {} if reward_user?(payment) reward = DiscourseDonations::Rewards.new(current_user) group_name = SiteSetting.discourse_donations_reward_group - reward.add_to_group(group_name) if group_name.present? + if reward.add_to_group(group_name) + response['rewards']['groups'] = [SiteSetting.discourse_donations_reward_group] + end end render :json => response diff --git a/app/services/discourse_donations/rewards.rb b/app/services/discourse_donations/rewards.rb index 8e73448..0e5adbb 100644 --- a/app/services/discourse_donations/rewards.rb +++ b/app/services/discourse_donations/rewards.rb @@ -8,7 +8,9 @@ module DiscourseDonations def add_to_group(name) group = ::Group.find_by_name(name) - group.add(@user) if group.present? + return false if group.nil? + group.add(@user) + group.present? end end end diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 978c23b..a3777f2 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -27,10 +27,26 @@ module DiscourseDonations expect(response).to have_http_status(200) end - it 'has no rewards' do - current_user = log_in(:coding_horror) - post :create - expect(JSON.parse(response.body)['rewards']).to eq([]) + describe 'rewards' do + before do + SiteSetting.stubs(:discourse_donations_reward_group).returns('Skimby') + Fabricate(:group, name: SiteSetting.discourse_donations_reward_group) + log_in :coding_horror + end + + let(:response_rewards) { JSON.parse(response.body)['rewards'] } + let(:stripe) { ::Stripe::Charge } + + it 'has no rewards' do + stripe.expects(:create).returns({ bummer: true }) + post :create + expect(response_rewards).to eq({}) + end + + it 'awards a group' do + post :create + expect(response_rewards['groups']).to eq([SiteSetting.discourse_donations_reward_group]) + end end end end diff --git a/spec/services/discourse_donations/rewards_spec.rb b/spec/services/discourse_donations/rewards_spec.rb index 7c40afa..ee3fbc6 100644 --- a/spec/services/discourse_donations/rewards_spec.rb +++ b/spec/services/discourse_donations/rewards_spec.rb @@ -9,7 +9,12 @@ module DiscourseDonations it 'adds the user to a group' do Group.expects(:find_by_name).with(grp.name).returns(grp) grp.expects(:add).with(user) - subject.add_to_group(grp.name) + expect(subject.add_to_group(grp.name)).to eq true + end + + it 'does not add the user to a group' do + Group.expects(:find_by_name).with(grp.name).returns(nil) + expect(subject.add_to_group(grp.name)).to eq false end it 'grants the user a badge' From 9acaf513078c8a91cfa53f0ddcd7b9750082a82d Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 06:05:51 +1000 Subject: [PATCH 13/19] explicitly specify group name --- app/controllers/discourse_donations/charges_controller.rb | 4 ++-- config/settings.yml | 2 +- .../discourse_donations/charges_controller_spec.rb | 6 +++--- 3 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 18919e5..dea67bf 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -18,9 +18,9 @@ module DiscourseDonations if reward_user?(payment) reward = DiscourseDonations::Rewards.new(current_user) - group_name = SiteSetting.discourse_donations_reward_group + group_name = SiteSetting.discourse_donations_reward_group_name if reward.add_to_group(group_name) - response['rewards']['groups'] = [SiteSetting.discourse_donations_reward_group] + response['rewards']['groups'] = [group_name] end end diff --git a/config/settings.yml b/config/settings.yml index 8051b6f..87ffd64 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -18,6 +18,6 @@ plugins: discourse_donations_reward_badge: client: false default: 'Donation' - discourse_donations_reward_group: + discourse_donations_reward_group_name: client: false default: 'Donation' diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index a3777f2..a06dd3d 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -29,8 +29,8 @@ module DiscourseDonations describe 'rewards' do before do - SiteSetting.stubs(:discourse_donations_reward_group).returns('Skimby') - Fabricate(:group, name: SiteSetting.discourse_donations_reward_group) + SiteSetting.stubs(:discourse_donations_reward_group_name).returns('Skimby') + Fabricate(:group, name: SiteSetting.discourse_donations_reward_group_name) log_in :coding_horror end @@ -45,7 +45,7 @@ module DiscourseDonations it 'awards a group' do post :create - expect(response_rewards['groups']).to eq([SiteSetting.discourse_donations_reward_group]) + expect(response_rewards['groups']).to eq([SiteSetting.discourse_donations_reward_group_name]) end end end From 2d75d6286f82c7ce88038c2e526f806fc0582263 Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 06:31:18 +1000 Subject: [PATCH 14/19] stub realistic seller message --- spec/controllers/discourse_donations/charges_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index a06dd3d..96d3bde 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -38,7 +38,7 @@ module DiscourseDonations let(:stripe) { ::Stripe::Charge } it 'has no rewards' do - stripe.expects(:create).returns({ bummer: true }) + stripe.expects(:create).returns({ outcome: { seller_message: 'bummer' } }) post :create expect(response_rewards).to eq({}) end From 23b909dc48486ea121afbdc3376ade834ec46c6e Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 06:34:25 +1000 Subject: [PATCH 15/19] fix translations --- config/locales/server.en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 0209ebe..875b019 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -5,5 +5,5 @@ en: discourse_donations_public_key: Stripe Public Key discourse_donations_currency: Currency Code discourse_donations_hide_zip_code: Hide Zip Code - discourse_donations_reward_badge: Grant this badge to user when a payment is successful - discourse_donations_reward_group: Add the user to this group when a payment is successful + discourse_donations_reward_badge_name: Grant this badge to user when a payment is successful + discourse_donations_reward_group_name: Add the user to this group when a payment is successful From 1c87a87bd651ee02289df0f4a55cbdfb3e454b3b Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 10:06:47 +1000 Subject: [PATCH 16/19] refactor the rewards interface for extensibility --- .../discourse_donations/charges_controller.rb | 4 ++-- .../discourse_donations/charges_controller_spec.rb | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index dea67bf..bf9ab6e 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -14,13 +14,13 @@ module DiscourseDonations response = {} end - response['rewards'] = {} + response['rewards'] = [] if reward_user?(payment) reward = DiscourseDonations::Rewards.new(current_user) group_name = SiteSetting.discourse_donations_reward_group_name if reward.add_to_group(group_name) - response['rewards']['groups'] = [group_name] + response['rewards'] << { type: :group, name: group_name } end end diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 96d3bde..0845dbc 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -28,24 +28,25 @@ module DiscourseDonations end describe 'rewards' do + let(:group_name) { 'Zasch' } + let(:response_rewards) { JSON.parse(response.body)['rewards'] } + let(:stripe) { ::Stripe::Charge } + before do - SiteSetting.stubs(:discourse_donations_reward_group_name).returns('Skimby') + SiteSetting.stubs(:discourse_donations_reward_group_name).returns(group_name) Fabricate(:group, name: SiteSetting.discourse_donations_reward_group_name) log_in :coding_horror end - let(:response_rewards) { JSON.parse(response.body)['rewards'] } - let(:stripe) { ::Stripe::Charge } - it 'has no rewards' do stripe.expects(:create).returns({ outcome: { seller_message: 'bummer' } }) post :create - expect(response_rewards).to eq({}) + expect(response_rewards).to be_empty end it 'awards a group' do post :create - expect(response_rewards['groups']).to eq([SiteSetting.discourse_donations_reward_group_name]) + expect(response_rewards.first).to eq({'type' => 'group', 'name' => group_name}) end end end From 061ea69434d945118a06d76e9b33a608fad2baaf Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 11:44:55 +1000 Subject: [PATCH 17/19] add the user to a group --- .../discourse_donations/charges_controller.rb | 12 +++++++++++- app/services/discourse_donations/rewards.rb | 13 +++++++++---- config/settings.yml | 2 +- .../charges_controller_spec.rb | 10 +++++++++- .../services/discourse_donations/rewards_spec.rb | 16 +++++++++++++--- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/app/controllers/discourse_donations/charges_controller.rb b/app/controllers/discourse_donations/charges_controller.rb index bf9ab6e..333c6b4 100644 --- a/app/controllers/discourse_donations/charges_controller.rb +++ b/app/controllers/discourse_donations/charges_controller.rb @@ -18,10 +18,12 @@ module DiscourseDonations if reward_user?(payment) reward = DiscourseDonations::Rewards.new(current_user) - group_name = SiteSetting.discourse_donations_reward_group_name if reward.add_to_group(group_name) response['rewards'] << { type: :group, name: group_name } end + if reward.grant_badge(badge_name) + response['rewards'] << { type: :badge, name: badge_name } + end end render :json => response @@ -33,6 +35,14 @@ module DiscourseDonations payment.present? && payment.successful? && current_user.present? end + def group_name + SiteSetting.discourse_donations_reward_group_name + end + + def badge_name + SiteSetting.discourse_donations_reward_badge_name + end + def secret_key SiteSetting.discourse_donations_secret_key end diff --git a/app/services/discourse_donations/rewards.rb b/app/services/discourse_donations/rewards.rb index 0e5adbb..83f7983 100644 --- a/app/services/discourse_donations/rewards.rb +++ b/app/services/discourse_donations/rewards.rb @@ -7,10 +7,15 @@ module DiscourseDonations end def add_to_group(name) - group = ::Group.find_by_name(name) - return false if group.nil? - group.add(@user) - group.present? + grp = ::Group.find_by_name(name) + return if grp.nil? + grp.add(@user) + end + + def grant_badge(name) + badge = ::Badge.find_by_name(name) + return if badge.nil? + BadgeGranter.grant(badge, @user) end end end diff --git a/config/settings.yml b/config/settings.yml index 87ffd64..4ef3212 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -15,7 +15,7 @@ plugins: discourse_donations_hide_zip_code: default: true client: true - discourse_donations_reward_badge: + discourse_donations_reward_badge_name: client: false default: 'Donation' discourse_donations_reward_group_name: diff --git a/spec/controllers/discourse_donations/charges_controller_spec.rb b/spec/controllers/discourse_donations/charges_controller_spec.rb index 0845dbc..7ac9c98 100644 --- a/spec/controllers/discourse_donations/charges_controller_spec.rb +++ b/spec/controllers/discourse_donations/charges_controller_spec.rb @@ -29,12 +29,15 @@ module DiscourseDonations describe 'rewards' do let(:group_name) { 'Zasch' } + let(:badge_name) { 'Beanie' } let(:response_rewards) { JSON.parse(response.body)['rewards'] } let(:stripe) { ::Stripe::Charge } before do SiteSetting.stubs(:discourse_donations_reward_group_name).returns(group_name) + SiteSetting.stubs(:discourse_donations_reward_badge_name).returns(badge_name) Fabricate(:group, name: SiteSetting.discourse_donations_reward_group_name) + Fabricate(:badge, name: SiteSetting.discourse_donations_reward_badge_name) log_in :coding_horror end @@ -46,7 +49,12 @@ module DiscourseDonations it 'awards a group' do post :create - expect(response_rewards.first).to eq({'type' => 'group', 'name' => group_name}) + expect(response_rewards).to include({'type' => 'group', 'name' => group_name}) + end + + it 'awards a badge' do + post :create + expect(response_rewards).to include({'type' => 'badge', 'name' => badge_name}) end end end diff --git a/spec/services/discourse_donations/rewards_spec.rb b/spec/services/discourse_donations/rewards_spec.rb index ee3fbc6..cb6af03 100644 --- a/spec/services/discourse_donations/rewards_spec.rb +++ b/spec/services/discourse_donations/rewards_spec.rb @@ -9,14 +9,24 @@ module DiscourseDonations it 'adds the user to a group' do Group.expects(:find_by_name).with(grp.name).returns(grp) grp.expects(:add).with(user) - expect(subject.add_to_group(grp.name)).to eq true + subject.add_to_group(grp.name) end it 'does not add the user to a group' do Group.expects(:find_by_name).with(grp.name).returns(nil) - expect(subject.add_to_group(grp.name)).to eq false + grp.expects(:add).never + expect(subject.add_to_group(grp.name)).to be_falsy end - it 'grants the user a badge' + it 'grants the user a badge' do + badge = Fabricate(:badge) + BadgeGranter.expects(:grant).with(badge, user) + subject.grant_badge(badge.name) + end + + it 'does not grant the user a badge' do + BadgeGranter.expects(:grant).never + expect(subject.grant_badge('does not exist')).to be_falsy + end end end From d5c10de4c6f0b8d71ff2b32ed96ff6f1846bbf1a Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Mon, 24 Apr 2017 12:49:36 +1000 Subject: [PATCH 18/19] log adding the user to a group --- app/services/discourse_donations/rewards.rb | 12 ++++++++++-- spec/services/discourse_donations/rewards_spec.rb | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/services/discourse_donations/rewards.rb b/app/services/discourse_donations/rewards.rb index 83f7983..a901dd3 100644 --- a/app/services/discourse_donations/rewards.rb +++ b/app/services/discourse_donations/rewards.rb @@ -2,6 +2,8 @@ module DiscourseDonations class Rewards + attr_reader :user + def initialize(user) @user = user end @@ -9,13 +11,19 @@ module DiscourseDonations def add_to_group(name) grp = ::Group.find_by_name(name) return if grp.nil? - grp.add(@user) + log_group_add(grp) + grp.add(user) end def grant_badge(name) badge = ::Badge.find_by_name(name) return if badge.nil? - BadgeGranter.grant(badge, @user) + BadgeGranter.grant(badge, user) + end + + def log_group_add(grp) + system_user = User.find(-1) + GroupActionLogger.new(system_user, grp).log_add_user_to_group(user) end end end diff --git a/spec/services/discourse_donations/rewards_spec.rb b/spec/services/discourse_donations/rewards_spec.rb index cb6af03..9daa820 100644 --- a/spec/services/discourse_donations/rewards_spec.rb +++ b/spec/services/discourse_donations/rewards_spec.rb @@ -9,15 +9,22 @@ module DiscourseDonations it 'adds the user to a group' do Group.expects(:find_by_name).with(grp.name).returns(grp) grp.expects(:add).with(user) + subject.expects(:log_group_add).once subject.add_to_group(grp.name) end it 'does not add the user to a group' do Group.expects(:find_by_name).with(grp.name).returns(nil) grp.expects(:add).never + subject.expects(:log_group_add).never expect(subject.add_to_group(grp.name)).to be_falsy end + it 'logs the group add' do + GroupActionLogger.any_instance.expects(:log_add_user_to_group) + subject.add_to_group(grp.name) + end + it 'grants the user a badge' do badge = Fabricate(:badge) BadgeGranter.expects(:grant).with(badge, user) From a5fa347d6b8bb026d0fcb34935c38c534ed407ea Mon Sep 17 00:00:00 2001 From: Rimian Perkins Date: Wed, 26 Apr 2017 12:06:33 +1000 Subject: [PATCH 19/19] Bump --- plugin.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.rb b/plugin.rb index a460a8b..a41f6ec 100644 --- a/plugin.rb +++ b/plugin.rb @@ -1,6 +1,6 @@ # name: discourse-donations # about: Integrating Discourse with Stripe for donations -# version: 1.8.0 +# version: 1.9.0 # url: https://github.com/choiceaustralia/discourse-donations # authors: Rimian Perkins