[#1335] User: refactored :blocks field into :blocked_users relation.
[akkoma] / lib / pleroma / user_block.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.UserBlock do
6 use Ecto.Schema
7
8 import Ecto.Changeset
9 import Ecto.Query
10
11 alias Pleroma.Repo
12 alias Pleroma.User
13 alias Pleroma.UserBlock
14
15 schema "user_blocks" do
16 belongs_to(:blocker, User, type: FlakeId.Ecto.CompatType)
17 belongs_to(:blockee, User, type: FlakeId.Ecto.CompatType)
18
19 timestamps(updated_at: false)
20 end
21
22 def changeset(%UserBlock{} = user_block, params \\ %{}) do
23 user_block
24 |> cast(params, [:blocker_id, :blockee_id])
25 |> validate_required([:blocker_id, :blockee_id])
26 |> unique_constraint(:blockee_id, name: :user_blocks_blocker_id_blockee_id_index)
27 |> validate_not_self_block()
28 end
29
30 def exists?(%User{} = blocker, %User{} = blockee) do
31 UserBlock
32 |> where(blocker_id: ^blocker.id, blockee_id: ^blockee.id)
33 |> Repo.exists?()
34 end
35
36 def create(%User{} = blocker, %User{} = blockee) do
37 %UserBlock{}
38 |> changeset(%{blocker_id: blocker.id, blockee_id: blockee.id})
39 |> Repo.insert(
40 on_conflict: :replace_all_except_primary_key,
41 conflict_target: [:blocker_id, :blockee_id]
42 )
43 end
44
45 def delete(%User{} = blocker, %User{} = blockee) do
46 attrs = %{blocker_id: blocker.id, blockee_id: blockee.id}
47
48 if is_nil(existing_record = Repo.get_by(UserBlock, attrs)) do
49 {:ok, nil}
50 else
51 Repo.delete(existing_record)
52 end
53 end
54
55 defp validate_not_self_block(%Ecto.Changeset{} = changeset) do
56 changeset
57 |> validate_change(:blockee_id, fn _, blockee_id ->
58 if blockee_id == changeset.changes[:blocker_id] || changeset.data.blocker_id do
59 [blockee_id: "can't be equal to blocker_id"]
60 else
61 []
62 end
63 end)
64 |> validate_change(:blocker_id, fn _, blocker_id ->
65 if blocker_id == changeset.changes[:blockee_id] || changeset.data.blockee_id do
66 [blocker_id: "can't be equal to blockee_id"]
67 else
68 []
69 end
70 end)
71 end
72 end