@@ -4,14 +4,15 @@ defmodule AlgoraWeb.Admin.CampaignLive do
44  use  AlgoraWeb ,  :live_view 
55
66  import  Ecto.Changeset 
7+   import  Ecto.Query 
78
89  alias  Algora.Activities.Jobs.SendCampaignEmail 
910  alias  Algora.Mailer 
1011  alias  Algora.Repo 
12+   alias  Algora.Workspace.Repository 
1113  alias  AlgoraWeb.LocalStore 
1214  alias  Swoosh.Email 
1315
14-   # Add embedded schema 
1516  defmodule  Campaign  do 
1617    @ moduledoc  false 
1718    use  Ecto.Schema 
@@ -38,6 +39,7 @@ defmodule AlgoraWeb.Admin.CampaignLive do
3839     socket 
3940     |>  assign ( :page_title ,  "Campaign" ) 
4041     |>  assign ( :form ,  to_form ( Campaign . changeset ( % Campaign { } ) ) ) 
42+      |>  assign ( :repo_cache ,  % { } ) 
4143     |>  assign_preview ( ) } 
4244  end 
4345
@@ -182,30 +184,83 @@ defmodule AlgoraWeb.Admin.CampaignLive do
182184
183185  defp  render_preview ( _template ,  _data ) ,  do:  nil 
184186
187+   defp  assign_repo_names ( socket )  do 
188+     new_handles  = 
189+       socket . assigns . csv_data 
190+       |>  Enum . map ( &  & 1 [ "org_handle" ] ) 
191+       |>  Enum . reject ( & is_nil / 1 ) 
192+       |>  Enum . reject ( & Map . has_key? ( socket . assigns . repo_cache ,  & 1 ) ) 
193+       |>  Enum . uniq ( ) 
194+ 
195+     new_cache  = 
196+       Map . new ( new_handles ,  fn  org_handle  -> 
197+         repo  = 
198+           Repo . one ( 
199+             from  r  in  Repository , 
200+               join:  u  in  assoc ( r ,  :user ) , 
201+               where:  u . handle  ==  ^ org_handle , 
202+               order_by:  [ desc:  fragment ( "(?->>'stargazers_count')::integer" ,  r . provider_meta ) ] , 
203+               select:  % { 
204+                 repo_owner:  u . provider_login , 
205+                 repo_name:  r . name 
206+               } , 
207+               limit:  1 
208+           ) 
209+ 
210+         { org_handle ,  repo } 
211+       end ) 
212+ 
213+     updated_cache  =  Map . merge ( socket . assigns . repo_cache ,  new_cache ) 
214+ 
215+     csv_data  = 
216+       Enum . map ( socket . assigns . csv_data ,  fn  row  -> 
217+         case  row [ "org_handle" ]  do 
218+           nil  -> 
219+             row 
220+ 
221+           org_handle  -> 
222+             case  Map . get ( updated_cache ,  org_handle )  do 
223+               nil  ->  row 
224+               repo  ->  Map . merge ( row ,  % { "repo_owner"  =>  repo . repo_owner ,  "repo_name"  =>  repo . repo_name } ) 
225+             end 
226+         end 
227+       end ) 
228+ 
229+     socket 
230+     |>  assign ( :repo_cache ,  updated_cache ) 
231+     |>  assign ( :csv_data ,  csv_data ) 
232+   end 
233+ 
234+   defp  assign_csv_data ( socket ,  data )  do 
235+     csv_data  = 
236+       case  data  |>  String . trim ( )  |>  parse_csv ( )  do 
237+         [ header  |  rows ]  -> 
238+           keys  =  Enum . map ( header ,  & String . trim / 1 ) 
239+ 
240+           Enum . map ( rows ,  fn  row  -> 
241+             keys 
242+             |>  Enum . zip ( Enum . map ( row ,  & String . trim / 1 ) ) 
243+             |>  Map . new ( ) 
244+           end ) 
245+ 
246+         _  -> 
247+           [ ] 
248+       end 
249+ 
250+     socket 
251+     |>  assign ( :csv_data ,  csv_data ) 
252+     |>  assign_repo_names ( ) 
253+   end 
254+ 
185255  defp  assign_preview ( socket )  do 
186256    case  apply_action ( socket . assigns . form . source ,  :save )  do 
187257      { :ok ,  data }  -> 
188-         csv_data  = 
189-           case  data . csv  |>  String . trim ( )  |>  parse_csv ( )  do 
190-             [ header  |  rows ]  -> 
191-               keys  =  Enum . map ( header ,  & String . trim / 1 ) 
192- 
193-               Enum . map ( rows ,  fn  row  -> 
194-                 keys 
195-                 |>  Enum . zip ( Enum . map ( row ,  & String . trim / 1 ) ) 
196-                 |>  Map . new ( ) 
197-               end ) 
198- 
199-             _  -> 
200-               [ ] 
201-           end 
258+         socket  =  assign_csv_data ( socket ,  data . csv ) 
202259
203260        preview  = 
204-           if  length ( csv_data )  >  0  do 
205-             render_preview ( data . template ,  List . first ( csv_data ) ) 
206-           end 
261+           if  length ( socket . assigns . csv_data )  >  0 ,  do:  render_preview ( data . template ,  List . first ( socket . assigns . csv_data ) ) 
207262
208-         socket   |>   assign ( :preview ,   preview )   |>   assign ( :csv_data ,   csv_data ) 
263+         assign ( socket ,   :preview ,   preview ) 
209264
210265      { :error ,  _changeset }  -> 
211266        socket  |>  assign ( :preview ,  nil )  |>  assign ( :csv_data ,  [ ] ) 
0 commit comments