@@ -236,82 +236,84 @@ defmodule AlgoraWeb.Admin.CampaignLive do
236
236
237
237
defp render_preview ( _template , _data ) , do: nil
238
238
239
+ defp repo_key ( % { "repo_url" => repo_url } ) when repo_url != "" do
240
+ case repo_url |> String . split ( "/" ) |> Enum . take ( - 2 ) do
241
+ [ owner , name ] -> { owner , name }
242
+ _ -> nil
243
+ end
244
+ end
245
+
246
+ defp repo_key ( % { "org_handle" => org_handle } ) when org_handle != "" do
247
+ org_handle
248
+ end
249
+
250
+ defp repo_key ( _row ) , do: nil
251
+
239
252
defp assign_repo_names ( socket ) do
240
- new_handles =
253
+ new_keys =
241
254
socket . assigns . csv_data
242
- |> Enum . filter ( & ( & 1 [ "repo_url" ] == "" and & 1 [ "org_handle" ] != "" ) )
243
- |> Enum . map ( & & 1 [ "org_handle" ] )
255
+ |> Enum . map ( & repo_key / 1 )
256
+ |> Enum . reject ( & is_nil / 1 )
244
257
|> Enum . reject ( & Map . has_key? ( socket . assigns . repo_cache , & 1 ) )
245
258
|> Enum . uniq ( )
246
259
247
260
new_cache =
248
- Map . new ( new_handles , fn org_handle ->
261
+ Map . new ( new_keys , fn key ->
262
+ filter =
263
+ case key do
264
+ { owner , name } ->
265
+ token = Admin . token ( )
266
+
267
+ with { :ok , repository } <- Workspace . ensure_repository ( token , owner , name ) ,
268
+ { :ok , _tech_stack } <- Workspace . ensure_repo_tech_stack ( token , repository ) do
269
+ dynamic ( [ r , _u ] , r . id == ^ repository . id )
270
+ else
271
+ _ -> false
272
+ end
273
+
274
+ or g_handle ->
275
+ dynamic ( [ r , u ] , u . handle == ^ org_handle )
276
+ end
277
+
249
278
repo =
250
279
Repo . one (
251
280
from r in Repository ,
252
281
join: u in assoc ( r , :user ) ,
253
- where: u . handle == ^ org_handle ,
282
+ where: ^ filter ,
254
283
order_by: [ desc: fragment ( "(?->>'stargazers_count')::integer" , r . provider_meta ) ] ,
255
284
select: % {
256
285
repo_owner: u . provider_login ,
257
286
repo_name: r . name ,
258
- tech_stack: fragment ( "COALESCE(? , ?)" , u . tech_stack , r . tech_stack )
287
+ tech_stack: fragment ( "COALESCE(NULLIF(?, '{}') , ?)" , u . tech_stack , r . tech_stack )
259
288
} ,
260
289
limit: 1
261
290
)
262
291
263
292
if repo && repo . tech_stack != [ ] do
264
293
matches = Settings . get_tech_matches ( List . first ( repo . tech_stack ) )
265
- { org_handle , { repo , matches } }
294
+ { key , { repo , matches } }
266
295
else
267
- { org_handle , nil }
296
+ { key , nil }
268
297
end
269
298
end )
270
299
271
300
updated_cache = Map . merge ( socket . assigns . repo_cache , new_cache )
272
301
273
302
csv_data =
274
- Enum . map ( socket . assigns . csv_data , fn row ->
275
- cond do
276
- is_binary ( row [ "repo_url" ] ) and row [ "repo_url" ] != "" ->
277
- repo_url = row [ "repo_url" ]
278
- [ owner , name ] = repo_url |> String . split ( "/" ) |> Enum . take ( - 2 )
279
-
280
- token = Admin . token! ( )
281
-
282
- with { :ok , repository } <- Workspace . ensure_repository ( token , owner , name ) ,
283
- { :ok , tech_stack } <- Workspace . ensure_repo_tech_stack ( token , repository ) do
284
- matches = if tech_stack == [ ] , do: [ ] , else: Settings . get_tech_matches ( List . first ( tech_stack ) )
285
-
303
+ Enum . map ( socket . assigns . csv_data , fn
304
+ row ->
305
+ case Map . get ( updated_cache , repo_key ( row ) ) do
306
+ { repo , matches } ->
286
307
Map . merge ( row , % {
287
- "repo_owner" => repository . user . provider_login ,
288
- "repo_name" => repository . name ,
289
- "tech_stack" => repository . tech_stack ,
308
+ "repo_owner" => repo . repo_owner ,
309
+ "repo_name" => repo . repo_name ,
310
+ "tech_stack" => repo . tech_stack ,
290
311
"matches" => Enum . map ( matches , & & 1 . user . handle )
291
312
} )
292
- else
293
- error ->
294
- Logger . error ( "Failed to fetch repository #{ owner } /#{ name } : #{ inspect ( error ) } " )
295
- row
296
- end
297
-
298
- or g_handle = row [ "org_handle" ] ->
299
- case Map . get ( updated_cache , org_handle ) do
300
- nil ->
301
- row
302
-
303
- { repo , matches } ->
304
- Map . merge ( row , % {
305
- "repo_owner" => repo . repo_owner ,
306
- "repo_name" => repo . repo_name ,
307
- "tech_stack" => repo . tech_stack ,
308
- "matches" => Enum . map ( matches , & & 1 . user . handle )
309
- } )
310
- end
311
-
312
- true ->
313
- row
314
- end
313
+
314
+ _ ->
315
+ row
316
+ end
315
317
end )
316
318
317
319
csv_columns =
0 commit comments