@@ -171,8 +171,8 @@ defmodule AlgoraWeb.Admin.SeedLive do
171
171
</ . link >
172
172
<% end %>
173
173
</ div >
174
- < p class = "text-muted-foreground line-clamp-1 max-w-[50ch] font-medium text-sm " >
175
- { @ value . bio }
174
+ < p class = "text-muted-foreground line-clamp-1 font-medium text-sm " >
175
+ { @ value . domain }
176
176
</ p >
177
177
</ div >
178
178
</ div >
@@ -234,11 +234,14 @@ defmodule AlgoraWeb.Admin.SeedLive do
234
234
235
235
rows =
236
236
rows
237
- |> Stream . map ( fn row -> Enum . zip_reduce ( cols , row , Map . new ( ) , fn col , val , acc -> Map . put ( acc , col , val ) end ) end )
238
- |> Stream . map ( & process_row / 1 )
239
- |> Task . async_stream ( & Map . put ( & 1 , "org" , get_user ( & 1 ) ) , max_concurrency: 10 , timeout: :infinity )
240
- |> Stream . map ( fn { :ok , row } -> row end )
241
- |> Enum . to_list ( )
237
+ |> Enum . map ( fn row -> Enum . zip_reduce ( cols , row , Map . new ( ) , fn col , val , acc -> Map . put ( acc , col , val ) end ) end )
238
+ |> Enum . map ( & process_row / 1 )
239
+
240
+ rows
241
+ |> Enum . uniq_by ( & lookup_key / 1 )
242
+ |> Task . async_stream ( & get_user / 1 , max_concurrency: 10 , timeout: :infinity )
243
+
244
+ rows = Enum . map ( rows , & Map . put ( & 1 , "org" , get_user ( & 1 ) ) )
242
245
243
246
socket
244
247
|> assign ( :csv_data , rows )
@@ -255,46 +258,49 @@ defmodule AlgoraWeb.Admin.SeedLive do
255
258
)
256
259
end
257
260
258
- defp get_user ( % { "org_handle" => handle } = _row ) when is_binary ( handle ) and handle != "" do
259
- case :ets . lookup ( @ user_cache_table , handle ) do
261
+ defp lookup_key ( % { "org_handle" => handle } = _row ) when is_binary ( handle ) and handle != "" do
262
+ handle
263
+ end
264
+
265
+ defp lookup_key ( % { "company_url" => url } = _row ) when is_binary ( url ) and url != "" do
266
+ to_domain ( url )
267
+ end
268
+
269
+ defp run_cached ( key , fun ) do
270
+ case :ets . lookup ( @ user_cache_table , key ) do
260
271
[ { _ , user } ] ->
261
272
user
262
273
263
274
_ ->
264
- with { :ok , user } <- Workspace . ensure_user ( Algora.Admin . token ( ) , handle ) ,
265
- { :ok , user } <- Repo . fetch ( User , user . id ) do
266
- :ets . insert ( @ user_cache_table , { handle , user } )
267
- user
268
- else
269
- _ ->
270
- :ets . insert ( @ user_cache_table , { handle , nil } )
275
+ case fun . ( ) do
276
+ { :ok , user } ->
277
+ :ets . insert ( @ user_cache_table , { key , user } )
278
+ user
279
+
280
+ error ->
281
+ Logger . error ( "Failed to fetch user #{ key } : #{ inspect ( error ) } " )
282
+ :ets . insert ( @ user_cache_table , { key , nil } )
271
283
nil
272
284
end
273
285
end
274
286
end
275
287
288
+ defp get_user ( % { "org_handle" => handle } = _row ) when is_binary ( handle ) and handle != "" do
289
+ run_cached ( handle , fn ->
290
+ with { :ok , user } <- Workspace . ensure_user ( Algora.Admin . token ( ) , handle ) do
291
+ Repo . fetch ( User , user . id )
292
+ end
293
+ end )
294
+ end
295
+
276
296
defp get_user ( % { "company_url" => url } = row ) when is_binary ( url ) and url != "" do
277
- case :ets . lookup ( @ user_cache_table , url ) do
278
- [ { _ , user } ] ->
279
- user
297
+ domain = to_domain ( url )
280
298
281
- _ ->
282
- domain =
283
- url
284
- |> String . trim_leading ( "https://" )
285
- |> String . trim_leading ( "http://" )
286
- |> String . trim_leading ( "www." )
287
-
288
- with { :ok , user } <- fetch_or_create_user ( domain , % { hiring: true , tech_stack: row [ "tech_stack" ] } ) ,
289
- { :ok , user } <- Repo . fetch ( User , user . id ) do
290
- :ets . insert ( @ user_cache_table , { url , user } )
291
- user
292
- else
293
- _ ->
294
- :ets . insert ( @ user_cache_table , { url , nil } )
295
- nil
296
- end
297
- end
299
+ run_cached ( domain , fn ->
300
+ with { :ok , user } <- fetch_or_create_user ( domain , % { hiring: true , tech_stack: row [ "tech_stack" ] } ) do
301
+ Repo . fetch ( User , user . id )
302
+ end
303
+ end )
298
304
end
299
305
300
306
defp get_user ( _row ) , do: nil
0 commit comments