@@ -3,6 +3,8 @@ defmodule Algora.Admin do
33 import Ecto.Query
44
55 alias Algora.Accounts.User
6+ alias Algora.Bounties.Claim
7+ alias Algora.Parser
68 alias Algora.Payments
79 alias Algora.Repo
810 alias Algora.Workspace
@@ -54,6 +56,28 @@ defmodule Algora.Admin do
5456 :ok
5557 end
5658
59+ def backfill_claims! do
60+ query =
61+ from ( t in Claim ,
62+ where: fragment ( "? ilike ?" , t . url , "%//github.com/%" ) ,
63+ distinct: t . url ,
64+ select: t . url
65+ )
66+
67+ { success , failure } =
68+ query
69+ |> Repo . all ( )
70+ |> Task . async_stream ( & backfill_claim / 1 , max_concurrency: 1 , timeout: :infinity )
71+ |> Enum . reduce ( { 0 , 0 } , fn
72+ { :ok , { :ok , _ } } , { s , f } -> { s + 1 , f }
73+ { :ok , { :error , _ } } , { s , f } -> { s , f + 1 }
74+ { :exit , _ } , { s , f } -> { s , f + 1 }
75+ end )
76+
77+ IO . puts ( "Claim backfill complete: #{ success } succeeded, #{ failure } failed" )
78+ :ok
79+ end
80+
5781 def backfill_repo ( url ) do
5882 with % URI { host: "api.github.com" , path: "/repos/" <> path } <- URI . parse ( url ) ,
5983 [ owner , repo ] <- String . split ( path , "/" , trim: true ) ,
@@ -70,6 +94,25 @@ defmodule Algora.Admin do
7094 end
7195 end
7296
97+ def backfill_claim ( url ) do
98+ with { :ok , [ ticket_ref: [ owner: owner , repo: repo , type: _type , number: number ] ] , _ , _ , _ , _ } <-
99+ Parser . full_ticket_ref ( url ) ,
100+ { :ok , ticket } <- Workspace . ensure_ticket ( token! ( ) , owner , repo , number ) ,
101+ :ok <- update_claims ( url , ticket . id ) do
102+ { :ok , ticket }
103+ else
104+ { :error , "404 Not Found" } = error ->
105+ error
106+
107+ { :error , % Postgrex.Error { postgres: % { constraint: "claims_user_id_source_id_target_id_index" } } } = error ->
108+ error
109+
110+ error ->
111+ Logger . error ( "Failed to backfill claim #{ url } : #{ inspect ( error ) } " )
112+ { :error , error }
113+ end
114+ end
115+
73116 def make_admin! ( user_handle , is_admin ) when is_boolean ( is_admin ) do
74117 user_handle
75118 |> Algora.Accounts . get_user_by_handle ( )
@@ -92,5 +135,15 @@ defmodule Algora.Admin do
92135 )
93136
94137 :ok
138+ rescue
139+ error -> { :error , error }
140+ end
141+
142+ defp update_claims ( url , source_id ) do
143+ Repo . update_all ( from ( t in Claim , where: t . url == ^ url ) , set: [ source_id: source_id ] )
144+
145+ :ok
146+ rescue
147+ error -> { :error , error }
95148 end
96149end
0 commit comments