defmodule TarakanWeb.InfestationLive.Index do @moduledoc "Cross-repo infestation list: patterns spanning multiple listed repositories." use TarakanWeb, :live_view alias Tarakan.Infestations @impl true def mount(_params, _session, socket) do {:ok, socket |> assign(:page_title, "Infestations") |> assign( :meta_description, "Cross-repo infestations: the same finding title in multiple listed repositories." ) |> assign(:canonical_path, ~p"/infestations") |> assign(:days, 30) |> assign(:min_repos, 2) |> load_infestations()} end @impl true def handle_event("filter", params, socket) do days = parse_int(params["days"], socket.assigns.days, 1, 365) min_repos = parse_int(params["min_repos"], socket.assigns.min_repos, 2, 20) {:noreply, socket |> assign(:days, days) |> assign(:min_repos, min_repos) |> load_infestations()} end defp load_infestations(socket) do infestations = Infestations.list_infestations( days: socket.assigns.days, min_repos: socket.assigns.min_repos, limit: 50 ) assign(socket, :infestations, infestations) end defp parse_int(value, default, min, max) do case Integer.parse(to_string(value || "")) do {n, _} -> n |> max(min) |> min(max) :error -> default end end @impl true def render(assigns) do ~H"""

Infestations

Same finding title in {@min_repos}+ listed repos within the window. Ranked by affected repo count.

No infestations in this window

Infestations appear when the same finding title hits {@min_repos}+ listed repos.

<.constellation id="infestations-constellation" infestations={@infestations} />
  • <.link navigate={~p"/infestations/#{infestation.pattern_key}"}> {infestation.title} ยท {infestation.repo_count} repos
""" end end