From 65d04f681a9a58731f375d2bb08d19dba8ddaa8d Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 3 Nov 2025 15:56:25 +0100 Subject: [PATCH] DRY up the public controllers by introducing a shared base class --- .../concerns/public_card_scoped.rb | 13 ------------- .../concerns/public_collection_scoped.rb | 12 ------------ app/controllers/public/base_controller.rb | 19 +++++++++++++++++++ app/controllers/public/cards_controller.rb | 9 +-------- .../collections/columns/closeds_controller.rb | 9 +-------- .../columns/not_nows_controller.rb | 9 +-------- .../collections/columns/streams_controller.rb | 9 +-------- .../public/collections/columns_controller.rb | 14 ++++++-------- .../public/collections_controller.rb | 9 +-------- 9 files changed, 30 insertions(+), 73 deletions(-) delete mode 100644 app/controllers/concerns/public_card_scoped.rb delete mode 100644 app/controllers/concerns/public_collection_scoped.rb create mode 100644 app/controllers/public/base_controller.rb diff --git a/app/controllers/concerns/public_card_scoped.rb b/app/controllers/concerns/public_card_scoped.rb deleted file mode 100644 index 7416609ef..000000000 --- a/app/controllers/concerns/public_card_scoped.rb +++ /dev/null @@ -1,13 +0,0 @@ -module PublicCardScoped - extend ActiveSupport::Concern - - included do - before_action :set_collection_and_card - end - - private - def set_collection_and_card - @collection = Collection.find_by_published_key(params[:collection_id]) - @card = @collection.cards.find(params[:id]) - end -end diff --git a/app/controllers/concerns/public_collection_scoped.rb b/app/controllers/concerns/public_collection_scoped.rb deleted file mode 100644 index 11ecacfca..000000000 --- a/app/controllers/concerns/public_collection_scoped.rb +++ /dev/null @@ -1,12 +0,0 @@ -module PublicCollectionScoped - extend ActiveSupport::Concern - - included do - before_action :set_collection - end - - private - def set_collection - @collection = Collection.find_by_published_key(params[:collection_id] || params[:id]) - end -end diff --git a/app/controllers/public/base_controller.rb b/app/controllers/public/base_controller.rb new file mode 100644 index 000000000..4721a8d35 --- /dev/null +++ b/app/controllers/public/base_controller.rb @@ -0,0 +1,19 @@ +class Public::BaseController < ApplicationController + allow_unauthenticated_access + allow_unauthorized_access + + before_action :set_collection_and_card + before_action :set_public_cache_expiration + + layout "public" + + private + def set_collection_and_card + @collection = Collection.find_by_published_key(params[:collection_id] || params[:id]) + @card = @collection.cards.find(params[:id]) if params[:collection_id] && params[:id] + end + + def set_public_cache_expiration + expires_in 30.seconds, public: true + end +end diff --git a/app/controllers/public/cards_controller.rb b/app/controllers/public/cards_controller.rb index 50d9b1ed0..353bbf4cf 100644 --- a/app/controllers/public/cards_controller.rb +++ b/app/controllers/public/cards_controller.rb @@ -1,11 +1,4 @@ -class Public::CardsController < ApplicationController - include CachedPublicly, PublicCardScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::CardsController < Public::BaseController def show end end diff --git a/app/controllers/public/collections/columns/closeds_controller.rb b/app/controllers/public/collections/columns/closeds_controller.rb index c049785cb..f782fbc8f 100644 --- a/app/controllers/public/collections/columns/closeds_controller.rb +++ b/app/controllers/public/collections/columns/closeds_controller.rb @@ -1,11 +1,4 @@ -class Public::Collections::Columns::ClosedsController < ApplicationController - include CachedPublicly, PublicCollectionScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::Collections::Columns::ClosedsController < Public::BaseController def show set_page_and_extract_portion_from @collection.cards.closed.recently_closed_first end diff --git a/app/controllers/public/collections/columns/not_nows_controller.rb b/app/controllers/public/collections/columns/not_nows_controller.rb index d3cd2ed02..6ee68e3e7 100644 --- a/app/controllers/public/collections/columns/not_nows_controller.rb +++ b/app/controllers/public/collections/columns/not_nows_controller.rb @@ -1,11 +1,4 @@ -class Public::Collections::Columns::NotNowsController < ApplicationController - include CachedPublicly, PublicCollectionScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::Collections::Columns::NotNowsController < Public::BaseController def show set_page_and_extract_portion_from @collection.cards.postponed.reverse_chronologically.with_golden_first end diff --git a/app/controllers/public/collections/columns/streams_controller.rb b/app/controllers/public/collections/columns/streams_controller.rb index a8a2165e5..602b3d91d 100644 --- a/app/controllers/public/collections/columns/streams_controller.rb +++ b/app/controllers/public/collections/columns/streams_controller.rb @@ -1,11 +1,4 @@ -class Public::Collections::Columns::StreamsController < ApplicationController - include CachedPublicly, PublicCollectionScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::Collections::Columns::StreamsController < Public::BaseController def show set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first end diff --git a/app/controllers/public/collections/columns_controller.rb b/app/controllers/public/collections/columns_controller.rb index 6d882bc16..a615db1f3 100644 --- a/app/controllers/public/collections/columns_controller.rb +++ b/app/controllers/public/collections/columns_controller.rb @@ -1,11 +1,4 @@ -class Public::Collections::ColumnsController < ApplicationController - include CachedPublicly, PublicCollectionScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::Collections::ColumnsController < Public::BaseController before_action :set_column, only: :show def show @@ -13,6 +6,11 @@ class Public::Collections::ColumnsController < ApplicationController end private + # Unlike the other public controllers, this is using params[:id] to fetch the column + def set_collection_and_card + @collection = Collection.find_by_published_key(params[:collection_id]) + end + def set_column @column = @collection.columns.find(params[:id]) end diff --git a/app/controllers/public/collections_controller.rb b/app/controllers/public/collections_controller.rb index 18ae24022..d7e4977af 100644 --- a/app/controllers/public/collections_controller.rb +++ b/app/controllers/public/collections_controller.rb @@ -1,11 +1,4 @@ -class Public::CollectionsController < ApplicationController - include CachedPublicly, PublicCollectionScoped - - allow_unauthenticated_access only: :show - allow_unauthorized_access only: :show - - layout "public" - +class Public::CollectionsController < Public::BaseController def show set_page_and_extract_portion_from @collection.cards.awaiting_triage.latest.with_golden_first end