diff --git a/js/src/graphql/statistics.ts b/js/src/graphql/statistics.ts index 2bef730ca..4fd8ff843 100644 --- a/js/src/graphql/statistics.ts +++ b/js/src/graphql/statistics.ts @@ -6,6 +6,7 @@ export const STATISTICS = gql` numberOfUsers numberOfEvents numberOfComments + numberOfGroups } } `; diff --git a/js/src/types/statistics.model.ts b/js/src/types/statistics.model.ts index e30f2ccf7..3d8629341 100644 --- a/js/src/types/statistics.model.ts +++ b/js/src/types/statistics.model.ts @@ -2,4 +2,5 @@ export interface IStatistics { numberOfUsers: number; numberOfEvents: number; numberOfComments: number; + numberOfGroups: number; } diff --git a/js/src/views/About/AboutInstance.vue b/js/src/views/About/AboutInstance.vue index 9d569ca50..6bd608768 100644 --- a/js/src/views/About/AboutInstance.vue +++ b/js/src/views/About/AboutInstance.vue @@ -13,6 +13,9 @@ {{ statistics.numberOfUsers }} + + {{ statistics.numberOfGroups }} + {{ statistics.numberOfEvents }} @@ -135,10 +138,11 @@ section { &.contact-statistics { margin: 2px auto; .statistics { - display: flex; + display: grid; + grid-template-columns: repeat(auto-fit, 150px); + grid-template-rows: repeat(2, 1fr); p { text-align: right; - flex: 1; padding: 0 15px; & > * { diff --git a/lib/graphql/resolvers/statistics.ex b/lib/graphql/resolvers/statistics.ex index 4cf8b4227..3fdafeafc 100644 --- a/lib/graphql/resolvers/statistics.ex +++ b/lib/graphql/resolvers/statistics.ex @@ -13,7 +13,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Statistics do %{ number_of_users: StatisticsModule.get_cached_value(:local_users), number_of_events: StatisticsModule.get_cached_value(:local_events), - number_of_comments: StatisticsModule.get_cached_value(:local_comments) + number_of_comments: StatisticsModule.get_cached_value(:local_comments), + number_of_groups: StatisticsModule.get_cached_value(:local_groups) }} end end diff --git a/lib/graphql/schema/statistics.ex b/lib/graphql/schema/statistics.ex index ebb2ba2ca..f3c19810b 100644 --- a/lib/graphql/schema/statistics.ex +++ b/lib/graphql/schema/statistics.ex @@ -12,6 +12,7 @@ defmodule Mobilizon.GraphQL.Schema.StatisticsType do field(:number_of_users, :integer, description: "The number of local users") field(:number_of_events, :integer, description: "The number of local events") field(:number_of_comments, :integer, description: "The number of local comments") + field(:number_of_groups, :integer, description: "The number of local groups") end object :statistics_queries do diff --git a/lib/mobilizon/actors/actors.ex b/lib/mobilizon/actors/actors.ex index b33801e16..75b55882b 100644 --- a/lib/mobilizon/actors/actors.ex +++ b/lib/mobilizon/actors/actors.ex @@ -603,6 +603,25 @@ defmodule Mobilizon.Actors do """ def delete_group!(%Actor{type: :Group} = group), do: Repo.delete!(group) + @doc """ + Counts the local groups + """ + @spec count_local_groups :: integer() + def count_local_groups do + groups_query() + |> filter_local() + |> Repo.aggregate(:count) + end + + @doc """ + Counts all the groups + """ + @spec count_groups :: integer() + def count_groups do + groups_query() + |> Repo.aggregate(:count) + end + @doc """ Lists the groups. """ diff --git a/lib/mobilizon/discussions/discussions.ex b/lib/mobilizon/discussions/discussions.ex index cd6e7f523..630788b46 100644 --- a/lib/mobilizon/discussions/discussions.ex +++ b/lib/mobilizon/discussions/discussions.ex @@ -288,6 +288,12 @@ defmodule Mobilizon.Discussions do @spec count_local_comments :: integer def count_local_comments, do: Repo.one(count_local_comments_query()) + @doc """ + Counts all comments. + """ + @spec count_comments :: integer + def count_comments, do: Repo.one(count_comments_query()) + def get_discussion(discussion_id) do Discussion |> Repo.get(discussion_id) @@ -424,6 +430,15 @@ defmodule Mobilizon.Discussions do ) end + @spec count_comments_query :: Ecto.Query.t() + defp count_comments_query do + from( + c in Comment, + select: count(c.id), + where: c.visibility in ^@public_visibility + ) + end + @spec preload_for_comment(Ecto.Query.t()) :: Ecto.Query.t() defp preload_for_comment(query), do: preload(query, ^@comment_preloads) end diff --git a/lib/mobilizon/events/events.ex b/lib/mobilizon/events/events.ex index dbae893a4..a0ef3b0de 100644 --- a/lib/mobilizon/events/events.ex +++ b/lib/mobilizon/events/events.ex @@ -491,6 +491,17 @@ defmodule Mobilizon.Events do |> Repo.one() end + @doc """ + Counts all events. + """ + @spec count_events :: integer + def count_events do + count_events_query() + |> filter_unlisted_and_public_visibility() + |> filter_draft() + |> Repo.one() + end + @doc """ Builds a page struct for events by their name. """ @@ -1417,6 +1428,11 @@ defmodule Mobilizon.Events do from(e in Event, select: count(e.id), where: e.local == ^true) end + @spec count_events_query :: Ecto.Query.t() + defp count_events_query do + from(e in Event, select: count(e.id)) + end + @spec tag_by_slug_query(String.t()) :: Ecto.Query.t() defp tag_by_slug_query(slug) do from(t in Tag, where: t.slug == ^slug) @@ -1537,7 +1553,7 @@ defmodule Mobilizon.Events do from( p in Participant, where: p.event_id == ^event_id, - preload: [:actor] + preload: [:actor, :event] ) end diff --git a/lib/service/statistics/statistics.ex b/lib/service/statistics/statistics.ex index 105e33040..c3a0efaf1 100644 --- a/lib/service/statistics/statistics.ex +++ b/lib/service/statistics/statistics.ex @@ -3,7 +3,7 @@ defmodule Mobilizon.Service.Statistics do A module that provides cached statistics """ - alias Mobilizon.{Discussions, Events, Users} + alias Mobilizon.{Actors, Discussions, Events, Users} def get_cached_value(key) do case Cachex.fetch(:statistics, key, fn key -> @@ -28,4 +28,20 @@ defmodule Mobilizon.Service.Statistics do defp create_cache(:local_comments) do Discussions.count_local_comments() end + + defp create_cache(:local_groups) do + Actors.count_local_groups() + end + + defp create_cache(:federation_events) do + Events.count_events() + end + + defp create_cache(:federation_comments) do + Discussions.count_comments() + end + + defp create_cache(:federation_groups) do + Actors.count_groups() + end end