Merge branch 'chat-relation-constraints' into 'develop'

Chats: Add cascading delete on both referenced users.

See merge request pleroma/pleroma!2934
This commit is contained in:
Haelwenn 2020-08-31 20:55:05 +00:00
commit 9d63b2c9db
3 changed files with 45 additions and 3 deletions

View file

@ -149,9 +149,7 @@ def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do
from(c in Chat,
where: c.user_id == ^user_id,
where: c.recipient not in ^blocked_ap_ids,
order_by: [desc: c.updated_at],
inner_join: u in User,
on: u.ap_id == c.recipient
order_by: [desc: c.updated_at]
)
|> Repo.all()

View 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

View file

@ -26,6 +26,28 @@ test "it creates a chat for a user and recipient" do
assert chat.id
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
user = insert(:user)
other_user = insert(:user)