about summary refs log tree commit diff
path: root/app/lib
diff options
context:
space:
mode:
authorClaire <claire.github-309c@sitedethib.com>2021-09-28 14:10:30 +0200
committerGitHub <noreply@github.com>2021-09-28 14:10:30 +0200
commit00889b313176308018d66e54b5cb7dcc92da1587 (patch)
tree2123cb37613d91a9446d9030e6d43600eea6a7e8 /app/lib
parent4b7e43602691193b5d2a8e7e0ed6044bc8ee9774 (diff)
parentc4ccbbccabf2ed6a899e3ca46fa9c2f8bf72b269 (diff)
Merge pull request #1609 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/permalink_redirector.rb63
1 files changed, 63 insertions, 0 deletions
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