From 52776887a78d61bd2b05abeb8f2419b16ccd224e Mon Sep 17 00:00:00 2001 From: James Smith Date: Wed, 14 May 2025 14:28:29 +0100 Subject: [PATCH] Allow requesting files by their original filename Allows links between files, like texture loading from glTF --- app/controllers/model_files_controller.rb | 6 +++++- config/routes.rb | 3 +++ spec/requests/model_files_spec.rb | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/controllers/model_files_controller.rb b/app/controllers/model_files_controller.rb index aa77df1f2..47916be4d 100644 --- a/app/controllers/model_files_controller.rb +++ b/app/controllers/model_files_controller.rb @@ -159,7 +159,11 @@ class ModelFilesController < ApplicationController @file = @model.model_files.find_signed!(params[:id], purpose: "download") skip_authorization else - @file = @model.model_files.find_param(params[:id]) + begin + @file = @model.model_files.find_param(params[:id]) + rescue ActiveRecord::RecordNotFound + @file = @model.model_files.find_by!(filename: [params[:filename], params[:format]].join(".")) + end authorize @file end @title = @file.name diff --git a/config/routes.rb b/config/routes.rb index d37757967..ed0092a18 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -146,4 +146,7 @@ Rails.application.routes.draw do skip_controllers :applications end resources :doorkeeper_applications, path: "/oauth/applications" + + # Fallback route for filename matching + get "/models/:model_id/model_files/*filename" => "model_files#show", :as => "model_model_files_by_filename" end diff --git a/spec/requests/model_files_spec.rb b/spec/requests/model_files_spec.rb index fb84c418d..1faea4225 100644 --- a/spec/requests/model_files_spec.rb +++ b/spec/requests/model_files_spec.rb @@ -177,5 +177,22 @@ RSpec.describe "Model Files" do expect(response).to redirect_to(model_path(model)) end end + + describe "GET /models/:model_id/model_files/:filename", :as_member do + describe "GET a model file from its filename" do + before do + create(:model_file, model: model, filename: "subfolder/test.stl") + get model_model_files_by_filename_path(model_id: model.to_param, filename: "subfolder/test", format: :stl) + end + + it "returns http success" do + expect(response).to have_http_status(:success) + end + + it "has correct MIME type" do + expect(response.media_type).to eq("model/stl") + end + end + end end end