# Pleroma: A lightweight social networking server # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Mix.Tasks.Pleroma.RefreshCounterCache do @shortdoc "Refreshes counter cache" use Mix.Task alias Pleroma.Activity alias Pleroma.CounterCache alias Pleroma.Repo require Logger import Ecto.Query def run([]) do Mix.Pleroma.start_pleroma() ["public", "unlisted", "private", "direct"] |> Enum.each(fn visibility -> count = status_visibility_count_query(visibility) name = "status_visibility_#{visibility}" CounterCache.set(name, count) Mix.Pleroma.shell_info("Set #{name} to #{count}") end) Mix.Pleroma.shell_info("Done") end defp status_visibility_count_query(visibility) do Activity |> where( [a], fragment( "activity_visibility(?, ?, ?) = ?", a.actor, a.recipients, a.data, ^visibility ) ) |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) |> Repo.aggregate(:count, :id, timeout: :timer.minutes(30)) end end