Skip to content

Commit ad9cff2

Browse files
committed
refactor: modularize tip & tip intent creation
1 parent 205a56a commit ad9cff2

File tree

5 files changed

+129
-43
lines changed

5 files changed

+129
-43
lines changed

config/config.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ config :algora, Oban,
3131
event_consumers: 1,
3232
comment_consumers: 1,
3333
github_og_image: 5,
34-
notify_bounty: 1
34+
notify_bounty: 1,
35+
notify_tip_intent: 1
3536
]
3637

3738
# Configures the mailer

lib/algora/bounties/bounties.ex

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,47 @@ defmodule Algora.Bounties do
121121
|> Oban.insert()
122122
end
123123

124-
@spec create_tip(%{creator: User.t(), owner: User.t(), recipient: User.t(), amount: Money.t()}) ::
124+
@spec create_tip_intent(
125+
%{
126+
recipient: String.t(),
127+
amount: Money.t(),
128+
ticket_ref: %{owner: String.t(), repo: String.t(), number: integer()}
129+
},
130+
opts :: [installation_id: integer()]
131+
) ::
132+
{:ok, String.t()} | {:error, atom()}
133+
def create_tip_intent(
134+
%{recipient: recipient, amount: amount, ticket_ref: %{owner: owner, repo: repo, number: number}},
135+
opts \\ []
136+
) do
137+
query =
138+
URI.encode_query(
139+
amount: Money.to_decimal(amount),
140+
recipient: recipient,
141+
owner: owner,
142+
repo: repo,
143+
number: number
144+
)
145+
146+
url = AlgoraWeb.Endpoint.url() <> "/tip" <> "?" <> query
147+
148+
%{
149+
url: url,
150+
ticket_ref: %{owner: owner, repo: repo, number: number},
151+
installation_id: opts[:installation_id]
152+
}
153+
|> Jobs.NotifyTipIntent.new()
154+
|> Oban.insert()
155+
end
156+
157+
@spec create_tip(
158+
%{creator: User.t(), owner: User.t(), recipient: User.t(), amount: Money.t()},
159+
opts :: [ticket_ref: %{owner: String.t(), repo: String.t(), number: integer()}]
160+
) ::
125161
{:ok, String.t()} | {:error, atom()}
126-
def create_tip(%{creator: creator, owner: owner, recipient: recipient, amount: amount}) do
162+
def create_tip(%{creator: creator, owner: owner, recipient: recipient, amount: amount}, opts \\ []) do
163+
ticket_ref = opts[:ticket_ref]
164+
127165
changeset =
128166
Tip.changeset(%Tip{}, %{
129167
amount: amount,
@@ -157,7 +195,11 @@ defmodule Algora.Bounties do
157195
product_data: %{
158196
name: "Payment to @#{recipient.provider_login}",
159197
# TODO:
160-
# description: nil,
198+
description:
199+
if(ticket_ref,
200+
do: "#{ticket_ref[:owner]}/#{ticket_ref[:repo]}##{ticket_ref[:number]}",
201+
else: "Tip to @#{recipient.provider_login}"
202+
),
161203
images: [recipient.avatar_url]
162204
}
163205
},
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
defmodule Algora.Bounties.Jobs.NotifyTipIntent do
2+
@moduledoc false
3+
use Oban.Worker, queue: :notify_tip_intent
4+
5+
alias Algora.Github
6+
7+
require Logger
8+
9+
@impl Oban.Worker
10+
def perform(%Oban.Job{args: %{"url" => url, "ticket_ref" => ticket_ref, "installation_id" => nil}}) do
11+
body = get_body(url)
12+
13+
if Github.pat_enabled() do
14+
Github.create_issue_comment(
15+
Github.pat(),
16+
ticket_ref["owner"],
17+
ticket_ref["repo"],
18+
ticket_ref["number"],
19+
body
20+
)
21+
else
22+
Logger.info("""
23+
Github.create_issue_comment(Github.pat(), "#{ticket_ref["owner"]}", "#{ticket_ref["repo"]}", #{ticket_ref["number"]},
24+
\"\"\"
25+
#{body}
26+
\"\"\")
27+
""")
28+
end
29+
end
30+
31+
@impl Oban.Worker
32+
def perform(%Oban.Job{args: %{"url" => url, "ticket_ref" => ticket_ref, "installation_id" => installation_id}}) do
33+
with {:ok, token} <- Github.get_installation_token(installation_id) do
34+
body = get_body(url)
35+
36+
Github.create_issue_comment(
37+
token,
38+
ticket_ref["owner"],
39+
ticket_ref["repo"],
40+
ticket_ref["number"],
41+
body
42+
)
43+
end
44+
end
45+
46+
defp get_body(url), do: "Please visit [Algora](#{url}) to complete your tip via Stripe."
47+
end

lib/algora/integrations/github/poller/comment_consumer.ex

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ defmodule Algora.Github.Poller.CommentConsumer do
44

55
alias Algora.Accounts
66
alias Algora.Bounties
7-
alias Algora.Github
87
alias Algora.Util
98

109
require Logger
@@ -25,40 +24,23 @@ defmodule Algora.Github.Poller.CommentConsumer do
2524
end
2625

2726
defp run_command({:tip, args}, ticket_ref, _comment) do
28-
amount = Keyword.get(args, :amount)
29-
recipient = Keyword.get(args, :recipient)
30-
owner = Keyword.get(ticket_ref, :owner)
31-
repo = Keyword.get(ticket_ref, :repo)
32-
number = Keyword.get(ticket_ref, :number)
33-
34-
query = URI.encode_query(amount: Money.to_decimal(amount), recipient: recipient)
35-
url = AlgoraWeb.Endpoint.url() <> "/tip" <> "?" <> query
36-
body = "Please visit [Algora](#{url}) to complete your tip via Stripe."
37-
38-
if Github.pat_enabled() do
39-
Github.create_issue_comment(Github.pat(), owner, repo, number, body)
40-
else
41-
Logger.info("""
42-
Github.create_issue_comment(Github.pat(), "#{owner}", "#{repo}", #{number},
43-
\"\"\"
44-
#{body}
45-
\"\"\")
46-
""")
47-
48-
:ok
49-
end
27+
Bounties.create_tip_intent(%{
28+
recipient: args[:recipient],
29+
amount: args[:amount],
30+
ticket_ref: %{owner: ticket_ref[:owner], repo: ticket_ref[:repo], number: ticket_ref[:number]}
31+
})
5032
end
5133

5234
defp run_command({:bounty, args}, ticket_ref, comment) do
53-
with {:ok, user} <- Accounts.fetch_user_by(provider_id: to_string(comment["user"]["id"])),
54-
{:ok, amount} <- Keyword.fetch(args, :amount) do
55-
Bounties.create_bounty(%{
56-
creator: user,
57-
owner: user,
58-
amount: amount,
59-
ticket_ref: %{owner: ticket_ref[:owner], repo: ticket_ref[:repo], number: ticket_ref[:number]}
60-
})
61-
else
35+
case Accounts.fetch_user_by(provider_id: to_string(comment["user"]["id"])) do
36+
{:ok, user} ->
37+
Bounties.create_bounty(%{
38+
creator: user,
39+
owner: user,
40+
amount: args[:amount],
41+
ticket_ref: %{owner: ticket_ref[:owner], repo: ticket_ref[:repo], number: ticket_ref[:number]}
42+
})
43+
6244
{:error, _reason} = error ->
6345
Logger.error("Failed to create bounty: #{inspect(error)}")
6446
error

lib/algora_web/controllers/tip_controller.ex

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,23 @@ defmodule AlgoraWeb.TipController do
66
alias Algora.Workspace
77
alias AlgoraWeb.UserAuth
88

9-
def create(conn, %{"amount" => amount, "recipient" => recipient} = _params) do
9+
def create(conn, %{"amount" => amount, "recipient" => recipient} = params) do
10+
ticket_ref = extract_ticket_ref(params)
11+
1012
with {:ok, current_user} <- get_current_user(conn),
1113
%Money{} = amount <- Money.new(:USD, amount),
1214
{:ok, token} <- Accounts.get_access_token(current_user),
1315
{:ok, recipient_user} <- Workspace.ensure_user(token, recipient),
1416
{:ok, checkout_url} <-
15-
Bounties.create_tip(%{
16-
creator: current_user,
17-
owner: current_user,
18-
recipient: recipient_user,
19-
amount: amount
20-
}) do
17+
Bounties.create_tip(
18+
%{
19+
creator: current_user,
20+
owner: current_user,
21+
recipient: recipient_user,
22+
amount: amount
23+
},
24+
if(ticket_ref, do: [ticket_ref: ticket_ref], else: [])
25+
) do
2126
redirect(conn, external: checkout_url)
2227
else
2328
# TODO: just use a plug
@@ -40,6 +45,15 @@ defmodule AlgoraWeb.TipController do
4045
|> redirect(to: UserAuth.signed_in_path(conn))
4146
end
4247

48+
defp extract_ticket_ref(%{"owner" => owner, "repo" => repo, "number" => number}) do
49+
case Integer.parse(number) do
50+
{number, ""} -> [owner: owner, repo: repo, number: number]
51+
_ -> nil
52+
end
53+
end
54+
55+
defp extract_ticket_ref(_), do: nil
56+
4357
defp get_current_user(conn) do
4458
case conn.assigns.current_user do
4559
nil -> {:error, :unauthorized}

0 commit comments

Comments
 (0)