FIX: Delete associated channel upon category deletion

Currently when a category is deleted, if it has an associated chat
channel, the latter won’t be deleted automatically.

The fix is quite simple as we were simply missing a `dependent:
:destroy` option on the existing relation.
This commit is contained in:
Loïc Guitaut 2022-11-17 15:16:14 +01:00 committed by Loïc Guitaut
parent e9863b145c
commit 01392ab90c
5 changed files with 22 additions and 5 deletions

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class DeleteOrphanedChannels < ActiveRecord::Migration[7.0]
def up
DB.exec(
"DELETE FROM chat_channels WHERE chatable_type = 'Category' AND type = 'CategoryChannel' AND NOT EXISTS (SELECT * FROM categories WHERE categories.id = chat_channels.chatable_id)",
)
end
end

View File

@ -5,7 +5,7 @@ module Chat::CategoryExtension
include Chatable
prepended { has_one :category_channel, as: :chatable }
prepended { has_one :category_channel, as: :chatable, dependent: :destroy }
def cannot_delete_reason
return I18n.t("category.cannot_delete.has_chat_channels") if category_channel

View File

@ -103,9 +103,13 @@ describe Jobs::AutoManageChannelMemberships do
end
context "when chatable doesnt exist anymore" do
before do
channel.chatable.destroy!
channel.reload
let(:channel) do
Fabricate(
:category_channel,
auto_join_users: true,
chatable_type: "Category",
chatable_id: -1,
)
end
it "does nothing" do

View File

@ -8,7 +8,7 @@ RSpec.describe Category do
let(:channel_class) { CategoryChannel }
end
it { is_expected.to have_one(:category_channel) }
it { is_expected.to have_one(:category_channel).dependent(:destroy) }
describe "#cannot_delete_reason" do
subject(:reason) { category.cannot_delete_reason }

View File

@ -24,6 +24,10 @@ RSpec.describe CategoriesController do
it "deletes the category" do
expect { destroy_category }.to change { Category.count }.by(-1)
end
it "deletes the associated channel" do
expect { destroy_category }.to change { CategoryChannel.count }.by(-1)
end
end
context "when channel has messages" do