@@ -122,40 +122,94 @@ defmodule Algora.Bounties do
122
122
end
123
123
124
124
@ spec do_claim_bounty ( % {
125
- user: User . t ( ) ,
125
+ provider_login: String . t ( ) ,
126
+ token: String . t ( ) ,
126
127
target: Ticket . t ( ) ,
127
128
source: Ticket . t ( ) ,
129
+ group_id: String . t ( ) | nil ,
130
+ group_share: Decimal . t ( ) ,
128
131
status: :pending | :approved | :rejected | :paid ,
129
132
type: :pull_request | :review | :video | :design | :article
130
133
} ) ::
131
134
{ :ok , Claim . t ( ) } | { :error , atom ( ) }
132
- defp do_claim_bounty ( % { user: user , target: target , source: source , status: status , type: type } ) do
133
- # TODO: ensure user is pull request author
134
- changeset =
135
- Claim . changeset ( % Claim { } , % {
136
- target_id: target . id ,
137
- source_id: source . id ,
138
- user_id: user . id ,
139
- type: type ,
140
- status: status ,
141
- url: source . url
142
- } )
143
-
144
- case Repo . insert ( changeset ) do
145
- { :ok , claim } ->
146
- { :ok , claim }
147
-
135
+ defp do_claim_bounty ( % {
136
+ provider_login: provider_login ,
137
+ token: token ,
138
+ target: target ,
139
+ source: source ,
140
+ group_id: group_id ,
141
+ group_share: group_share ,
142
+ status: status ,
143
+ type: type
144
+ } ) do
145
+ with { :ok , user } <- Workspace . ensure_user ( token , provider_login ) ,
146
+ { :ok , claim } <-
147
+ Repo . insert (
148
+ Claim . changeset ( % Claim { } , % {
149
+ target_id: target . id ,
150
+ source_id: source . id ,
151
+ user_id: user . id ,
152
+ type: type ,
153
+ status: status ,
154
+ url: source . url ,
155
+ group_id: group_id ,
156
+ group_share: group_share
157
+ } )
158
+ ) do
159
+ { :ok , claim }
160
+ else
148
161
{ :error , % { errors: [ target_id: { _ , [ constraint: :unique , constraint_name: _ ] } ] } } ->
149
162
{ :error , :already_exists }
150
163
151
- { :error , _changeset } = error ->
164
+ { :error , _reason } = error ->
152
165
error
153
166
end
154
167
end
155
168
169
+ @ spec do_claim_bounties ( % {
170
+ provider_logins: [ String . t ( ) ] ,
171
+ token: String . t ( ) ,
172
+ target: Ticket . t ( ) ,
173
+ source: Ticket . t ( ) ,
174
+ status: :pending | :approved | :rejected | :paid ,
175
+ type: :pull_request | :review | :video | :design | :article
176
+ } ) ::
177
+ { :ok , Claim . t ( ) } | { :error , atom ( ) }
178
+ defp do_claim_bounties ( % {
179
+ provider_logins: provider_logins ,
180
+ token: token ,
181
+ target: target ,
182
+ source: source ,
183
+ status: status ,
184
+ type: type
185
+ } ) do
186
+ Enum . reduce_while ( provider_logins , { :ok , [ ] } , fn provider_login , { :ok , acc } ->
187
+ group_id =
188
+ case List . last ( acc ) do
189
+ nil -> nil
190
+ primary_claim -> primary_claim . group_id
191
+ end
192
+
193
+ case do_claim_bounty ( % {
194
+ provider_login: provider_login ,
195
+ token: token ,
196
+ target: target ,
197
+ source: source ,
198
+ status: status ,
199
+ type: type ,
200
+ group_id: group_id ,
201
+ group_share: Decimal . div ( 1 , length ( provider_logins ) )
202
+ } ) do
203
+ { :ok , claim } -> { :cont , { :ok , [ claim | acc ] } }
204
+ error -> { :halt , error }
205
+ end
206
+ end )
207
+ end
208
+
156
209
@ spec claim_bounty (
157
210
% {
158
211
user: User . t ( ) ,
212
+ coauthor_provider_logins: [ String . t ( ) ] ,
159
213
target_ticket_ref: % { owner: String . t ( ) , repo: String . t ( ) , number: integer ( ) } ,
160
214
source_ticket_ref: % { owner: String . t ( ) , repo: String . t ( ) , number: integer ( ) } ,
161
215
status: :pending | :approved | :rejected | :paid ,
@@ -167,6 +221,7 @@ defmodule Algora.Bounties do
167
221
def claim_bounty (
168
222
% {
169
223
user: user ,
224
+ coauthor_provider_logins: coauthor_provider_logins ,
170
225
target_ticket_ref: % { owner: target_repo_owner , repo: target_repo_name , number: target_number } ,
171
226
source_ticket_ref: % { owner: source_repo_owner , repo: source_repo_name , number: source_number } ,
172
227
status: status ,
@@ -185,7 +240,15 @@ defmodule Algora.Bounties do
185
240
with { :ok , token } <- token_res ,
186
241
{ :ok , target } <- Workspace . ensure_ticket ( token , target_repo_owner , target_repo_name , target_number ) ,
187
242
{ :ok , source } <- Workspace . ensure_ticket ( token , source_repo_owner , source_repo_name , source_number ) ,
188
- { :ok , claim } <- do_claim_bounty ( % { user: user , target: target , source: source , status: status , type: type } ) ,
243
+ { :ok , [ claim | _ ] } <-
244
+ do_claim_bounties ( % {
245
+ provider_logins: [ user . provider_login | coauthor_provider_logins ] ,
246
+ token: token ,
247
+ target: target ,
248
+ source: source ,
249
+ status: status ,
250
+ type: type
251
+ } ) ,
189
252
{ :ok , _job } <- notify_claim ( % { claim: claim } , installation_id: installation_id ) do
190
253
broadcast ( )
191
254
{ :ok , claim }
@@ -201,7 +264,7 @@ defmodule Algora.Bounties do
201
264
) ::
202
265
{ :ok , Oban.Job . t ( ) } | { :error , atom ( ) }
203
266
def notify_claim ( % { claim: claim } , opts \\ [ ] ) do
204
- % { claim_id : claim . id , installation_id: opts [ :installation_id ] }
267
+ % { claim_group_id : claim . group_id , installation_id: opts [ :installation_id ] }
205
268
|> Jobs.NotifyClaim . new ( )
206
269
|> Oban . insert ( )
207
270
end
0 commit comments