diff --git a/app/controllers/alchemy/admin/pages_controller.rb b/app/controllers/alchemy/admin/pages_controller.rb index c74be87dc3..08ff3106c3 100644 --- a/app/controllers/alchemy/admin/pages_controller.rb +++ b/app/controllers/alchemy/admin/pages_controller.rb @@ -145,6 +145,8 @@ def destroy # Remove page from clipboard clipboard = get_clipboard("pages") clipboard.delete_if { |item| item["id"] == @page.id.to_s } + else + flash[:warning] = @page.errors.full_messages.to_sentence end respond_to do |format| diff --git a/app/models/alchemy/page.rb b/app/models/alchemy/page.rb index c620cdaa05..da4866500a 100644 --- a/app/models/alchemy/page.rb +++ b/app/models/alchemy/page.rb @@ -129,6 +129,11 @@ class Page < BaseRecord before_create -> { versions.build }, if: -> { versions.none? } + before_destroy if: -> { nodes.any? } do + errors.add(:nodes, :still_present) + throw(:abort) + end + before_save :set_language_code, if: -> { language.present? } diff --git a/config/locales/alchemy.en.yml b/config/locales/alchemy.en.yml index 32d0fad4da..d60db46705 100644 --- a/config/locales/alchemy.en.yml +++ b/config/locales/alchemy.en.yml @@ -777,6 +777,10 @@ en: attributes: pages: still_present: "are still attached to this language. Please remove them first." + alchemy/page: + attributes: + nodes: + still_present: "are still attached to this page. Please remove them first." models: gutentag/tag: one: Tag diff --git a/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb b/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb new file mode 100644 index 0000000000..d6c354091b --- /dev/null +++ b/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class RestrictOnDeletePageIdForeignKeyFromAlchemyNodes < ActiveRecord::Migration[6.0] + def up + remove_foreign_key :alchemy_nodes, :alchemy_pages + add_foreign_key :alchemy_nodes, :alchemy_pages, column: :page_id, on_delete: :restrict + end + + def down + remove_foreign_key :alchemy_nodes, :alchemy_pages + add_foreign_key :alchemy_nodes, :alchemy_pages, column: :page_id, on_delete: :cascade + end +end diff --git a/spec/controllers/alchemy/admin/pages_controller_spec.rb b/spec/controllers/alchemy/admin/pages_controller_spec.rb index 595124e3ab..26724af8b6 100644 --- a/spec/controllers/alchemy/admin/pages_controller_spec.rb +++ b/spec/controllers/alchemy/admin/pages_controller_spec.rb @@ -47,6 +47,29 @@ end end + describe "#destroy" do + let(:page) { create(:alchemy_page) } + + context "with nodes attached" do + let!(:node) { create(:alchemy_node, page: page) } + + it "returns with error message" do + delete :destroy, params: { id: page.id, format: :js } + expect(response).to redirect_to admin_page_path(page.id) + expect(flash[:warning]).to \ + eq("Nodes are still attached to this page. Please remove them first.") + end + end + + context "without nodes" do + it "removes the page" do + delete :destroy, params: { id: page.id, format: :js } + expect(response).to redirect_to admin_page_path(page.id) + expect(flash[:notice]).to eq("A Page 61 deleted") + end + end + end + describe "#publish" do let(:page) { create(:alchemy_page) } diff --git a/spec/dummy/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb b/spec/dummy/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb new file mode 100644 index 0000000000..0a6a9322a5 --- /dev/null +++ b/spec/dummy/db/migrate/20220514072456_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.rb @@ -0,0 +1,11 @@ +class RestrictOnDeletePageIdForeignKeyFromAlchemyNodes < ActiveRecord::Migration[6.0] + def up + remove_foreign_key :alchemy_nodes, :alchemy_pages + add_foreign_key :alchemy_nodes, :alchemy_pages, column: :page_id, on_delete: :restrict + end + + def down + remove_foreign_key :alchemy_nodes, :alchemy_pages + add_foreign_key :alchemy_nodes, :alchemy_pages, column: :page_id, on_delete: :cascade + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 10e94895a9..b29b157f19 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2021_11_05_175532) do +ActiveRecord::Schema[7.0].define(version: 2022_05_14_072456) do create_table "alchemy_attachments", force: :cascade do |t| t.string "name" t.string "file_name" @@ -402,7 +402,7 @@ add_foreign_key "alchemy_essence_pages", "alchemy_pages", column: "page_id" add_foreign_key "alchemy_ingredients", "alchemy_elements", column: "element_id", on_delete: :cascade add_foreign_key "alchemy_nodes", "alchemy_languages", column: "language_id" - add_foreign_key "alchemy_nodes", "alchemy_pages", column: "page_id", on_delete: :cascade + add_foreign_key "alchemy_nodes", "alchemy_pages", column: "page_id", on_delete: :restrict add_foreign_key "alchemy_page_versions", "alchemy_pages", column: "page_id", on_delete: :cascade add_foreign_key "alchemy_pages", "alchemy_languages", column: "language_id" add_foreign_key "alchemy_picture_thumbs", "alchemy_pictures", column: "picture_id"