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.

111 lines
2.9KB

  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_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. "coalesce((?)->'object'->>'id', (?)->>'object') = ANY(?)",
  45. activity.data,
  46. activity.data,
  47. ^object_ids
  48. )
  49. )
  50. end
  51. def by_object_id(query, object_id) when is_binary(object_id) do
  52. from(activity in query,
  53. where:
  54. fragment(
  55. "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
  56. activity.data,
  57. activity.data,
  58. ^object_id
  59. )
  60. )
  61. end
  62. @spec by_object_in_reply_to_id(query, String.t(), keyword()) :: query
  63. def by_object_in_reply_to_id(query, in_reply_to_id, opts \\ []) do
  64. query =
  65. if opts[:skip_preloading] do
  66. Activity.with_joined_object(query)
  67. else
  68. Activity.with_preloaded_object(query)
  69. end
  70. where(
  71. query,
  72. [activity, object: o],
  73. fragment("(?)->>'inReplyTo' = ?", o.data, ^to_string(in_reply_to_id))
  74. )
  75. end
  76. @spec by_type(query, String.t()) :: query
  77. def by_type(query \\ Activity, activity_type) do
  78. from(
  79. activity in query,
  80. where: fragment("(?)->>'type' = ?", activity.data, ^activity_type)
  81. )
  82. end
  83. @spec exclude_type(query, String.t()) :: query
  84. def exclude_type(query \\ Activity, activity_type) do
  85. from(
  86. activity in query,
  87. where: fragment("(?)->>'type' != ?", activity.data, ^activity_type)
  88. )
  89. end
  90. def exclude_authors(query \\ Activity, actors) do
  91. from(activity in query, where: activity.actor not in ^actors)
  92. end
  93. end