Class: Pay::Paddle::Webhooks::SubscriptionPaymentSucceeded

Inherits:
Object
  • Object
show all
Defined in:
lib/pay/paddle/webhooks/subscription_payment_succeeded.rb

Instance Method Summary collapse

Instance Method Details

#call(event) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/pay/paddle/webhooks/subscription_payment_succeeded.rb', line 5

def call(event)
  billable = Pay.find_billable(processor: :paddle, processor_id: event["user_id"])

  if billable.nil?
    billable = Pay::Paddle.owner_from_passthrough(event["passthrough"])
    billable&.update!(processor: "paddle", processor_id: event["user_id"])
  end

  if billable.nil?
    Rails.logger.error("[Pay] Unable to find Pay::Billable with owner: '#{event["passthrough"]}'. Searched these models: #{Pay.billable_models.join(", ")}")
    return
  end

  return if billable.charges.where(processor_id: event["subscription_payment_id"]).any?

  charge = create_charge(billable, event)
  notify_user(billable, charge)
end

#create_charge(user, event) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/pay/paddle/webhooks/subscription_payment_succeeded.rb', line 24

def create_charge(user, event)
  charge = user.charges.find_or_initialize_by(
    processor: :paddle,
    processor_id: event["subscription_payment_id"]
  )

  params = {
    amount: Integer(event["sale_gross"].to_f * 100),
    card_type: event["payment_method"],
    created_at: Time.zone.parse(event["event_time"]),
    currency: event["currency"],
    paddle_receipt_url: event["receipt_url"],
    subscription: Pay::Subscription.find_by(processor: :paddle, processor_id: event["subscription_id"])
  }

  payment_information = Pay::Paddle::Billable.new(user).payment_information(event["subscription_id"])

  charge.update(params.merge(payment_information))
  user.update(payment_information)

  charge
end

#notify_user(billable, charge) ⇒ Object



47
48
49
50
51
# File 'lib/pay/paddle/webhooks/subscription_payment_succeeded.rb', line 47

def notify_user(billable, charge)
  if Pay.send_emails && charge.respond_to?(:receipt)
    Pay::UserMailer.with(billable: billable, charge: charge).receipt.deliver_later
  end
end