Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

137 lignes
3.1KB

  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.Filter do
  5. use Ecto.Schema
  6. import Ecto.Changeset
  7. import Ecto.Query
  8. alias Pleroma.Repo
  9. alias Pleroma.User
  10. schema "filters" do
  11. belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
  12. field(:filter_id, :integer)
  13. field(:hide, :boolean, default: false)
  14. field(:whole_word, :boolean, default: true)
  15. field(:phrase, :string)
  16. field(:context, {:array, :string})
  17. field(:expires_at, :utc_datetime)
  18. timestamps()
  19. end
  20. def get(id, %{id: user_id} = _user) do
  21. query =
  22. from(
  23. f in Pleroma.Filter,
  24. where: f.filter_id == ^id,
  25. where: f.user_id == ^user_id
  26. )
  27. Repo.one(query)
  28. end
  29. def get_active(query) do
  30. from(f in query, where: is_nil(f.expires_at) or f.expires_at > ^NaiveDateTime.utc_now())
  31. end
  32. def get_irreversible(query) do
  33. from(f in query, where: f.hide)
  34. end
  35. def get_filters(query \\ __MODULE__, %User{id: user_id}) do
  36. query =
  37. from(
  38. f in query,
  39. where: f.user_id == ^user_id,
  40. order_by: [desc: :id]
  41. )
  42. Repo.all(query)
  43. end
  44. def create(%Pleroma.Filter{user_id: user_id, filter_id: nil} = filter) do
  45. # If filter_id wasn't given, use the max filter_id for this user plus 1.
  46. # XXX This could result in a race condition if a user tries to add two
  47. # different filters for their account from two different clients at the
  48. # same time, but that should be unlikely.
  49. max_id_query =
  50. from(
  51. f in Pleroma.Filter,
  52. where: f.user_id == ^user_id,
  53. select: max(f.filter_id)
  54. )
  55. filter_id =
  56. case Repo.one(max_id_query) do
  57. # Start allocating from 1
  58. nil ->
  59. 1
  60. max_id ->
  61. max_id + 1
  62. end
  63. filter
  64. |> Map.put(:filter_id, filter_id)
  65. |> Repo.insert()
  66. end
  67. def create(%Pleroma.Filter{} = filter) do
  68. Repo.insert(filter)
  69. end
  70. def delete(%Pleroma.Filter{id: filter_key} = filter) when is_number(filter_key) do
  71. Repo.delete(filter)
  72. end
  73. def delete(%Pleroma.Filter{id: filter_key} = filter) when is_nil(filter_key) do
  74. %Pleroma.Filter{id: id} = get(filter.filter_id, %{id: filter.user_id})
  75. filter
  76. |> Map.put(:id, id)
  77. |> Repo.delete()
  78. end
  79. def update(%Pleroma.Filter{} = filter, params) do
  80. filter
  81. |> cast(params, [:phrase, :context, :hide, :expires_at, :whole_word])
  82. |> validate_required([:phrase, :context])
  83. |> Repo.update()
  84. end
  85. def compose_regex(user_or_filters, format \\ :postgres)
  86. def compose_regex(%User{} = user, format) do
  87. __MODULE__
  88. |> get_active()
  89. |> get_irreversible()
  90. |> get_filters(user)
  91. |> compose_regex(format)
  92. end
  93. def compose_regex([_ | _] = filters, format) do
  94. phrases =
  95. filters
  96. |> Enum.map(& &1.phrase)
  97. |> Enum.join("|")
  98. case format do
  99. :postgres ->
  100. "\\y(#{phrases})\\y"
  101. :re ->
  102. ~r/\b#{phrases}\b/i
  103. _ ->
  104. nil
  105. end
  106. end
  107. def compose_regex(_, _), do: nil
  108. end