Skip to content

Commit 13d52f1

Browse files
committed
feat: bounty claims
1 parent eca9ed3 commit 13d52f1

File tree

4 files changed

+142
-19
lines changed

4 files changed

+142
-19
lines changed

lib/algora/bounties/schemas/claim.ex

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,67 @@ defmodule Algora.Bounties.Claim do
66

77
@derive {Inspect, except: [:provider_meta]}
88
typed_schema "claims" do
9-
field :provider, :string
10-
field :provider_id, :string
11-
field :provider_meta, :map
9+
field :provider, :string, null: false
10+
field :provider_id, :string, null: false
11+
field :provider_meta, :map, null: false
1212

13-
field :type, Ecto.Enum, values: [:code, :video, :design, :article]
14-
15-
field :status, Ecto.Enum, values: [:pending, :merged, :approved, :rejected, :charged, :paid]
13+
field :status, Ecto.Enum,
14+
values: [:pending, :merged, :approved, :rejected, :charged, :paid],
15+
default: :pending,
16+
null: false
1617

1718
field :merged_at, :utc_datetime_usec
1819
field :approved_at, :utc_datetime_usec
1920
field :rejected_at, :utc_datetime_usec
2021
field :charged_at, :utc_datetime_usec
2122
field :paid_at, :utc_datetime_usec
2223

23-
field :title, :string
24+
field :title, :string, null: false
2425
field :description, :string
25-
field :url, :string
26-
field :group_id, :string
26+
field :url, :string, null: false
27+
field :group_id, :string, null: false
2728

28-
belongs_to :bounty, Algora.Bounties.Bounty
29-
belongs_to :user, Algora.Accounts.User
29+
belongs_to :ticket, Algora.Workspace.Ticket, null: false
30+
belongs_to :user, Algora.Accounts.User, null: false
3031
# has_one :transaction, Algora.Payments.Transaction
3132

3233
timestamps()
3334
end
3435

3536
def changeset(claim, attrs) do
3637
claim
37-
|> cast(attrs, [:bounty_id, :user_id])
38-
|> validate_required([:bounty_id, :user_id])
38+
|> cast(attrs, [
39+
:ticket_id,
40+
:user_id,
41+
:provider,
42+
:provider_id,
43+
:provider_meta,
44+
:status,
45+
:merged_at,
46+
:approved_at,
47+
:rejected_at,
48+
:charged_at,
49+
:paid_at,
50+
:title,
51+
:description,
52+
:url,
53+
:group_id
54+
])
55+
|> validate_required([
56+
:ticket_id,
57+
:user_id,
58+
:provider,
59+
:provider_id,
60+
:provider_meta,
61+
:status,
62+
:title,
63+
:url,
64+
:group_id
65+
])
66+
|> validate_inclusion(:status, [:pending, :merged, :approved, :rejected, :charged, :paid])
67+
|> foreign_key_constraint(:ticket_id)
68+
|> foreign_key_constraint(:user_id)
69+
|> unique_constraint([:ticket_id, :user_id])
3970
end
4071

4172
def rewarded(query \\ Claim) do

lib/algora_web/controllers/webhooks/github_controller.ex

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ defmodule AlgoraWeb.Webhooks.GithubController do
33

44
alias Algora.Accounts
55
alias Algora.Bounties
6+
alias Algora.Bounties.Claim
67
alias Algora.Github
78
alias Algora.Github.Webhook
9+
alias Algora.Repo
810
alias Algora.Workspace
911

1012
require Logger
@@ -113,12 +115,30 @@ defmodule AlgoraWeb.Webhooks.GithubController do
113115
end
114116
end
115117

116-
defp execute_command({:claim, args}, _author, _params) when not is_nil(args) do
117-
owner = Keyword.get(args, :owner)
118-
repo = Keyword.get(args, :repo)
119-
number = Keyword.get(args, :number)
118+
defp execute_command({:claim, args}, author, params) when not is_nil(args) do
119+
owner = args[:owner]
120+
repo = args[:repo]
121+
number = args[:number]
122+
installation_id = params["installation"]["id"]
120123

121-
Logger.info("Claim #{owner}/#{repo}##{number}")
124+
with {:ok, token} <- Github.get_installation_token(installation_id),
125+
{:ok, ticket} <- Workspace.ensure_ticket(token, owner, repo, number),
126+
{:ok, user} <- Workspace.ensure_user(token, author["login"]) do
127+
id = Nanoid.generate()
128+
129+
Repo.insert(%Claim{
130+
id: id,
131+
ticket_id: ticket.id,
132+
user_id: user.id,
133+
provider: "github",
134+
provider_id: params["pull_request"]["id"] || params["issue"]["id"],
135+
provider_meta: %{},
136+
title: params["pull_request"]["title"] || params["issue"]["title"],
137+
url: params["pull_request"]["html_url"] || params["issue"]["html_url"],
138+
group_id: id,
139+
status: :pending
140+
})
141+
end
122142
end
123143

124144
defp execute_command({command, _} = args, _author, _params),
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
defmodule Algora.Repo.Migrations.RecreateClaims do
2+
use Ecto.Migration
3+
4+
def up do
5+
drop index(:claims, [:bounty_id])
6+
drop index(:claims, [:user_id])
7+
drop table(:claims)
8+
9+
create table(:claims) do
10+
add :provider, :string, null: false
11+
add :provider_id, :string, null: false
12+
add :provider_meta, :map, null: false
13+
14+
add :status, :string, null: false
15+
16+
add :merged_at, :utc_datetime_usec
17+
add :approved_at, :utc_datetime_usec
18+
add :rejected_at, :utc_datetime_usec
19+
add :charged_at, :utc_datetime_usec
20+
add :paid_at, :utc_datetime_usec
21+
22+
add :title, :string, null: false
23+
add :description, :string
24+
add :url, :string, null: false
25+
add :group_id, :string, null: false
26+
27+
add :ticket_id, references(:tickets, on_delete: :nothing), null: false
28+
add :user_id, references(:users, on_delete: :nothing), null: false
29+
30+
timestamps()
31+
end
32+
33+
create unique_index(:claims, [:ticket_id, :user_id])
34+
create index(:claims, [:ticket_id])
35+
create index(:claims, [:user_id])
36+
end
37+
38+
def down do
39+
drop unique_index(:claims, [:ticket_id, :user_id])
40+
drop index(:claims, [:ticket_id])
41+
drop index(:claims, [:user_id])
42+
drop table(:claims)
43+
44+
create table(:claims) do
45+
add :provider, :string
46+
add :provider_id, :string
47+
add :provider_meta, :map
48+
49+
add :type, :string
50+
51+
add :status, :string
52+
53+
add :merged_at, :utc_datetime_usec
54+
add :approved_at, :utc_datetime_usec
55+
add :rejected_at, :utc_datetime_usec
56+
add :charged_at, :utc_datetime_usec
57+
add :paid_at, :utc_datetime_usec
58+
59+
add :title, :string
60+
add :description, :string
61+
add :url, :string
62+
add :group_id, :string
63+
64+
add :bounty_id, references(:bounties, on_delete: :nothing)
65+
add :user_id, references(:users, on_delete: :nothing)
66+
67+
timestamps()
68+
end
69+
70+
create index(:claims, [:bounty_id])
71+
create index(:claims, [:user_id])
72+
end
73+
end

test/support/factory.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,6 @@ defmodule Algora.Factory do
199199
id: Nanoid.generate(),
200200
provider: "github",
201201
provider_id: sequence(:provider_id, &"#{&1}"),
202-
type: :code,
203202
status: :pending,
204203
title: "Implemented compression optimization",
205204
description: "Added parallel processing for large files",

0 commit comments

Comments
 (0)