From 52e5c07948c4c91b73062846e1f19ea278ec0e24 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 26 Sep 2021 05:46:13 +0200 Subject: Change routing paths to use usernames in web UI (#16171) --- app/lib/permalink_redirector.rb | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 app/lib/permalink_redirector.rb (limited to 'app/lib') diff --git a/app/lib/permalink_redirector.rb b/app/lib/permalink_redirector.rb new file mode 100644 index 000000000..e48bce060 --- /dev/null +++ b/app/lib/permalink_redirector.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +class PermalinkRedirector + include RoutingHelper + + def initialize(path) + @path = path + end + + def redirect_path + if path_segments[0] == 'web' + if path_segments[1].present? && path_segments[1].start_with?('@') && path_segments[2] =~ /\d/ + find_status_url_by_id(path_segments[2]) + elsif path_segments[1].present? && path_segments[1].start_with?('@') + find_account_url_by_name(path_segments[1]) + elsif path_segments[1] == 'statuses' && path_segments[2] =~ /\d/ + find_status_url_by_id(path_segments[2]) + elsif path_segments[1] == 'accounts' && path_segments[2] =~ /\d/ + find_account_url_by_id(path_segments[2]) + elsif path_segments[1] == 'timelines' && path_segments[2] == 'tag' && path_segments[3].present? + find_tag_url_by_name(path_segments[3]) + elsif path_segments[1] == 'tags' && path_segments[2].present? + find_tag_url_by_name(path_segments[2]) + end + end + end + + private + + def path_segments + @path_segments ||= @path.gsub(/\A\//, '').split('/') + end + + def find_status_url_by_id(id) + status = Status.find_by(id: id) + + return unless status&.distributable? + + ActivityPub::TagManager.instance.url_for(status) + end + + def find_account_url_by_id(id) + account = Account.find_by(id: id) + + return unless account + + ActivityPub::TagManager.instance.url_for(account) + end + + def find_account_url_by_name(name) + username, domain = name.gsub(/\A@/, '').split('@') + domain = nil if TagManager.instance.local_domain?(domain) + account = Account.find_remote(username, domain) + + return unless account + + ActivityPub::TagManager.instance.url_for(account) + end + + def find_tag_url_by_name(name) + tag_path(CGI.unescape(name)) + end +end -- cgit