Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.8KB

  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. 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() | Activity.t()
  10. alias Pleroma.Activity
  11. alias Pleroma.User
  12. @spec by_ap_id(query, String.t()) :: query
  13. def by_ap_id(query \\ Activity, ap_id) do
  14. from(
  15. activity in query,
  16. where: fragment("(?)->>'id' = ?", activity.data, ^to_string(ap_id))
  17. )
  18. end
  19. @spec by_actor(query, String.t()) :: query
  20. def by_actor(query \\ Activity, actor) do
  21. from(a in query, where: a.actor == ^actor)
  22. end
  23. @spec by_author(query, User.t()) :: query
  24. def by_author(query \\ Activity, %User{ap_id: ap_id}) do
  25. from(a in query, where: a.actor == ^ap_id)
  26. end
  27. def find_by_object_ap_id(activities, object_ap_id) do
  28. Enum.find(
  29. activities,
  30. &(object_ap_id in [is_map(&1.data["object"]) && &1.data["object"]["id"], &1.data["object"]])
  31. )
  32. end
  33. @spec by_object_id(query, String.t() | [String.t()]) :: query
  34. def by_object_id(query \\ Activity, object_id)
  35. def by_object_id(query, object_ids) when is_list(object_ids) do
  36. from(
  37. activity in query,
  38. where:
  39. fragment(
  40. "coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)",
  41. activity.data,
  42. activity.data,
  43. ^object_ids
  44. )
  45. )
  46. end
  47. def by_object_id(query, object_id) when is_binary(object_id) do
  48. from(activity in query,
  49. where:
  50. fragment(
  51. "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
  52. activity.data,
  53. activity.data,
  54. ^object_id
  55. )
  56. )
  57. end
  58. @spec by_object_in_reply_to_id(query, String.t(), keyword()) :: query
  59. def by_object_in_reply_to_id(query, in_reply_to_id, opts \\ []) do
  60. query =
  61. if opts[:skip_preloading] do
  62. Activity.with_joined_object(query)
  63. else
  64. Activity.with_preloaded_object(query)
  65. end
  66. where(
  67. query,
  68. [activity, object: o],
  69. fragment("(?)->>'inReplyTo' = ?", o.data, ^to_string(in_reply_to_id))
  70. )
  71. end
  72. @spec by_type(query, String.t()) :: query
  73. def by_type(query \\ Activity, activity_type) do
  74. from(
  75. activity in query,
  76. where: fragment("(?)->>'type' = ?", activity.data, ^activity_type)
  77. )
  78. end
  79. @spec exclude_type(query, String.t()) :: query
  80. def exclude_type(query \\ Activity, activity_type) do
  81. from(
  82. activity in query,
  83. where: fragment("(?)->>'type' != ?", activity.data, ^activity_type)
  84. )
  85. end
  86. def exclude_authors(query \\ Activity, actors) do
  87. from(activity in query, where: activity.actor not in ^actors)
  88. end
  89. end