diff --git a/app/models/topic_link.rb b/app/models/topic_link.rb index b89cede20b..e41b685e69 100644 --- a/app/models/topic_link.rb +++ b/app/models/topic_link.rb @@ -136,7 +136,8 @@ SQL topic_id = nil post_number = nil - if Discourse.store.has_been_uploaded?(url) + if upload = Upload.get_from_url(url) + url = upload.url internal = Discourse.store.internal? elsif route = Discourse.route_for(parsed) internal = true diff --git a/app/models/upload.rb b/app/models/upload.rb index 16f7fa71c0..349ab31fd4 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -77,28 +77,17 @@ class Upload < ActiveRecord::Base def self.get_from_url(url) return if url.blank? - # we store relative urls, so we need to remove any host/cdn - url = url.sub(Discourse.asset_host, "") if Discourse.asset_host.present? && Discourse.asset_host != SiteSetting.Upload.s3_cdn_url - # when using s3 without CDN - url = url.sub(/^https?\:/, "") if url.include?(Discourse.store.absolute_base_url) && Discourse.store.external? - # when using s3, we need to replace with the absolute base url - if SiteSetting.Upload.s3_cdn_url.present? - url = url.sub( - SiteSetting.Upload.s3_cdn_url, - SiteSetting.Upload.s3_base_url - ) - end - - # always try to get the path uri = begin URI(URI.unescape(url)) rescue URI::InvalidURIError, URI::InvalidComponentError end - url = uri.path if uri.try(:scheme) + return if uri&.path.blank? - Upload.find_by(url: url) + path = uri.path[/(\/original\/\dX\/[\/\.\w]+)/, 1] + + Upload.find_by("url LIKE ?", "%#{path}") end def self.migrate_to_new_scheme(limit = nil) diff --git a/spec/components/cooked_post_processor_spec.rb b/spec/components/cooked_post_processor_spec.rb index 57fb16c590..d099dc9aff 100644 --- a/spec/components/cooked_post_processor_spec.rb +++ b/spec/components/cooked_post_processor_spec.rb @@ -41,10 +41,10 @@ describe CookedPostProcessor do end context ".keep_reverse_index_up_to_date" do - let(:video_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.mp4') } - let(:image_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.jpg') } - let(:audio_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.ogg') } - let(:attachment_upload) { Fabricate(:upload, url: '/uploads/default/1/1234567890123456.csv') } + let(:video_upload) { Fabricate(:upload, url: '/uploads/default/original/1X/1/1234567890123456.mp4') } + let(:image_upload) { Fabricate(:upload, url: '/uploads/default/original/1X/1/1234567890123456.jpg') } + let(:audio_upload) { Fabricate(:upload, url: '/uploads/default/original/1X/1/1234567890123456.ogg') } + let(:attachment_upload) { Fabricate(:upload, url: '/uploads/default/original/1X/1/1234567890123456.csv') } let(:raw) do <<~RAW