diff --git a/app/controllers/media_assets_controller.rb b/app/controllers/media_assets_controller.rb index f7d503ac2..2f668e457 100644 --- a/app/controllers/media_assets_controller.rb +++ b/app/controllers/media_assets_controller.rb @@ -3,6 +3,8 @@ class MediaAssetsController < ApplicationController respond_to :html, :json, :xml + rate_limit :image, rate: 5.0/1.seconds, burst: 50 + def index @limit = params.fetch(:limit, CurrentUser.user.per_page).to_i.clamp(0, PostSets::Post::MAX_PER_PAGE) @preview_size = params[:size].presence || cookies[:post_preview_size].presence || MediaAssetGalleryComponent::DEFAULT_SIZE @@ -33,4 +35,12 @@ class MediaAssetsController < ApplicationController respond_with(@media_asset) end end + + def image + media_asset = authorize MediaAsset.find(params[:media_asset_id]) + variant = media_asset.variant(params[:variant]) + raise ActiveRecord::RecordNotFound if variant.nil? + + redirect_to variant.file_url + end end diff --git a/app/policies/media_asset_policy.rb b/app/policies/media_asset_policy.rb index 05e57eefd..6b704ea37 100644 --- a/app/policies/media_asset_policy.rb +++ b/app/policies/media_asset_policy.rb @@ -5,6 +5,10 @@ class MediaAssetPolicy < ApplicationPolicy true end + def image? + can_see_image? + end + def can_see_image? record.post.blank? || record.post.visible?(user) end diff --git a/config/routes.rb b/config/routes.rb index 23a618ff9..8ffb5d8e3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -146,7 +146,9 @@ Rails.application.routes.draw do get :check, to: redirect {|path_params, req| "/iqdb_queries?#{req.query_string}"} end end - resources :media_assets, only: [:index, :show] + resources :media_assets, only: [:index, :show] do + get "/:variant", to: "media_assets#image", as: :image + end resources :media_metadata, only: [:index] resources :ai_tags, only: [:index]