forked from AkkomaGang/akkoma
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,
|
||||
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()
|
||||
|
||||
|
|
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
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue