Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow explicit loading of ActiveStorage routes #51716

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
83 changes: 1 addition & 82 deletions activestorage/config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,84 +1,3 @@
# frozen_string_literal: true

Rails.application.routes.draw do
scope ActiveStorage.routes_prefix do
get "/blobs/redirect/:signed_id/*filename" => "active_storage/blobs/redirect#show", as: :rails_service_blob
get "/blobs/proxy/:signed_id/*filename" => "active_storage/blobs/proxy#show", as: :rails_service_blob_proxy
get "/blobs/:signed_id/*filename" => "active_storage/blobs/redirect#show"

get "/representations/redirect/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/redirect#show", as: :rails_blob_representation
get "/representations/proxy/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/proxy#show", as: :rails_blob_representation_proxy
get "/representations/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/redirect#show"

get "/disk/:encoded_key/*filename" => "active_storage/disk#show", as: :rails_disk_service
put "/disk/:encoded_token" => "active_storage/disk#update", as: :update_rails_disk_service
post "/direct_uploads" => "active_storage/direct_uploads#create", as: :rails_direct_uploads
end

direct :rails_representation do |representation, options|
route_for(ActiveStorage.resolve_model_to_route, representation, options)
end

resolve("ActiveStorage::Variant") { |variant, options| route_for(ActiveStorage.resolve_model_to_route, variant, options) }
resolve("ActiveStorage::VariantWithRecord") { |variant, options| route_for(ActiveStorage.resolve_model_to_route, variant, options) }
resolve("ActiveStorage::Preview") { |preview, options| route_for(ActiveStorage.resolve_model_to_route, preview, options) }

direct :rails_blob do |blob, options|
route_for(ActiveStorage.resolve_model_to_route, blob, options)
end

resolve("ActiveStorage::Blob") { |blob, options| route_for(ActiveStorage.resolve_model_to_route, blob, options) }
resolve("ActiveStorage::Attachment") { |attachment, options| route_for(ActiveStorage.resolve_model_to_route, attachment.blob, options) }

direct :rails_storage_proxy do |model, options|
expires_in = options.delete(:expires_in) { ActiveStorage.urls_expire_in }
expires_at = options.delete(:expires_at)

if model.respond_to?(:signed_id)
route_for(
:rails_service_blob_proxy,
model.signed_id(expires_in: expires_in, expires_at: expires_at),
model.filename,
options
)
else
signed_blob_id = model.blob.signed_id(expires_in: expires_in, expires_at: expires_at)
variation_key = model.variation.key
filename = model.blob.filename

route_for(
:rails_blob_representation_proxy,
signed_blob_id,
variation_key,
filename,
options
)
end
end

direct :rails_storage_redirect do |model, options|
expires_in = options.delete(:expires_in) { ActiveStorage.urls_expire_in }
expires_at = options.delete(:expires_at)

if model.respond_to?(:signed_id)
route_for(
:rails_service_blob,
model.signed_id(expires_in: expires_in, expires_at: expires_at),
model.filename,
options
)
else
signed_blob_id = model.blob.signed_id(expires_in: expires_in, expires_at: expires_at)
variation_key = model.variation.key
filename = model.blob.filename

route_for(
:rails_blob_representation,
signed_blob_id,
variation_key,
filename,
options
)
end
end
end if ActiveStorage.draw_routes
Rails.application.routes.draw { ActiveStorage::Routes.draw(self) } if ActiveStorage.draw_routes
1 change: 1 addition & 0 deletions activestorage/lib/active_storage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ module ActiveStorage
autoload :Service
autoload :Previewer
autoload :Analyzer
autoload :Routes

mattr_accessor :logger
mattr_accessor :verifier
Expand Down
90 changes: 90 additions & 0 deletions activestorage/lib/active_storage/routes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# frozen_string_literal: true

module ActiveStorage
module Routes
def self.draw(route_set)
route_set.instance_eval do
scope ActiveStorage.routes_prefix do
get "/blobs/redirect/:signed_id/*filename" => "active_storage/blobs/redirect#show", as: :rails_service_blob
get "/blobs/proxy/:signed_id/*filename" => "active_storage/blobs/proxy#show", as: :rails_service_blob_proxy
get "/blobs/:signed_id/*filename" => "active_storage/blobs/redirect#show"

get "/representations/redirect/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/redirect#show", as: :rails_blob_representation
get "/representations/proxy/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/proxy#show", as: :rails_blob_representation_proxy
get "/representations/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/redirect#show"

get "/disk/:encoded_key/*filename" => "active_storage/disk#show", as: :rails_disk_service
put "/disk/:encoded_token" => "active_storage/disk#update", as: :update_rails_disk_service
post "/direct_uploads" => "active_storage/direct_uploads#create", as: :rails_direct_uploads
end

direct :rails_representation do |representation, options|
route_for(ActiveStorage.resolve_model_to_route, representation, options)
end

resolve("ActiveStorage::Variant") { |variant, options| route_for(ActiveStorage.resolve_model_to_route, variant, options) }
resolve("ActiveStorage::VariantWithRecord") { |variant, options| route_for(ActiveStorage.resolve_model_to_route, variant, options) }
resolve("ActiveStorage::Preview") { |preview, options| route_for(ActiveStorage.resolve_model_to_route, preview, options) }

direct :rails_blob do |blob, options|
route_for(ActiveStorage.resolve_model_to_route, blob, options)
end

resolve("ActiveStorage::Blob") { |blob, options| route_for(ActiveStorage.resolve_model_to_route, blob, options) }
resolve("ActiveStorage::Attachment") { |attachment, options| route_for(ActiveStorage.resolve_model_to_route, attachment.blob, options) }

direct :rails_storage_proxy do |model, options|
expires_in = options.delete(:expires_in) { ActiveStorage.urls_expire_in }
expires_at = options.delete(:expires_at)

if model.respond_to?(:signed_id)
route_for(
:rails_service_blob_proxy,
model.signed_id(expires_in: expires_in, expires_at: expires_at),
model.filename,
options
)
else
signed_blob_id = model.blob.signed_id(expires_in: expires_in, expires_at: expires_at)
variation_key = model.variation.key
filename = model.blob.filename

route_for(
:rails_blob_representation_proxy,
signed_blob_id,
variation_key,
filename,
options
)
end
end

direct :rails_storage_redirect do |model, options|
expires_in = options.delete(:expires_in) { ActiveStorage.urls_expire_in }
expires_at = options.delete(:expires_at)

if model.respond_to?(:signed_id)
route_for(
:rails_service_blob,
model.signed_id(expires_in: expires_in, expires_at: expires_at),
model.filename,
options
)
else
signed_blob_id = model.blob.signed_id(expires_in: expires_in, expires_at: expires_at)
variation_key = model.variation.key
filename = model.blob.filename

route_for(
:rails_blob_representation,
signed_blob_id,
variation_key,
filename,
options
)
end
end
end
end
end
end
18 changes: 9 additions & 9 deletions railties/test/commands/routes_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -340,55 +340,55 @@ class Rails::Command::RoutesTest < ActiveSupport::TestCase
Verb | GET
URI | /rails/active_storage/blobs/redirect/:signed_id/*filename(.:format)
Controller#Action | active_storage/blobs/redirect#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:5
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:8
--[ Route 17 ]-------------
Prefix | rails_service_blob_proxy
Verb | GET
URI | /rails/active_storage/blobs/proxy/:signed_id/*filename(.:format)
Controller#Action | active_storage/blobs/proxy#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:6
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:9
--[ Route 18 ]-------------
Prefix |#{" "}
Verb | GET
URI | /rails/active_storage/blobs/:signed_id/*filename(.:format)
Controller#Action | active_storage/blobs/redirect#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:7
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:10
--[ Route 19 ]-------------
Prefix | rails_blob_representation
Verb | GET
URI | /rails/active_storage/representations/redirect/:signed_blob_id/:variation_key/*filename(.:format)
Controller#Action | active_storage/representations/redirect#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:9
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:12
--[ Route 20 ]-------------
Prefix | rails_blob_representation_proxy
Verb | GET
URI | /rails/active_storage/representations/proxy/:signed_blob_id/:variation_key/*filename(.:format)
Controller#Action | active_storage/representations/proxy#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:10
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:13
--[ Route 21 ]-------------
Prefix |#{" "}
Verb | GET
URI | /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format)
Controller#Action | active_storage/representations/redirect#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:11
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:14
--[ Route 22 ]-------------
Prefix | rails_disk_service
Verb | GET
URI | /rails/active_storage/disk/:encoded_key/*filename(.:format)
Controller#Action | active_storage/disk#show
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:13
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:16
--[ Route 23 ]-------------
Prefix | update_rails_disk_service
Verb | PUT
URI | /rails/active_storage/disk/:encoded_token(.:format)
Controller#Action | active_storage/disk#update
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:14
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:17
--[ Route 24 ]-------------
Prefix | rails_direct_uploads
Verb | POST
URI | /rails/active_storage/direct_uploads(.:format)
Controller#Action | active_storage/direct_uploads#create
Source Location | #{rails_gem_root}/activestorage/config/routes.rb:15
Source Location | #{rails_gem_root}/activestorage/lib/active_storage/routes.rb:18
MESSAGE
end

Expand Down