diff --git a/lib/philomena/dnp_entries.ex b/lib/philomena/dnp_entries.ex index 3bbe940e..95c9d45b 100644 --- a/lib/philomena/dnp_entries.ex +++ b/lib/philomena/dnp_entries.ex @@ -101,4 +101,10 @@ defmodule Philomena.DnpEntries do def change_dnp_entry(%DnpEntry{} = dnp_entry) do DnpEntry.changeset(dnp_entry, %{}) end + + def count_dnp_entries() do + DnpEntry + |> where([ul], ul.aasm_state in [ "requested", "claimed", "acknowledged" ]) + |> Repo.aggregate(:count, :id) + end end diff --git a/lib/philomena/duplicate_reports.ex b/lib/philomena/duplicate_reports.ex index ec3a05e5..0a2f4bd1 100644 --- a/lib/philomena/duplicate_reports.ex +++ b/lib/philomena/duplicate_reports.ex @@ -114,4 +114,10 @@ defmodule Philomena.DuplicateReports do def change_duplicate_report(%DuplicateReport{} = duplicate_report) do DuplicateReport.changeset(duplicate_report, %{}) end + + def count_duplicate_reports() do + DuplicateReport + |> where([dr], dr.state == "open") + |> Repo.aggregate(:count, :id) + end end diff --git a/lib/philomena/reports.ex b/lib/philomena/reports.ex index 43ae1a2f..070b5487 100644 --- a/lib/philomena/reports.ex +++ b/lib/philomena/reports.ex @@ -116,4 +116,10 @@ defmodule Philomena.Reports do report end + + def count_reports() do + Report + |> where(open: true) + |> Repo.aggregate(:count, :id) + end end diff --git a/lib/philomena/user_links.ex b/lib/philomena/user_links.ex index 48e21856..98fd23ac 100644 --- a/lib/philomena/user_links.ex +++ b/lib/philomena/user_links.ex @@ -104,4 +104,10 @@ defmodule Philomena.UserLinks do def change_user_link(%UserLink{} = user_link) do UserLink.changeset(user_link, %{}) end + + def count_user_links() do + UserLink + |> where([ul], ul.aasm_state == "unverified") + |> Repo.aggregate(:count, :id) + end end diff --git a/lib/philomena_web/plugs/admin_counters_plug.ex b/lib/philomena_web/plugs/admin_counters_plug.ex new file mode 100644 index 00000000..ec4c2234 --- /dev/null +++ b/lib/philomena_web/plugs/admin_counters_plug.ex @@ -0,0 +1,48 @@ +defmodule PhilomenaWeb.AdminCountersPlug do + @moduledoc """ + This plug stores the counts used by the admin bar. + ## Example + plug PhilomenaWeb.AdminCountersPlug + """ + + alias Plug.Conn + alias Philomena.DuplicateReports + alias Philomena.Reports + alias Philomena.UserLinks + alias Philomena.DnpEntries + + import Plug.Conn, only: [assign: 3] + + @doc false + @spec init(any()) :: any() + def init(opts), do: opts + + @doc false + @spec call(Plug.Conn.t()) :: Plug.Conn.t() + def call(conn), do: call(conn, nil) + + @doc false + @spec call(Plug.Conn.t(), any()) :: Plug.Conn.t() + def call(conn, _opts) do + user = conn.assigns.current_user + + maybe_assign_admin_metrics(conn, staff?(user)) + end + + defp maybe_assign_admin_metrics(conn, false), do: conn + defp maybe_assign_admin_metrics(conn, true) do + duplicate_reports = DuplicateReports.count_duplicate_reports() + reports = Reports.count_reports() + user_links = UserLinks.count_user_links() + dnps = DnpEntries.count_dnp_entries() + + conn + |> assign(:duplicate_report_count, duplicate_reports) + |> assign(:report_count, reports) + |> assign(:user_link_count, user_links) + |> assign(:dnp_entry_count, dnps) + end + + defp staff?(%{role: role}) when role in ["assistant", "moderator", "admin"], do: true + defp staff?(_user), do: false +end diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index 4dd08e10..d9ff7a0e 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -19,6 +19,7 @@ defmodule PhilomenaWeb.Router do plug PhilomenaWeb.ForumListPlug plug PhilomenaWeb.FilterSelectPlug plug PhilomenaWeb.ChannelPlug + plug PhilomenaWeb.AdminCountersPlug end pipeline :api do diff --git a/lib/philomena_web/templates/layout/_header_staff_links.html.slime b/lib/philomena_web/templates/layout/_header_staff_links.html.slime index 9e3d16a5..9e1b8c4d 100644 --- a/lib/philomena_web/templates/layout/_header_staff_links.html.slime +++ b/lib/philomena_web/templates/layout/_header_staff_links.html.slime @@ -38,19 +38,19 @@ = link to: "#", class: "header__link", title: "Duplicates" do =<> "D" span.header__counter__admin - | 0 + = @duplicate_report_count = link to: "#", class: "header__link", title: "Reports" do =<> "R" span.header__counter__admin - | 0 + = @report_count = link to: "#", class: "header__link", title: "User Links" do =<> "L" span.header__counter__admin - | 0 + = @user_link_count = link to: "#", class: "header__link", title: "DNP Requests" do =<> "S" span.header__counter__admin - | 0 + = @dnp_entry_count .dropdown.hide-mobile a.header__link title="Bans" =<> "B"