Diagnostics tasks (#348)
[akkoma] / lib / mix / tasks / pleroma / diagnostics.ex
1 defmodule Mix.Tasks.Pleroma.Diagnostics do
2 alias Pleroma.Repo
3 alias Pleroma.User
4
5 require Logger
6 require Pleroma.Constants
7
8 import Mix.Pleroma
9 import Ecto.Query
10 use Mix.Task
11
12 def run(["home_timeline", nickname]) do
13 start_pleroma()
14 user = Repo.get_by!(User, nickname: nickname)
15 Logger.info("Home timeline query #{user.nickname}")
16
17 followed_hashtags =
18 user
19 |> User.followed_hashtags()
20 |> Enum.map(& &1.id)
21
22 params =
23 %{limit: 20}
24 |> Map.put(:type, ["Create", "Announce"])
25 |> Map.put(:blocking_user, user)
26 |> Map.put(:muting_user, user)
27 |> Map.put(:reply_filtering_user, user)
28 |> Map.put(:announce_filtering_user, user)
29 |> Map.put(:user, user)
30 |> Map.put(:followed_hashtags, followed_hashtags)
31 |> Map.delete(:local)
32
33 list_memberships = Pleroma.List.memberships(user)
34 recipients = [user.ap_id | User.following(user)]
35
36 query =
37 Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query(
38 recipients ++ list_memberships,
39 params
40 )
41 |> limit(20)
42
43 Ecto.Adapters.SQL.explain(Repo, :all, query, analyze: true, timeout: :infinity)
44 |> IO.puts()
45 end
46
47 def run(["user_timeline", nickname, reading_nickname]) do
48 start_pleroma()
49 user = Repo.get_by!(User, nickname: nickname)
50 reading_user = Repo.get_by!(User, nickname: reading_nickname)
51 Logger.info("User timeline query #{user.nickname}")
52
53 params =
54 %{limit: 20}
55 |> Map.put(:type, ["Create", "Announce"])
56 |> Map.put(:user, reading_user)
57 |> Map.put(:actor_id, user.ap_id)
58 |> Map.put(:pinned_object_ids, Map.keys(user.pinned_objects))
59
60 list_memberships = Pleroma.List.memberships(user)
61
62 recipients =
63 %{
64 godmode: params[:godmode],
65 reading_user: reading_user
66 }
67 |> Pleroma.Web.ActivityPub.ActivityPub.user_activities_recipients()
68
69 query =
70 (recipients ++ list_memberships)
71 |> Pleroma.Web.ActivityPub.ActivityPub.fetch_activities_query(params)
72 |> limit(20)
73
74 Ecto.Adapters.SQL.explain(Repo, :all, query, analyze: true, timeout: :infinity)
75 |> IO.puts()
76 end
77 end