77 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class PermalinkRedirector
 | |
|   include RoutingHelper
 | |
| 
 | |
|   def initialize(path)
 | |
|     @path = path
 | |
|   end
 | |
| 
 | |
|   def redirect_path
 | |
|     if at_username_status_request? || statuses_status_request?
 | |
|       find_status_url_by_id(second_segment)
 | |
|     elsif at_username_request?
 | |
|       find_account_url_by_name(first_segment)
 | |
|     elsif accounts_request? && record_integer_id_request?
 | |
|       find_account_url_by_id(second_segment)
 | |
|     elsif @path.start_with?('/deck')
 | |
|       @path.delete_prefix('/deck')
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def at_username_status_request?
 | |
|     at_username_request? && record_integer_id_request?
 | |
|   end
 | |
| 
 | |
|   def statuses_status_request?
 | |
|     statuses_request? && record_integer_id_request?
 | |
|   end
 | |
| 
 | |
|   def at_username_request?
 | |
|     first_segment.present? && first_segment.start_with?('@')
 | |
|   end
 | |
| 
 | |
|   def statuses_request?
 | |
|     first_segment == 'statuses'
 | |
|   end
 | |
| 
 | |
|   def accounts_request?
 | |
|     first_segment == 'accounts'
 | |
|   end
 | |
| 
 | |
|   def record_integer_id_request?
 | |
|     second_segment =~ /\d/
 | |
|   end
 | |
| 
 | |
|   def first_segment
 | |
|     path_segments.first
 | |
|   end
 | |
| 
 | |
|   def second_segment
 | |
|     path_segments.second
 | |
|   end
 | |
| 
 | |
|   def path_segments
 | |
|     @path_segments ||= @path.delete_prefix('/deck').delete_prefix('/').split('/')
 | |
|   end
 | |
| 
 | |
|   def find_status_url_by_id(id)
 | |
|     status = Status.find_by(id: id)
 | |
|     ActivityPub::TagManager.instance.url_for(status) if status&.distributable? && !status.account.local?
 | |
|   end
 | |
| 
 | |
|   def find_account_url_by_id(id)
 | |
|     account = Account.find_by(id: id)
 | |
|     ActivityPub::TagManager.instance.url_for(account) if account.present? && !account.local?
 | |
|   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)
 | |
| 
 | |
|     ActivityPub::TagManager.instance.url_for(account) if account.present? && !account.local?
 | |
|   end
 | |
| end
 |