diff --git a/app/jobs/btcpay_check_donation_job.rb b/app/jobs/btcpay_check_donation_job.rb index 3d89028..3cfdbcb 100644 --- a/app/jobs/btcpay_check_donation_job.rb +++ b/app/jobs/btcpay_check_donation_job.rb @@ -4,15 +4,19 @@ class BtcpayCheckDonationJob < ApplicationJob def perform(donation) return if donation.completed? - invoice = BtcpayManager::FetchInvoice.call(invoice_id: donation.btcpay_invoice_id) + invoice = BtcpayManager::FetchInvoice.call( + invoice_id: donation.btcpay_invoice_id + ) case invoice["status"] when "Settled" - # TODO use time from actual payment confirmation donation.paid_at = DateTime.now donation.payment_status = "settled" donation.save! - # TODO send email + + NotificationMailer.with(user: donation.user) + .bitcoin_donation_confirmed + .deliver_later when "Processing" re_enqueue_job(donation) end diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 004f94f..b4ec37d 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -23,4 +23,11 @@ class NotificationMailer < ApplicationMailer @subject = "New invitations added to your account" mail to: @user.email, subject: @subject end + + def bitcoin_donation_confirmed + @user = params[:user] + @donation = params[:donation] + @subject = "Donation confirmed" + mail to: @user.email, subject: @subject + end end diff --git a/app/views/notification_mailer/bitcoin_donation_confirmed.text.erb b/app/views/notification_mailer/bitcoin_donation_confirmed.text.erb new file mode 100644 index 0000000..3da1e04 --- /dev/null +++ b/app/views/notification_mailer/bitcoin_donation_confirmed.text.erb @@ -0,0 +1,11 @@ +Hi <%= @user.display_name.presence || @user.cn %>, + +Your bitcoin donation has been confirmed successfully. <3 + +Thank you so much for helping us with keeping the lights on, as well as with continually improving our services for you! + +You can find all of your past financial contributions on this page: + +<%= contributions_donations_url %> + +Have a nice day! diff --git a/spec/jobs/btcpay_check_donation_job_spec.rb b/spec/jobs/btcpay_check_donation_job_spec.rb index 9344c46..71cd1df 100644 --- a/spec/jobs/btcpay_check_donation_job_spec.rb +++ b/spec/jobs/btcpay_check_donation_job_spec.rb @@ -6,12 +6,20 @@ RSpec.describe BtcpayCheckDonationJob, type: :job do let(:donation) do user.donations.create!( - donation_method: "btcpay", btcpay_invoice_id: "K4e31MhbLKmr3D7qoNYRd3", + donation_method: "btcpay", + btcpay_invoice_id: "K4e31MhbLKmr3D7qoNYRd3", paid_at: nil, payment_status: "processing", fiat_amount: 120, fiat_currency: "USD" ) end + before do + allow_any_instance_of(User).to receive(:ldap_entry).and_return({ + uid: user.cn, ou: user.ou, mail: user.email, admin: nil, + display_name: nil + }) + end + after(:each) do clear_enqueued_jobs clear_performed_jobs @@ -48,16 +56,24 @@ RSpec.describe BtcpayCheckDonationJob, type: :job do end it "updates the donation record" do - perform_enqueued_jobs { job } - + perform_enqueued_jobs(only: described_class) { job } donation.reload expect(donation.paid_at).not_to be_nil expect(donation.payment_status).to eq("settled") end + it "notifies the user via email" do + perform_enqueued_jobs(only: described_class) { job } + expect(enqueued_jobs.size).to eq(1) + job = enqueued_jobs.select{|j| j['job_class'] == "ActionMailer::MailDeliveryJob"}.first + expect(job['arguments'][0]).to eq('NotificationMailer') + expect(job['arguments'][1]).to eq('bitcoin_donation_confirmed') + expect(job['arguments'][3]['params']['user']['_aj_globalid']).to eq('gid://akkounts/User/1') + end + it "does not enqueue itself again" do expect_any_instance_of(described_class).not_to receive(:re_enqueue_job) - perform_enqueued_jobs { job } + perform_enqueued_jobs(only: described_class) { job } end end end