From ac3a3d4372a9e78f1b76479ef303f31daa4c1192 Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 20 Aug 2023 11:56:48 +0200 Subject: [PATCH 01/10] serialize public_on Page attribute --- app/serializers/alchemy/json_api/page_serializer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/serializers/alchemy/json_api/page_serializer.rb b/app/serializers/alchemy/json_api/page_serializer.rb index 824517e..8e94d3f 100644 --- a/app/serializers/alchemy/json_api/page_serializer.rb +++ b/app/serializers/alchemy/json_api/page_serializer.rb @@ -13,6 +13,7 @@ class PageSerializer < BaseSerializer :language_code, :meta_keywords, :meta_description, + :public_on, :created_at, :updated_at, ) From 1d3ff27092a4eef682046692126c6ae1e5687654 Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 3 Sep 2023 14:49:08 +0200 Subject: [PATCH 02/10] add public_on attribute to tests --- spec/serializers/alchemy/json_api/page_serializer_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/serializers/alchemy/json_api/page_serializer_spec.rb b/spec/serializers/alchemy/json_api/page_serializer_spec.rb index 678f9dc..7a4050f 100644 --- a/spec/serializers/alchemy/json_api/page_serializer_spec.rb +++ b/spec/serializers/alchemy/json_api/page_serializer_spec.rb @@ -32,6 +32,7 @@ expect(attributes[:language_code]).to eq("en") expect(attributes[:meta_keywords]).to eq("Meta Keywords") expect(attributes[:meta_description]).to eq("Meta Description") + expect(attributes[:public_on]).to eq(page.public_on) expect(attributes[:created_at]).to eq(page.created_at) expect(attributes[:updated_at]).to eq(page.updated_at) expect(attributes[:legacy_urls]).to eq(["/other"]) From 18002db365b445b1b1f699ec996d2f832a63e209 Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 3 Sep 2023 19:15:16 +0200 Subject: [PATCH 03/10] allow public_version association to Ransack --- app/models/alchemy/json_api/page.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/models/alchemy/json_api/page.rb b/app/models/alchemy/json_api/page.rb index 4e68668..1a960d3 100644 --- a/app/models/alchemy/json_api/page.rb +++ b/app/models/alchemy/json_api/page.rb @@ -5,6 +5,10 @@ def Page.ransackable_attributes(_auth_object = nil) super | %w[page_layout] end + def Page.ransackable_associations(_auth_object = nil) + super | %w[public_version] + end + module JsonApi class Page < SimpleDelegator attr_reader :page_version_type, :page_version From 23c21903f8d6a0d4cfef4363f5d458934d4a6b7f Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 3 Sep 2023 20:16:48 +0200 Subject: [PATCH 04/10] add sortable attributes for sorting with ransack Now pages can be sorted using public_version_public_on field key with "sort" parameter --- app/controllers/alchemy/json_api/pages_controller.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/alchemy/json_api/pages_controller.rb b/app/controllers/alchemy/json_api/pages_controller.rb index bc1aee1..8d32e08 100644 --- a/app/controllers/alchemy/json_api/pages_controller.rb +++ b/app/controllers/alchemy/json_api/pages_controller.rb @@ -5,15 +5,17 @@ module JsonApi class PagesController < JsonApi::BaseController before_action :load_page_for_cache_key, only: :show + ALLOWED_PUBLIC_VERSION_RANSACK_ATTRIBUTES = %w[public_on].map { |a| "public_version_#{a}" }.freeze + def index allowed = Alchemy::Page.ransackable_attributes jsonapi_filter(page_scope, allowed) do |filtered_pages| @pages = filtered_pages.result if !@pages.all?(&:cache_page?) - render_pages_json(allowed) && return + render_pages_json(allowed | ALLOWED_PUBLIC_VERSION_RANSACK_ATTRIBUTES) && return elsif stale?(last_modified: @pages.maximum(:published_at), etag: @pages.max_by(&:cache_key)&.cache_key) - render_pages_json(allowed) + render_pages_json(allowed | ALLOWED_PUBLIC_VERSION_RANSACK_ATTRIBUTES) end end From e8a89640e6801e02bd9b3a264b35ded5565b13b6 Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sat, 16 Sep 2023 20:41:44 +0200 Subject: [PATCH 05/10] attempt to fix Alchemy::Page monkey patching when not eager loading --- app/models/alchemy/json_api/page.rb | 10 ---------- lib/alchemy/json_api.rb | 3 +++ .../json_api/page_class_methods_extension.rb | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 lib/alchemy/json_api/page_class_methods_extension.rb diff --git a/app/models/alchemy/json_api/page.rb b/app/models/alchemy/json_api/page.rb index 1a960d3..3e3eb77 100644 --- a/app/models/alchemy/json_api/page.rb +++ b/app/models/alchemy/json_api/page.rb @@ -1,14 +1,4 @@ module Alchemy - # With Ransack 4 we need to define the attributes - # that are allowed to be searched. - def Page.ransackable_attributes(_auth_object = nil) - super | %w[page_layout] - end - - def Page.ransackable_associations(_auth_object = nil) - super | %w[public_version] - end - module JsonApi class Page < SimpleDelegator attr_reader :page_version_type, :page_version diff --git a/lib/alchemy/json_api.rb b/lib/alchemy/json_api.rb index b951893..cedd2cf 100644 --- a/lib/alchemy/json_api.rb +++ b/lib/alchemy/json_api.rb @@ -4,6 +4,9 @@ require "alchemy_cms" require "alchemy/json_api/engine" +require "alchemy/json_api/page_class_methods_extension" +Alchemy::Page.singleton_class.prepend(Alchemy::JsonApi::PageClassMethodsExtension) + module Alchemy module JsonApi # Set FastJsonapi key_transform diff --git a/lib/alchemy/json_api/page_class_methods_extension.rb b/lib/alchemy/json_api/page_class_methods_extension.rb new file mode 100644 index 0000000..581358d --- /dev/null +++ b/lib/alchemy/json_api/page_class_methods_extension.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Alchemy + module JsonApi + module PageClassMethodsExtension + def ransackable_attributes(_auth_object = nil) + super | %w[page_layout] + end + + def ransackable_associations(_auth_object = nil) + super | %w[public_version] + end + end + end +end From d8ed1f8247f5b5aad77825b8823c38ea8928844c Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sat, 16 Sep 2023 20:57:19 +0200 Subject: [PATCH 06/10] use root ns --- lib/alchemy/json_api.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/alchemy/json_api.rb b/lib/alchemy/json_api.rb index cedd2cf..829462e 100644 --- a/lib/alchemy/json_api.rb +++ b/lib/alchemy/json_api.rb @@ -5,7 +5,7 @@ require "alchemy/json_api/engine" require "alchemy/json_api/page_class_methods_extension" -Alchemy::Page.singleton_class.prepend(Alchemy::JsonApi::PageClassMethodsExtension) +::Alchemy::Page.singleton_class.prepend(Alchemy::JsonApi::PageClassMethodsExtension) module Alchemy module JsonApi From 3b23276064da428f4c80d91d8dd38b40ede4e7bc Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 17 Sep 2023 17:35:43 +0200 Subject: [PATCH 07/10] use railties to extend page --- lib/alchemy/json_api.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/alchemy/json_api.rb b/lib/alchemy/json_api.rb index 829462e..59d410e 100644 --- a/lib/alchemy/json_api.rb +++ b/lib/alchemy/json_api.rb @@ -3,9 +3,7 @@ require "fast_jsonapi" require "alchemy_cms" require "alchemy/json_api/engine" - require "alchemy/json_api/page_class_methods_extension" -::Alchemy::Page.singleton_class.prepend(Alchemy::JsonApi::PageClassMethodsExtension) module Alchemy module JsonApi @@ -27,5 +25,11 @@ def self.key_transform=(value) def self.key_transform @_key_transform || :underscore end + + class Railtie < ::Rails::Railtie + initializer "alchemy-json_api.extend_page_model" do + ::Alchemy::Page.extend(Alchemy::JsonApi::PageClassMethodsExtension) + end + end end end From 7c10066e29cdbf0f31b3b03db9d4b5bf81fe1dda Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 1 Oct 2023 11:25:08 +0200 Subject: [PATCH 08/10] another overloading attempt --- lib/alchemy/json_api.rb | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/alchemy/json_api.rb b/lib/alchemy/json_api.rb index 59d410e..38028f4 100644 --- a/lib/alchemy/json_api.rb +++ b/lib/alchemy/json_api.rb @@ -5,6 +5,22 @@ require "alchemy/json_api/engine" require "alchemy/json_api/page_class_methods_extension" +require File.expand_path('../../app/models/alchemy/page', Alchemy::Engine.called_from) + +module Alchemy + class Page < BaseRecord + class << self + def ransackable_attributes(_auth_object = nil) + super | %w[page_layout] + end + + def ransackable_associations(_auth_object = nil) + super | %w[public_version] + end + end + end +end + module Alchemy module JsonApi # Set FastJsonapi key_transform @@ -25,11 +41,5 @@ def self.key_transform=(value) def self.key_transform @_key_transform || :underscore end - - class Railtie < ::Rails::Railtie - initializer "alchemy-json_api.extend_page_model" do - ::Alchemy::Page.extend(Alchemy::JsonApi::PageClassMethodsExtension) - end - end end end From c4c6eda014d9eff4f5b25c9f25019e46c04065dd Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 1 Oct 2023 11:43:42 +0200 Subject: [PATCH 09/10] remove monkey patching to try in project --- lib/alchemy/json_api.rb | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/alchemy/json_api.rb b/lib/alchemy/json_api.rb index 38028f4..c76fb9a 100644 --- a/lib/alchemy/json_api.rb +++ b/lib/alchemy/json_api.rb @@ -5,22 +5,6 @@ require "alchemy/json_api/engine" require "alchemy/json_api/page_class_methods_extension" -require File.expand_path('../../app/models/alchemy/page', Alchemy::Engine.called_from) - -module Alchemy - class Page < BaseRecord - class << self - def ransackable_attributes(_auth_object = nil) - super | %w[page_layout] - end - - def ransackable_associations(_auth_object = nil) - super | %w[public_version] - end - end - end -end - module Alchemy module JsonApi # Set FastJsonapi key_transform From aa958973fa3f1faea060018cafb32acd2f1a9b84 Mon Sep 17 00:00:00 2001 From: Niklas Bichinger Date: Sun, 1 Oct 2023 11:51:01 +0200 Subject: [PATCH 10/10] back to old method :( --- app/models/alchemy/json_api/page.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/alchemy/json_api/page.rb b/app/models/alchemy/json_api/page.rb index 3e3eb77..1a960d3 100644 --- a/app/models/alchemy/json_api/page.rb +++ b/app/models/alchemy/json_api/page.rb @@ -1,4 +1,14 @@ module Alchemy + # With Ransack 4 we need to define the attributes + # that are allowed to be searched. + def Page.ransackable_attributes(_auth_object = nil) + super | %w[page_layout] + end + + def Page.ransackable_associations(_auth_object = nil) + super | %w[public_version] + end + module JsonApi class Page < SimpleDelegator attr_reader :page_version_type, :page_version