make 2fa UI less awful
[akkoma] / lib / pleroma / activity / queries.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Activity.Queries do
6 @moduledoc """
7 Contains queries for Activity.
8 """
9
10 import Ecto.Query, only: [from: 2, where: 3]
11
12 @type query :: Ecto.Queryable.t() | Activity.t()
13
14 alias Pleroma.Activity
15 alias Pleroma.User
16
17 @spec by_id(query(), String.t()) :: query()
18 def by_id(query \\ Activity, id) do
19 from(a in query, where: a.id == ^id)
20 end
21
22 @spec by_ap_id(query, String.t()) :: query
23 def by_ap_id(query \\ Activity, ap_id) do
24 from(
25 activity in query,
26 where: fragment("(?)->>'id' = ?", activity.data, ^to_string(ap_id))
27 )
28 end
29
30 @spec by_actor(query, String.t()) :: query
31 def by_actor(query \\ Activity, actor) do
32 from(a in query, where: a.actor == ^actor)
33 end
34
35 @spec by_author(query, User.t()) :: query
36 def by_author(query \\ Activity, %User{ap_id: ap_id}) do
37 from(a in query, where: a.actor == ^ap_id)
38 end
39
40 def find_by_object_ap_id(activities, object_ap_id) do
41 Enum.find(
42 activities,
43 &(object_ap_id in [is_map(&1.data["object"]) && &1.data["object"]["id"], &1.data["object"]])
44 )
45 end
46
47 @spec by_object_id(query, String.t() | [String.t()]) :: query
48 def by_object_id(query \\ Activity, object_id)
49
50 def by_object_id(query, object_ids) when is_list(object_ids) do
51 from(
52 activity in query,
53 where:
54 fragment(
55 "coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)",
56 activity.data,
57 activity.data,
58 ^object_ids
59 )
60 )
61 end
62
63 def by_object_id(query, object_id) when is_binary(object_id) do
64 from(activity in query,
65 where:
66 fragment(
67 "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
68 activity.data,
69 activity.data,
70 ^object_id
71 )
72 )
73 end
74
75 @spec by_object_in_reply_to_id(query, String.t(), keyword()) :: query
76 def by_object_in_reply_to_id(query, in_reply_to_id, opts \\ []) do
77 query =
78 if opts[:skip_preloading] do
79 Activity.with_joined_object(query)
80 else
81 Activity.with_preloaded_object(query)
82 end
83
84 where(
85 query,
86 [activity, object: o],
87 fragment("(?)->>'inReplyTo' = ?", o.data, ^to_string(in_reply_to_id))
88 )
89 end
90
91 @spec by_type(query, String.t()) :: query
92 def by_type(query \\ Activity, activity_type) do
93 from(
94 activity in query,
95 where: fragment("(?)->>'type' = ?", activity.data, ^activity_type)
96 )
97 end
98
99 @spec exclude_type(query, String.t()) :: query
100 def exclude_type(query \\ Activity, activity_type) do
101 from(
102 activity in query,
103 where: fragment("(?)->>'type' != ?", activity.data, ^activity_type)
104 )
105 end
106
107 def exclude_authors(query \\ Activity, actors) do
108 from(activity in query, where: activity.actor not in ^actors)
109 end
110 end