From accc9b53042d2ef13e251f761068b8c71babe405 Mon Sep 17 00:00:00 2001
From: Luna D <cod7777@yandex.ru>
Date: Wed, 4 Dec 2019 18:15:54 -0500
Subject: [PATCH] actual working counters i think

---
 lib/philomena/dnp_entries.ex                  |  6 +++
 lib/philomena/duplicate_reports.ex            |  6 +++
 lib/philomena/reports.ex                      |  6 +++
 lib/philomena/user_links.ex                   |  6 +++
 .../plugs/admin_counters_plug.ex              | 48 +++++++++++++++++++
 lib/philomena_web/router.ex                   |  1 +
 .../layout/_header_staff_links.html.slime     |  8 ++--
 7 files changed, 77 insertions(+), 4 deletions(-)
 create mode 100644 lib/philomena_web/plugs/admin_counters_plug.ex

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"