46 lines
1.1 KiB
Elixir
46 lines
1.1 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
|
# 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
|