Skip to content

Commit 2db92f3

Browse files
committed
handle release flow
1 parent e4fa687 commit 2db92f3

File tree

3 files changed

+45
-9
lines changed

3 files changed

+45
-9
lines changed

lib/algora/psp/psp.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ defmodule Algora.PSP do
130130

131131
@type t :: Stripe.PaymentIntent.t()
132132
def create(params), do: Algora.PSP.client(__MODULE__).create(params)
133+
def capture(id, params \\ %{}), do: Algora.PSP.client(__MODULE__).capture(id, params)
133134
end
134135

135136
@type setup_intent :: Algora.PSP.SetupIntent.t()

lib/algora_web/controllers/webhooks/stripe_controller.ex

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,16 @@ defmodule AlgoraWeb.Webhooks.StripeController do
4949

5050
defp process_event(
5151
%Stripe.Event{
52-
type: "charge.succeeded",
52+
type: type,
5353
data: %{object: %Stripe.Charge{metadata: %{"version" => @metadata_version, "group_id" => group_id}}}
5454
} = event
5555
)
56-
when is_binary(group_id) do
56+
when type in ["charge.succeeded", "charge.captured"] and is_binary(group_id) do
5757
process_charge_succeeded(event, group_id)
5858
end
5959

60-
defp process_event(
61-
%Stripe.Event{type: "charge.succeeded", data: %{object: %Stripe.Charge{invoice: invoice_id}}} = event
62-
) do
60+
defp process_event(%Stripe.Event{type: type, data: %{object: %Stripe.Charge{invoice: invoice_id}}} = event)
61+
when type in ["charge.succeeded", "charge.captured"] do
6362
with {:ok, invoice} <- Algora.PSP.Invoice.retrieve(invoice_id),
6463
%{"version" => @metadata_version, "group_id" => group_id} <- invoice.metadata do
6564
process_charge_succeeded(event, group_id)
@@ -129,10 +128,13 @@ defmodule AlgoraWeb.Webhooks.StripeController do
129128
end
130129

131130
defp process_charge_succeeded(
132-
%Stripe.Event{type: "charge.succeeded", data: %{object: %Stripe.Charge{id: charge_id, captured: captured}}},
131+
%Stripe.Event{
132+
type: type,
133+
data: %{object: %Stripe.Charge{id: charge_id, captured: captured, payment_intent: payment_intent_id}}
134+
},
133135
group_id
134136
)
135-
when is_binary(group_id) do
137+
when type in ["charge.succeeded", "charge.captured"] and is_binary(group_id) do
136138
Repo.transact(fn ->
137139
status = if captured, do: :succeeded, else: :requires_capture
138140
succeeded_at = if captured, do: DateTime.utc_now()
@@ -144,7 +146,8 @@ defmodule AlgoraWeb.Webhooks.StripeController do
144146
succeeded_at: succeeded_at,
145147
provider: "stripe",
146148
provider_id: charge_id,
147-
provider_charge_id: charge_id
149+
provider_charge_id: charge_id,
150+
provider_payment_intent_id: payment_intent_id
148151
]
149152
)
150153

lib/algora_web/live/contract_live.ex

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ defmodule AlgoraWeb.ContractLive do
117117

118118
if connected?(socket) do
119119
Chat.subscribe(thread.id)
120+
Payments.subscribe()
120121
end
121122

122123
share_url =
@@ -173,6 +174,10 @@ defmodule AlgoraWeb.ContractLive do
173174
{:noreply, socket}
174175
end
175176

177+
def handle_info(:payments_updated, socket) do
178+
{:noreply, assign_transactions(socket)}
179+
end
180+
176181
@impl true
177182
def handle_event("send_message", %{"message" => content}, socket) do
178183
{:ok, message} =
@@ -245,6 +250,19 @@ defmodule AlgoraWeb.ContractLive do
245250
end
246251
end
247252

253+
@impl true
254+
def handle_event("release_funds", %{"payment_intent_id" => payment_intent_id}, socket) do
255+
case Algora.PSP.PaymentIntent.capture(payment_intent_id) do
256+
{:ok, payment_intent} ->
257+
dbg(payment_intent)
258+
{:noreply, put_flash(socket, :info, "Funds released!")}
259+
260+
{:error, reason} ->
261+
Logger.error("Failed to capture payment intent: #{inspect(reason)}")
262+
{:noreply, put_flash(socket, :error, "Something went wrong")}
263+
end
264+
end
265+
248266
@impl true
249267
def handle_event(_event, _params, socket) do
250268
{:noreply, socket}
@@ -385,7 +403,21 @@ defmodule AlgoraWeb.ContractLive do
385403
</div>
386404
</td>
387405
<td class="whitespace-nowrap px-6 py-4 text-sm">
388-
{description(transaction)}
406+
<div class="flex flex-col items-start gap-2">
407+
{description(transaction)}
408+
<.button
409+
:if={
410+
transaction.type == :charge and
411+
transaction.status == :requires_capture
412+
}
413+
size="sm"
414+
phx-click="release_funds"
415+
phx-disable-with="Releasing..."
416+
phx-value-payment_intent_id={transaction.provider_payment_intent_id}
417+
>
418+
Release funds
419+
</.button>
420+
</div>
389421
</td>
390422
<td class="font-display whitespace-nowrap px-6 py-4 text-right font-medium tabular-nums">
391423
<%= case transaction_direction(transaction.type) do %>

0 commit comments

Comments
 (0)