mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-24 04:27:59 +01:00
fill out stats page
This commit is contained in:
parent
8fb062503e
commit
7de9c69434
2 changed files with 94 additions and 5 deletions
|
@ -7,10 +7,18 @@ defmodule PhilomenaWeb.StatController do
|
||||||
alias Philomena.Forums.Forum
|
alias Philomena.Forums.Forum
|
||||||
alias Philomena.Posts.Post
|
alias Philomena.Posts.Post
|
||||||
alias Philomena.Users.User
|
alias Philomena.Users.User
|
||||||
|
alias Philomena.Galleries.Gallery
|
||||||
|
alias Philomena.Galleries.Interaction
|
||||||
|
alias Philomena.Commissions.Commission
|
||||||
|
alias Philomena.Commissions.Item
|
||||||
|
alias Philomena.Reports.Report
|
||||||
alias Philomena.Repo
|
alias Philomena.Repo
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
|
{gallery_count, gallery_size, distinct_creators, images_in_galleries} = galleries()
|
||||||
|
{open_reports, report_count, response_time} = moderation()
|
||||||
|
{open_commissions, commission_items} = commissions()
|
||||||
{image_aggs, comment_aggs} = aggregations()
|
{image_aggs, comment_aggs} = aggregations()
|
||||||
{forums, topics, posts} = forums()
|
{forums, topics, posts} = forums()
|
||||||
{users, users_24h} = users()
|
{users, users_24h} = users()
|
||||||
|
@ -24,7 +32,16 @@ defmodule PhilomenaWeb.StatController do
|
||||||
topics_count: topics,
|
topics_count: topics,
|
||||||
posts_count: posts,
|
posts_count: posts,
|
||||||
users_count: users,
|
users_count: users,
|
||||||
users_24h: users_24h
|
users_24h: users_24h,
|
||||||
|
open_commissions: open_commissions,
|
||||||
|
commission_items: commission_items,
|
||||||
|
open_reports: open_reports,
|
||||||
|
report_count: report_count,
|
||||||
|
response_time: response_time,
|
||||||
|
gallery_count: gallery_count,
|
||||||
|
gallery_size: gallery_size,
|
||||||
|
distinct_creators: distinct_creators,
|
||||||
|
images_in_galleries: images_in_galleries
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -47,7 +64,7 @@ defmodule PhilomenaWeb.StatController do
|
||||||
first_post = Repo.one(first(Post))
|
first_post = Repo.one(first(Post))
|
||||||
last_post = Repo.one(last(Post))
|
last_post = Repo.one(last(Post))
|
||||||
|
|
||||||
{forums, last_topic.id - first_topic.id, last_post.id - first_post.id}
|
{forums, diff(last_topic, first_topic), diff(last_post, first_post)}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp users do
|
defp users do
|
||||||
|
@ -60,6 +77,54 @@ defmodule PhilomenaWeb.StatController do
|
||||||
|> where([u], u.created_at > ^time)
|
|> where([u], u.created_at > ^time)
|
||||||
|> Repo.aggregate(:count, :id)
|
|> Repo.aggregate(:count, :id)
|
||||||
|
|
||||||
{last_user.id - first_user.id, last_24h}
|
{diff(last_user, first_user), last_24h}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp galleries do
|
||||||
|
gallery_count = Repo.aggregate(Gallery, :count, :id)
|
||||||
|
gallery_size = Float.round(Repo.aggregate(Gallery, :avg, :image_count) || 0.0, 2)
|
||||||
|
distinct_creators =
|
||||||
|
Gallery
|
||||||
|
|> distinct(:creator_id)
|
||||||
|
|> Repo.aggregate(:count, :id)
|
||||||
|
|
||||||
|
first_gi = Repo.one(first(Interaction))
|
||||||
|
last_gi = Repo.one(last(Interaction))
|
||||||
|
|
||||||
|
{gallery_count, gallery_size, distinct_creators, diff(last_gi, first_gi)}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp commissions do
|
||||||
|
open_commissions = Repo.aggregate(where(Commission, open: true), :count, :id)
|
||||||
|
commission_items = Repo.aggregate(Item, :count, :id)
|
||||||
|
|
||||||
|
{open_commissions, commission_items}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp moderation do
|
||||||
|
open_reports = Repo.aggregate(where(Report, open: true), :count, :id)
|
||||||
|
first_report = Repo.one(first(Report))
|
||||||
|
last_report = Repo.one(last(Report))
|
||||||
|
|
||||||
|
closed_reports =
|
||||||
|
Report
|
||||||
|
|> where(open: false)
|
||||||
|
|> order_by(desc: :created_at)
|
||||||
|
|> limit(250)
|
||||||
|
|> Repo.all()
|
||||||
|
|
||||||
|
response_time =
|
||||||
|
closed_reports
|
||||||
|
|> Enum.reduce(0, & &2 + NaiveDateTime.diff(&1.updated_at, &1.created_at, :second))
|
||||||
|
|> Kernel./(safe_length(closed_reports) * 3600)
|
||||||
|
|> trunc()
|
||||||
|
|
||||||
|
{open_reports, diff(last_report, first_report), response_time}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp diff(nil, nil), do: 0
|
||||||
|
defp diff(%{id: id2}, %{id: id1}), do: id2 - id1
|
||||||
|
|
||||||
|
defp safe_length([]), do: 1
|
||||||
|
defp safe_length(list), do: length(list)
|
||||||
end
|
end
|
||||||
|
|
|
@ -74,3 +74,27 @@ elixir:
|
||||||
span.stat>
|
span.stat>
|
||||||
= number_with_delimiter(@users_24h)
|
= number_with_delimiter(@users_24h)
|
||||||
' have joined in the last 24 hours.
|
' have joined in the last 24 hours.
|
||||||
|
|
||||||
|
h3 Commissions
|
||||||
|
p
|
||||||
|
' There are
|
||||||
|
span.stat>
|
||||||
|
= number_with_delimiter(@open_commissions)
|
||||||
|
' open commission listings on the site, offering a total of
|
||||||
|
span.stat>
|
||||||
|
= number_with_delimiter(@commission_items)
|
||||||
|
' items.
|
||||||
|
|
||||||
|
h3 Moderation
|
||||||
|
p
|
||||||
|
' We have received
|
||||||
|
span.stat>
|
||||||
|
= number_with_delimiter(@report_count)
|
||||||
|
' reports. Out of these reports,
|
||||||
|
=> number_with_delimiter(@open_reports)
|
||||||
|
' reports are outstanding and awaiting action.
|
||||||
|
p
|
||||||
|
' On the last 250 reports we've received, it's taken us on average
|
||||||
|
span.stat>
|
||||||
|
= @response_time
|
||||||
|
' hour(s) between a report being made and the report being resolved.
|
Loading…
Reference in a new issue