From aac3ceae5bc7576751fb7acc526ae947c0c03504 Mon Sep 17 00:00:00 2001 From: Sascha Karnatz <68833+kulturbande@users.noreply.github.com> Date: Fri, 20 Jan 2023 14:00:09 +0100 Subject: [PATCH] Page searchable toggle It is possible to remove pages from the index that have a disabled searchable - flag. This is the companion commit to the PR in Alchemy CMS. Reference: https://github.com/AlchemyCMS/alchemy_cms/pull/2414 --- Gemfile | 2 +- .../alchemy/pg_search/controller_methods.rb | 9 +++++--- .../alchemy/pg_search/page_extension.rb | 2 +- lib/alchemy/pg_search/engine.rb | 3 +++ ..._foreign_key_from_alchemy_nodes.alchemy.rb | 14 ++++++++++++ ...nline_to_alchemy_essence_videos.alchemy.rb | 10 +++++++++ ...add_searchable_to_alchemy_pages.alchemy.rb | 8 +++++++ spec/dummy/db/schema.rb | 6 +++-- spec/lib/search_spec.rb | 22 +++++++++++++++++++ 9 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 spec/dummy/db/migrate/20230119143813_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.alchemy.rb create mode 100644 spec/dummy/db/migrate/20230119143814_add_playsinline_to_alchemy_essence_videos.alchemy.rb create mode 100644 spec/dummy/db/migrate/20230119143815_add_searchable_to_alchemy_pages.alchemy.rb diff --git a/Gemfile b/Gemfile index 0470b6c..e84736d 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" gemspec gem "rails", "~> 6.0.0" -ENV.fetch("ALCHEMY_BRANCH", "6.0-stable").tap do |branch| +ENV.fetch("ALCHEMY_BRANCH", "6.1-stable").tap do |branch| gem "alchemy_cms", github: "AlchemyCMS/alchemy_cms", branch: branch end gem "sassc-rails" diff --git a/app/controller/alchemy/pg_search/controller_methods.rb b/app/controller/alchemy/pg_search/controller_methods.rb index 043a20b..8f1e6c4 100644 --- a/app/controller/alchemy/pg_search/controller_methods.rb +++ b/app/controller/alchemy/pg_search/controller_methods.rb @@ -70,11 +70,14 @@ def search_result_page end def search_result_page_layout - page_layout = PageLayout.get_all_by_attributes(searchresults: true).first - if page_layout.nil? + # search for page layout with the attribute `searchresults: true` + page_layouts = PageLayout.all.select do |page_layout| + page_layout.key?(:searchresults) && page_layout[:searchresults].to_s.casecmp(true.to_s).zero? + end + if page_layouts.nil? raise "No searchresults page layout found. Please add page layout with `searchresults: true` into your `page_layouts.yml` file." end - page_layout + page_layouts.first end def paginate_per diff --git a/app/extensions/alchemy/pg_search/page_extension.rb b/app/extensions/alchemy/pg_search/page_extension.rb index f6e669c..09009c9 100644 --- a/app/extensions/alchemy/pg_search/page_extension.rb +++ b/app/extensions/alchemy/pg_search/page_extension.rb @@ -17,7 +17,7 @@ def self.prepended(base) def searchable? (definition.key?(:searchable) ? definition[:searchable] : true) && - public? && !layoutpage? + searchable && public? && !layoutpage? end private diff --git a/lib/alchemy/pg_search/engine.rb b/lib/alchemy/pg_search/engine.rb index 469bf97..52869e3 100644 --- a/lib/alchemy/pg_search/engine.rb +++ b/lib/alchemy/pg_search/engine.rb @@ -17,6 +17,9 @@ class Engine < ::Rails::Engine # reindex the page after it was published Alchemy.publish_targets << Alchemy::PgSearch::IndexPageJob + # enable searchable flag in page form + Alchemy.enable_searchable = true + # configure multiselect to find also partial words # @link https://github.com/Casecommons/pg_search#searching-using-different-search-features ::PgSearch.multisearch_options = { diff --git a/spec/dummy/db/migrate/20230119143813_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.alchemy.rb b/spec/dummy/db/migrate/20230119143813_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.alchemy.rb new file mode 100644 index 0000000..9286904 --- /dev/null +++ b/spec/dummy/db/migrate/20230119143813_restrict_on_delete_page_id_foreign_key_from_alchemy_nodes.alchemy.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +# This migration comes from alchemy (originally 20220514072456) + +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/migrate/20230119143814_add_playsinline_to_alchemy_essence_videos.alchemy.rb b/spec/dummy/db/migrate/20230119143814_add_playsinline_to_alchemy_essence_videos.alchemy.rb new file mode 100644 index 0000000..57a529e --- /dev/null +++ b/spec/dummy/db/migrate/20230119143814_add_playsinline_to_alchemy_essence_videos.alchemy.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +# This migration comes from alchemy (originally 20220622130905) + +class AddPlaysinlineToAlchemyEssenceVideos < ActiveRecord::Migration[6.0] + def change + return if column_exists?(:alchemy_essence_videos, :playsinline) + + add_column :alchemy_essence_videos, :playsinline, :boolean, default: false, null: false + end +end diff --git a/spec/dummy/db/migrate/20230119143815_add_searchable_to_alchemy_pages.alchemy.rb b/spec/dummy/db/migrate/20230119143815_add_searchable_to_alchemy_pages.alchemy.rb new file mode 100644 index 0000000..c526e02 --- /dev/null +++ b/spec/dummy/db/migrate/20230119143815_add_searchable_to_alchemy_pages.alchemy.rb @@ -0,0 +1,8 @@ +# This migration comes from alchemy (originally 20230119112425) +class AddSearchableToAlchemyPages < ActiveRecord::Migration[6.0] + def change + return if column_exists?(:alchemy_pages, :searchable) + + add_column :alchemy_pages, :searchable, :boolean, default: true, null: false + end +end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 48d184c..6cb4cec 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.define(version: 2022_08_26_125413) do +ActiveRecord::Schema.define(version: 2023_01_19_143815) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -179,6 +179,7 @@ t.boolean "loop", default: false, null: false t.boolean "muted", default: false, null: false t.string "preload" + t.boolean "playsinline", default: false, null: false t.index ["attachment_id"], name: "index_alchemy_essence_videos_on_attachment_id" end @@ -300,6 +301,7 @@ t.datetime "legacy_public_on" t.datetime "legacy_public_until" t.datetime "locked_at" + t.boolean "searchable", default: true, null: false t.index ["creator_id"], name: "index_alchemy_pages_on_creator_id" t.index ["language_id"], name: "index_alchemy_pages_on_language_id" t.index ["locked_at", "locked_by"], name: "index_alchemy_pages_on_locked_at_and_locked_by" @@ -390,7 +392,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" diff --git a/spec/lib/search_spec.rb b/spec/lib/search_spec.rb index 22c895b..fb87f8b 100644 --- a/spec/lib/search_spec.rb +++ b/spec/lib/search_spec.rb @@ -140,6 +140,28 @@ end end end + + context 'page searchable' do + let(:searchable) { true } + let!(:page) { create(:alchemy_page, :public, name: "Searchable Page", searchable: searchable) } + let(:result) { Alchemy::PgSearch::Search.search "searchable" } + + before do + Alchemy::PgSearch::Search.rebuild + end + + it 'should find one page' do + expect(result.length).to eq(1) + end + + context 'searchable disabled' do + let(:searchable) { false } + + it 'should not find any page' do + expect(result.length).to eq(0) + end + end + end end context 'search' do