Skip to content

Commit a7e70b4

Browse files
committed
refactor: improve CSV data handling by introducing repo name assignment and caching mechanism
1 parent 00b302c commit a7e70b4

File tree

1 file changed

+74
-19
lines changed

1 file changed

+74
-19
lines changed

lib/algora_web/live/admin/campaign_live.ex

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)