695ea2512d04652ed49b9196f9239d9ae1b04ef0
[akkoma] / thread_mute.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ThreadMute do
6 use Ecto.Schema
7 alias Pleroma.Web.ThreadMute
8 alias Pleroma.{Activity, Repo, User}
9 require Ecto.Query
10
11 schema "thread_mutes" do
12 belongs_to(:user, User, type: Pleroma.FlakeId)
13 field(:context, :string)
14 end
15
16 def changeset(mute, params \\ %{}) do
17 mute
18 |> Ecto.Changeset.cast(params, [:user_id, :context])
19 |> Ecto.Changeset.foreign_key_constraint(:user_id)
20 |> Ecto.Changeset.unique_constraint(:user_id, name: :unique_index)
21 end
22
23 def query(user, context) do
24 user_id = Pleroma.FlakeId.from_string(user.id)
25
26 ThreadMute
27 |> Ecto.Query.where(user_id: ^user_id)
28 |> Ecto.Query.where(context: ^context)
29 end
30
31 def add_mute(user, id) do
32 activity = Activity.get_by_id(id)
33
34 with changeset <-
35 changeset(%ThreadMute{}, %{user_id: user.id, context: activity.data["context"]}),
36 {:ok, _} <- Repo.insert(changeset) do
37 {:ok, activity}
38 else
39 {:error, _} -> {:error, "conversation is already muted"}
40 end
41 end
42
43 def remove_mute(user, id) do
44 activity = Activity.get_by_id(id)
45
46 query(user, activity.data["context"])
47 |> Repo.delete_all()
48
49 {:ok, activity}
50 end
51
52 def muted?(%{id: nil} = _user, _), do: false
53
54 def muted?(user, activity) do
55 with query <- query(user, activity.data["context"]),
56 [] <- Repo.all(query) do
57 false
58 else
59 _ -> true
60 end
61 end
62 end