diff --git a/app/controllers/user_upgrades_controller.rb b/app/controllers/user_upgrades_controller.rb index c3f762d0a..37d8ef5cd 100644 --- a/app/controllers/user_upgrades_controller.rb +++ b/app/controllers/user_upgrades_controller.rb @@ -27,6 +27,16 @@ class UserUpgradesController < ApplicationController respond_with(@user_upgrade) end + def receipt + @user_upgrade = authorize UserUpgrade.find(params[:id]) + redirect_to @user_upgrade.receipt_url + end + + def payment + @user_upgrade = authorize UserUpgrade.find(params[:id]) + redirect_to @user_upgrade.payment_url + end + private def recipient diff --git a/app/models/user_upgrade.rb b/app/models/user_upgrade.rb index 7ccd87987..a69c95dce 100644 --- a/app/models/user_upgrade.rb +++ b/app/models/user_upgrade.rb @@ -198,6 +198,32 @@ class UserUpgrade < ApplicationRecord checkout end + def receipt_url + return nil if pending? || stripe_id.nil? + + checkout_session = Stripe::Checkout::Session.retrieve(stripe_id) + payment_intent = Stripe::PaymentIntent.retrieve(checkout_session.payment_intent) + charge = payment_intent.charges.data.first + charge.receipt_url + end + + def payment_url + return nil if pending? || stripe_id.nil? + + checkout_session = Stripe::Checkout::Session.retrieve(stripe_id) + payment_intent = Stripe::PaymentIntent.retrieve(checkout_session.payment_intent) + + "https://dashboard.stripe.com/payments/#{payment_intent.id}" + end + + def has_receipt? + !pending? + end + + def has_payment? + !pending? + end + class_methods do def register_webhook webhook = Stripe::WebhookEndpoint.create({ diff --git a/app/policies/user_upgrade_policy.rb b/app/policies/user_upgrade_policy.rb index a6568f5db..1da56ef5c 100644 --- a/app/policies/user_upgrade_policy.rb +++ b/app/policies/user_upgrade_policy.rb @@ -10,4 +10,12 @@ class UserUpgradePolicy < ApplicationPolicy def show? record.recipient == user || record.purchaser == user || user.is_owner? end + + def receipt? + (record.purchaser == user || user.is_owner?) && record.has_receipt? + end + + def payment? + user.is_owner? && record.has_payment? + end end diff --git a/app/views/user_upgrades/index.html.erb b/app/views/user_upgrades/index.html.erb index 611ea071e..ea57f6ba2 100644 --- a/app/views/user_upgrades/index.html.erb +++ b/app/views/user_upgrades/index.html.erb @@ -28,8 +28,18 @@ <% t.column :status %> - <% t.column "Updated" do |artist| %> - <%= time_ago_in_words_tagged(artist.updated_at) %> + <% t.column "Updated" do |user_upgrade| %> + <%= time_ago_in_words_tagged(user_upgrade.updated_at) %> + <% end %> + + <% t.column column: "control" do |user_upgrade| %> + <%= link_to "Show", user_upgrade %> + <% if policy(user_upgrade).receipt? %> + | <%= link_to "Receipt", receipt_user_upgrade_path(user_upgrade), target: "_blank" %> + <% end %> + <% if policy(user_upgrade).payment? %> + | <%= link_to "Payment", payment_user_upgrade_path(user_upgrade), target: "_blank" %> + <% end %> <% end %> <% end %> diff --git a/app/views/user_upgrades/show.html.erb b/app/views/user_upgrades/show.html.erb index 7eeddffdf..1b342ba96 100644 --- a/app/views/user_upgrades/show.html.erb +++ b/app/views/user_upgrades/show.html.erb @@ -30,12 +30,18 @@ <% if @user_upgrade.is_gift? && CurrentUser.user == @user_upgrade.recipient %>

<%= link_to_user @user_upgrade.purchaser %> has upgraded your account to <%= @user_upgrade.level_string %>. Enjoy your new account!

<% elsif @user_upgrade.is_gift? && CurrentUser.user == @user_upgrade.purchaser %> -

<%= link_to_user @user_upgrade.recipient %> is now a <%= @user_upgrade.level_string %> user. Thanks for supporting the site!

+

<%= link_to_user @user_upgrade.recipient %> is now a <%= @user_upgrade.level_string %> user. Thanks for supporting the site! A receipt has been sent to your email.

<% else %> -

You are now a <%= @user_upgrade.level_string %> user. Thanks for supporting the site!

+

You are now a <%= @user_upgrade.level_string %> user. Thanks for supporting the site! A receipt has been sent to your email.

<% end %> -

<%= link_to "Go back to #{Danbooru.config.canonical_app_name}", "https://danbooru.donmai.us" %> to continue using the site.

+ <% if policy(@user_upgrade).receipt? %> + <%= link_to "View Receipt", receipt_user_upgrade_path(@user_upgrade), target: "_blank" %> + <% end %> + + <% if policy(@user_upgrade).payment? %> + | <%= link_to "View Payment", payment_user_upgrade_path(@user_upgrade), target: "_blank" %> + <% end %> <% else %> <%= content_for :html_header do %> diff --git a/config/routes.rb b/config/routes.rb index cd1b3e587..ede8fa5bf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -254,7 +254,10 @@ Rails.application.routes.draw do get :custom_style end end - resources :user_upgrades, only: [:new, :create, :show, :index] + resources :user_upgrades, only: [:new, :create, :show, :index] do + get :receipt, on: :member + get :payment, on: :member + end resources :user_feedbacks, except: [:destroy] resources :user_name_change_requests, only: [:new, :create, :show, :index] resources :webhooks do diff --git a/test/functional/user_upgrades_controller_test.rb b/test/functional/user_upgrades_controller_test.rb index 75ff4f2f1..c1a02213a 100644 --- a/test/functional/user_upgrades_controller_test.rb +++ b/test/functional/user_upgrades_controller_test.rb @@ -121,6 +121,68 @@ class UserUpgradesControllerTest < ActionDispatch::IntegrationTest end end + context "receipt action" do + mock_stripe! + + setup do + @user_upgrade = create(:gift_gold_upgrade, status: "complete") + @user_upgrade.create_checkout! + end + + should "not allow unauthorized users to view the receipt" do + get_auth receipt_user_upgrade_path(@user_upgrade), create(:user) + + assert_response 403 + end + + should "not allow the recipient to view the receipt" do + get_auth receipt_user_upgrade_path(@user_upgrade), @user_upgrade.recipient + + assert_response 403 + end + + should "not allow the purchaser to view a pending receipt" do + @user_upgrade.update!(status: "pending") + get_auth receipt_user_upgrade_path(@user_upgrade), @user_upgrade.purchaser + + assert_response 403 + end + + # XXX not supported yet by stripe-ruby-mock + should_eventually "allow the purchaser to view the receipt" do + get_auth receipt_user_upgrade_path(@user_upgrade), @user_upgrade.purchaser + + assert_redirected_to "xxx" + end + + # XXX not supported yet by stripe-ruby-mock + should_eventually "allow the site owner to view the receipt" do + get_auth receipt_user_upgrade_path(@user_upgrade), create(:owner_user) + + assert_redirected_to "xxx" + end + end + + context "payment action" do + setup do + @user_upgrade = create(:gift_gold_upgrade, status: "complete") + @user_upgrade.create_checkout! + end + + should "not allow unauthorized users to view the receipt" do + get_auth payment_user_upgrade_path(@user_upgrade), @user_upgrade.purchaser + + assert_response 403 + end + + # XXX not supported yet by stripe-ruby-mock + should_eventually "allow the site owner to view the receipt" do + get_auth payment_user_upgrade_path(@user_upgrade), create(:owner_user) + + assert_redirected_to "xxx" + end + end + context "create action" do mock_stripe! diff --git a/test/unit/user_upgrade_test.rb b/test/unit/user_upgrade_test.rb index 93666aebb..f90cbd4da 100644 --- a/test/unit/user_upgrade_test.rb +++ b/test/unit/user_upgrade_test.rb @@ -59,5 +59,28 @@ class UserUpgradeTest < ActiveSupport::TestCase end end end + + context "the #receipt_url method" do + mock_stripe! + + context "a pending upgrade" do + should "not have a receipt" do + @user_upgrade = create(:self_gold_upgrade, status: "pending") + @user_upgrade.create_checkout! + + assert_equal(nil, @user_upgrade.receipt_url) + end + end + + context "a complete upgrade" do + # XXX not supported yet by stripe-ruby-mock + should_eventually "have a receipt" do + @user_upgrade = create(:self_gold_upgrade, status: "complete") + @user_upgrade.create_checkout! + + assert_equal("xxx", @user_upgrade.receipt_url) + end + end + end end end