commit: 9d63b2c9db88ffdeb608df427caf2996eb0bb094
parent: e0eb90f62a5c8cc14c8fd7fc82ab54342f6fe209
Author: Haelwenn <contact+git.pleroma.social@hacktivis.me>
Date: Mon, 31 Aug 2020 20:55:05 +0000
Merge branch 'chat-relation-constraints' into 'develop'
Chats: Add cascading delete on both referenced users.
See merge request pleroma/pleroma!2934
Diffstat:
3 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -149,9 +149,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController 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()
diff --git a/priv/repo/migrations/20200831142509_chat_constraints.exs b/priv/repo/migrations/20200831142509_chat_constraints.exs
@@ -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
diff --git a/test/chat_test.exs b/test/chat_test.exs
@@ -26,6 +26,28 @@ defmodule Pleroma.ChatTest 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)