Skip to content

Commit

Permalink
Offer mounting
Browse files Browse the repository at this point in the history
  • Loading branch information
justinko committed May 2, 2024
1 parent 28ece32 commit 180a8cf
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 82 deletions.
238 changes: 157 additions & 81 deletions activestorage/config/routes.rb
@@ -1,92 +1,168 @@
# frozen_string_literal: true

ActiveStorage::Engine.routes.draw do
get "/blobs/redirect/:signed_id/*filename" => "blobs/redirect#show", as: :service_blob
get "/blobs/proxy/:signed_id/*filename" => "blobs/proxy#show", as: :service_blob_proxy
get "/blobs/:signed_id/*filename" => "blobs/redirect#show"

get "/representations/redirect/:signed_blob_id/:variation_key/*filename" => "representations/redirect#show", as: :blob_representation
get "/representations/proxy/:signed_blob_id/:variation_key/*filename" => "representations/proxy#show", as: :blob_representation_proxy
get "/representations/:signed_blob_id/:variation_key/*filename" => "representations/redirect#show"

get "/disk/:encoded_key/*filename" => "disk#show", as: :disk_service
put "/disk/:encoded_token" => "disk#update", as: :update_disk_service
post "/direct_uploads" => "direct_uploads#create", as: :direct_uploads
end
if ActiveStorage.draw_routes
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"

Rails.application.routes.draw do
direct(:rails_service_blob) {|*args| active_storage.route_for(:service_blob, *args) }
direct(:rails_service_blob_proxy) {|*args| active_storage.route_for(:service_blob_proxy, *args) }
direct(:rails_blob_representation) {|*args| active_storage.route_for(:blob_representation, *args) }
direct(:rails_blob_representation_proxy) {|*args| active_storage.route_for(:blob_representation_proxy, *args) }
direct(:rails_disk_service) {|*args| active_storage.route_for(:disk_service, *args) }
direct(:update_rails_disk_service) {|*args| active_storage.route_for(:update_disk_service, *args) }
direct(:rails_direct_uploads) {|*args| active_storage.route_for(:direct_uploads, *args) }

direct :rails_representation do |representation, options|
route_for(ActiveStorage.resolve_model_to_route, representation, options)
end
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"

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) }
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_blob do |blob, options|
route_for(ActiveStorage.resolve_model_to_route, blob, options)
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

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)
active_storage.route_for(
: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

active_storage.route_for(
:blob_representation_proxy,
signed_blob_id,
variation_key,
filename,
options
)
route_for(
:rails_blob_representation,
signed_blob_id,
variation_key,
filename,
options
)
end
end
end
else
ActiveStorage::Engine.routes.default_scope = nil # so we can use `direct`
ActiveStorage::Engine.routes.draw do
get "/blobs/redirect/:signed_id/*filename" => "active_storage/blobs/redirect#show", as: :service_blob
get "/blobs/proxy/:signed_id/*filename" => "active_storage/blobs/proxy#show", as: :service_blob_proxy
get "/blobs/:signed_id/*filename" => "active_storage/blobs/redirect#show"

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)
active_storage.route_for(
: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

active_storage.route_for(
:blob_representation,
signed_blob_id,
variation_key,
filename,
options
)
get "/representations/redirect/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/redirect#show", as: :blob_representation
get "/representations/proxy/:signed_blob_id/:variation_key/*filename" => "active_storage/representations/proxy#show", as: :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: :disk_service
put "/disk/:encoded_token" => "active_storage/disk#update", as: :update_disk_service
post "/direct_uploads" => "active_storage/direct_uploads#create", as: :direct_uploads

direct :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 :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 :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(
: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(
:blob_representation_proxy,
signed_blob_id,
variation_key,
filename,
options
)
end
end

direct :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(
: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(
:blob_representation,
signed_blob_id,
variation_key,
filename,
options
)
end
end
end
end if ActiveStorage.draw_routes
end
2 changes: 1 addition & 1 deletion activestorage/lib/active_storage/engine.rb
Expand Up @@ -92,7 +92,7 @@ class Engine < Rails::Engine # :nodoc:
ActiveStorage.paths = app.config.active_storage.paths || {}
ActiveStorage.routes_prefix = app.config.active_storage.routes_prefix || "/rails/active_storage"
ActiveStorage.draw_routes = app.config.active_storage.draw_routes != false
ActiveStorage.resolve_model_to_route = app.config.active_storage.resolve_model_to_route || :rails_storage_redirect
ActiveStorage.resolve_model_to_route = app.config.active_storage.resolve_model_to_route || (ActiveStorage.draw_routes ? :rails_storage_redirect : :storage_redirect)

ActiveStorage.supported_image_processing_methods += app.config.active_storage.supported_image_processing_methods || []
ActiveStorage.unsupported_image_processing_arguments = app.config.active_storage.unsupported_image_processing_arguments || %w(
Expand Down

0 comments on commit 180a8cf

Please sign in to comment.