aboutsummaryrefslogtreecommitdiff
path: root/app/services/resolve_url_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/resolve_url_service.rb')
-rw-r--r--app/services/resolve_url_service.rb12
1 files changed, 11 insertions, 1 deletions
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index 78080d878..5981e4d98 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -34,7 +34,17 @@ class ResolveURLService < BaseService
# It may happen that the resource is a private toot, and thus not fetchable,
# but we can return the toot if we already know about it.
- status = Status.find_by(uri: @url) || Status.find_by(url: @url)
+ scope = Status.where(uri: @url)
+
+ # We don't have an index on `url`, so try guessing the `uri` from `url`
+ parsed_url = Addressable::URI.parse(@url)
+ parsed_url.path.match(%r{/@(?<username>#{Account::USERNAME_RE})/(?<status_id>[0-9]+)\Z}) do |matched|
+ parsed_url.path = "/users/#{matched[:username]}/statuses/#{matched[:status_id]}"
+ scope = scope.or(Status.where(uri: parsed_url.to_s, url: @url))
+ end
+
+ status = scope.first
+
authorize_with @on_behalf_of, status, :show? unless status.nil?
status
rescue Mastodon::NotPermittedError