discourse-subscriptions/app/controllers/patrons_controller.rb

77 lines
1.8 KiB
Ruby

# frozen_string_literal: true
module DiscoursePatrons
class PatronsController < ::ApplicationController
include DiscoursePatrons::Stripe
skip_before_action :verify_authenticity_token, only: [:create]
before_action :set_api_key
def index
result = { email: '' }
if current_user
result[:email] = current_user.email
end
render json: result
end
def show
payment_intent = ::Stripe::PaymentIntent.retrieve(params[:pid])
if current_user && (current_user.admin || payment_intent[:customer] == current_user.id)
result = payment_intent
else
result = { error: 'Not found' }
end
render json: result
end
def create
begin
response = ::Stripe::PaymentIntent.create(
amount: param_currency_to_number,
currency: SiteSetting.discourse_patrons_currency,
payment_method_types: ['card'],
payment_method: params[:payment_method_id],
description: SiteSetting.discourse_patrons_payment_description,
receipt_email: params[:receipt_email],
confirm: true,
metadata: { user_id: user_id }
)
Payment.create(
user_id: response[:metadata][:user_id],
payment_intent_id: response[:id],
receipt_email: response[:receipt_email],
url: response[:charges][:url],
amount: response[:amount],
currency: response[:currency]
)
rescue ::Stripe::InvalidRequestError => e
response = { error: e }
rescue ::Stripe::CardError => e
response = { error: 'Card Declined' }
end
render json: response
end
private
def param_currency_to_number
params[:amount].to_s.sub('.', '').to_i
end
def user_id
if current_user
current_user.id
end
end
end
end