Skip to content

Commit ba4c6ef

Browse files
committed
feat: use same customer record for recurring transactions (#63)
1 parent 7529d35 commit ba4c6ef

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

lib/algora/bounties/bounties.ex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -736,9 +736,7 @@ defmodule Algora.Bounties do
736736
group_id: tx_group_id
737737
}),
738738
{:ok, session} <-
739-
line_items
740-
|> Enum.map(&LineItem.to_stripe/1)
741-
|> Payments.create_stripe_session(%{
739+
Payments.create_stripe_session(owner, Enum.map(line_items, &LineItem.to_stripe/1), %{
742740
description: description,
743741
metadata: %{"version" => Payments.metadata_version(), "group_id" => tx_group_id}
744742
}) do

lib/algora/payments/payments.ex

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,24 @@ defmodule Algora.Payments do
2828
end
2929

3030
@spec create_stripe_session(
31+
user :: User.t(),
3132
line_items :: [PSP.Session.line_item_data()],
3233
payment_intent_data :: PSP.Session.payment_intent_data()
3334
) ::
3435
{:ok, PSP.session()} | {:error, PSP.error()}
35-
def create_stripe_session(line_items, payment_intent_data) do
36-
PSP.Session.create(%{
37-
mode: "payment",
38-
billing_address_collection: "required",
39-
line_items: line_items,
40-
invoice_creation: %{enabled: true},
41-
success_url: "#{AlgoraWeb.Endpoint.url()}/payment/success",
42-
cancel_url: "#{AlgoraWeb.Endpoint.url()}/payment/canceled",
43-
payment_intent_data: payment_intent_data
44-
})
36+
def create_stripe_session(user, line_items, payment_intent_data) do
37+
with {:ok, customer} <- fetch_or_create_customer(user) do
38+
PSP.Session.create(%{
39+
mode: "payment",
40+
customer: customer.provider_id,
41+
billing_address_collection: "required",
42+
line_items: line_items,
43+
invoice_creation: %{enabled: true},
44+
success_url: "#{AlgoraWeb.Endpoint.url()}/payment/success",
45+
cancel_url: "#{AlgoraWeb.Endpoint.url()}/payment/canceled",
46+
payment_intent_data: payment_intent_data
47+
})
48+
end
4549
end
4650

4751
def get_transaction_fee_pct, do: Decimal.new("0.04")

test/support/factory.ex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,14 @@ defmodule Algora.Factory do
252252
end
253253

254254
# Convenience API
255-
def insert!(factory_name, attributes \\ []) do
255+
def insert!(factory_name, attributes \\ [])
256+
257+
def insert!(factory_name, attributes) when factory_name in [:user, :organization] do
258+
user = insert(:user, attributes)
259+
%{user | name: user.display_name || user.handle}
260+
end
261+
262+
def insert!(factory_name, attributes) do
256263
insert(factory_name, attributes)
257264
end
258265

test/support/stripe_mock.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,11 @@ defmodule Algora.Support.StripeMock do
8282
}}
8383
end
8484
end
85+
86+
defmodule Customer do
87+
@moduledoc false
88+
def create(_params) do
89+
{:ok, %Stripe.Customer{id: "cus_#{Algora.Util.random_int()}"}}
90+
end
91+
end
8592
end

0 commit comments

Comments
 (0)