c57bd3bf84973e64132fd045fd473d8a09dbf859
[akkoma] / lib / pleroma / filter.ex
1 defmodule Pleroma.Filter do
2 use Ecto.Schema
3 import Ecto.{Changeset, Query}
4 alias Pleroma.{User, Repo}
5
6 schema "filters" do
7 belongs_to(:user, User)
8 field(:filter_id, :integer)
9 field(:hide, :boolean, default: false)
10 field(:whole_word, :boolean, default: true)
11 field(:phrase, :string)
12 field(:context, {:array, :string})
13 field(:expires_at, :utc_datetime)
14
15 timestamps()
16 end
17
18 def get(id, %{id: user_id} = _user) do
19 query =
20 from(
21 f in Pleroma.Filter,
22 where: f.filter_id == ^id,
23 where: f.user_id == ^user_id
24 )
25
26 Repo.one(query)
27 end
28
29 def get_filters(%User{id: user_id} = _user) do
30 query =
31 from(
32 f in Pleroma.Filter,
33 where: f.user_id == ^user_id
34 )
35
36 Repo.all(query)
37 end
38
39 def create(%Pleroma.Filter{user_id: user_id, filter_id: nil} = filter) do
40 # If filter_id wasn't given, use the max filter_id for this user plus 1.
41 # XXX This could result in a race condition if a user tries to add two
42 # different filters for their account from two different clients at the
43 # same time, but that should be unlikely.
44
45 max_id_query =
46 from(
47 f in Pleroma.Filter,
48 where: f.user_id == ^user_id,
49 select: max(f.filter_id)
50 )
51
52 filter_id =
53 case Repo.one(max_id_query) do
54 # Start allocating from 1
55 nil ->
56 1
57
58 max_id ->
59 max_id + 1
60 end
61
62 filter
63 |> Map.put(:filter_id, filter_id)
64 |> Repo.insert()
65 end
66
67 def create(%Pleroma.Filter{} = filter) do
68 Repo.insert(filter)
69 end
70
71 def delete(%Pleroma.Filter{id: filter_key} = filter) when is_number(filter_key) do
72 Repo.delete(filter)
73 end
74
75 def delete(%Pleroma.Filter{id: filter_key} = filter) when is_nil(filter_key) do
76 %Pleroma.Filter{id: id} = get(filter.filter_id, %{id: filter.user_id})
77
78 filter
79 |> Map.put(:id, id)
80 |> Repo.delete()
81 end
82
83 def update(%Pleroma.Filter{} = filter) do
84 destination = Map.from_struct(filter)
85
86 Pleroma.Filter.get(filter.filter_id, %{id: filter.user_id})
87 |> cast(destination, [:phrase, :context, :hide, :expires_at, :whole_word])
88 |> Repo.update()
89 end
90 end