Chats: Add cascading delete on both referenced users.
Also remove the now-superfluous join in the chat controller, which was only used to filter out these cases.
This commit is contained in:
parent
0417b2f649
commit
0b621a834a
3 changed files with 45 additions and 3 deletions
|
@ -149,9 +149,7 @@ def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do
|
||||||
from(c in Chat,
|
from(c in Chat,
|
||||||
where: c.user_id == ^user_id,
|
where: c.user_id == ^user_id,
|
||||||
where: c.recipient not in ^blocked_ap_ids,
|
where: c.recipient not in ^blocked_ap_ids,
|
||||||
order_by: [desc: c.updated_at],
|
order_by: [desc: c.updated_at]
|
||||||
inner_join: u in User,
|
|
||||||
on: u.ap_id == c.recipient
|
|
||||||
)
|
)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|
|
||||||
|
|
22
priv/repo/migrations/20200831142509_chat_constraints.exs
Normal file
22
priv/repo/migrations/20200831142509_chat_constraints.exs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.ChatConstraints do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
remove_orphans = """
|
||||||
|
delete from chats where not exists(select id from users where ap_id = chats.recipient);
|
||||||
|
"""
|
||||||
|
|
||||||
|
execute(remove_orphans)
|
||||||
|
|
||||||
|
drop(constraint(:chats, "chats_user_id_fkey"))
|
||||||
|
|
||||||
|
alter table(:chats) do
|
||||||
|
modify(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
|
||||||
|
|
||||||
|
modify(
|
||||||
|
:recipient,
|
||||||
|
references(:users, column: :ap_id, type: :string, on_delete: :delete_all)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -26,6 +26,28 @@ test "it creates a chat for a user and recipient" do
|
||||||
assert chat.id
|
assert chat.id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "deleting the user deletes the chat" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
|
||||||
|
|
||||||
|
Repo.delete(user)
|
||||||
|
|
||||||
|
refute Chat.get_by_id(chat.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "deleting the recipient deletes the chat" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
|
||||||
|
|
||||||
|
Repo.delete(other_user)
|
||||||
|
|
||||||
|
refute Chat.get_by_id(chat.id)
|
||||||
|
end
|
||||||
|
|
||||||
test "it returns and bumps a chat for a user and recipient if it already exists" do
|
test "it returns and bumps a chat for a user and recipient if it already exists" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue