logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

queries.ex (2866B)


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