2024-09-06 14:06:57 +00:00
# plugins/discourse-legacy_links/plugin.rb
# frozen_string_literal: true
# name: discourse-legacy_links
# about: A plugin to handle legacy Gossamer Forums URLs
2024-09-09 03:05:00 +00:00
# version: 0.52
2024-09-06 14:06:57 +00:00
# authors: saint@federated.computer
# url: https://gitea.federated.computer/saint/discourse-legacy_links.git
2024-09-06 16:59:53 +00:00
# enabled_site_setting :discourse_legacy_links_enabled
2024-09-06 14:06:57 +00:00
2024-09-07 12:59:50 +00:00
after_initialize do
module :: DiscourseLegacyLinks
class Engine < :: Rails :: Engine
engine_name " discourse_legacy_links "
isolate_namespace DiscourseLegacyLinks
end
2024-09-09 01:54:02 +00:00
end
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
require_dependency " application_controller "
class :: DiscourseLegacyLinks :: LegacyLinksController < :: ApplicationController
skip_before_action :check_xhr , only : [ :index ]
def index2
render plain : " Legacy Links from Discourse plugin! Current user: #{ current_user & . username || 'Guest' } "
end
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
def index
Rails . logger . info ( " DiscourseLegacyLinks: Handling request for URL: #{ request . original_url } " )
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
post_id = extract_post_id_from_request
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
if post_id
Rails . logger . info ( " DiscourseLegacyLinks: Extracted post_id: #{ post_id } " )
post = find_post_by_custom_field ( post_id )
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
if post
Rails . logger . info ( " DiscourseLegacyLinks: Found matching post with id: #{ post . id } " )
redirect_to_post ( post )
else
Rails . logger . warn ( " DiscourseLegacyLinks: No matching post found for post_id: #{ post_id } " )
render_not_found
2024-09-07 12:59:50 +00:00
end
2024-09-09 01:54:02 +00:00
else
Rails . logger . warn ( " DiscourseLegacyLinks: Unable to extract post_id from request " )
render_bad_request
end
end
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
private
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
# Attempts to extract a post ID from various parts of the request
def extract_post_id_from_request
2024-09-09 02:29:04 +00:00
# post_id = params[:post_id].presence ||
# request.path.match(%r{/forum/[^/]+/P(\d+)/?})&.[](1) ||
# request.query_string.match(/post=(\d+)/)&.[](1) ||
# request.query_string.match(/parent_post_id=(\d+)/)&.[](1)
# post_id = params[:post_id].presence ||
# request.path.match(%r{/P(\d+)/?})&. || # Matches URLs like /P40796/
# request.path.match(%r{/forum/ || # Matches URLs like /forum/.../P6751045/
# request.query_string.match(/post=(\d+)/)&. || # Matches URLs with ?post= in query string
# request.query_string.match(/parent_post_id=(\d+)/)&. || # Matches URLs with ?parent_post_id= in query string
# request.path.match(%r{/forum/.*?_P(\d+)/?})&. # Matches URLs like /forum/..._P6751045/
2024-09-09 02:50:50 +00:00
# post_id = params[:post_id].presence ||
# request.path.match(%r{/P(\d+)(?:/|$)})&. || # Matches URLs like /P40796/ or /P40796 (no trailing slash)
# request.path.match(%r{/forum/.*_P(\d+)(?:/|$)})&. || # Matches URLs like /forum/.../P6751045/ or /forum/.../P6751045
# request.query_string.match(/post=(\d+)/)&. || # Matches URLs with ?post= in query string
# request.query_string.match(/parent_post_id=(\d+)/)&. # Matches URLs with ?parent_post_id= in query string
2024-09-09 03:05:00 +00:00
# post_id = params[:post_id].presence ||
# request.path.match(%r{/P(\d+)(?:/|$)})&.[](1) || # Matches URLs like /P40796/ or /P40796 (no trailing slash)
# request.path.match(%r{/forum/.*_P(\d+)(?:/|$)})&.[](1) || # Matches URLs like /forum/.../P6751045/ or /forum/.../P6751045
# request.query_string.match(/post=(\d+)/)&.[](1) || # Matches URLs with ?post= in query string
# request.query_string.match(/parent_post_id=(\d+)/)&.[](1) # Matches URLs with ?parent_post_id= in query string
2024-09-09 01:54:02 +00:00
post_id = params [ :post_id ] . presence ||
2024-09-09 03:05:00 +00:00
request . path . match ( %r{ /P( \ d+)(?:- \ d+)?(?:/|$) } ) & . [] ( 1 ) || # Matches URLs like /P40796/, /P40796, or /P40796-5/
request . path . match ( %r{ /forum/.*_P( \ d+)(?:- \ d+)?(?:/|$) } ) & . [] ( 1 ) || # Matches URLs like /forum/.../P6751045/, /forum/.../P6751045, or /forum/.../P6751045-5/
request . query_string . match ( / post=( \ d+) / ) & . [] ( 1 ) || # Matches URLs with ?post= in query string
request . query_string . match ( / parent_post_id=( \ d+) / ) & . [] ( 1 ) # Matches URLs with ?parent_post_id= in query string
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
Rails . logger . info ( " DiscourseLegacyLinks: Extracted raw post_id: #{ post_id || 'nil' } " )
post_id . to_i if post_id
end
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
# Finds a post by looking up the custom field on the associated topic
def find_post_by_custom_field ( post_id )
Rails . logger . info ( " DiscourseLegacyLinks: Searching for post with original_gossamer_id: #{ post_id } " )
2024-09-09 02:11:39 +00:00
post_custom_field = PostCustomField . find_by ( name : 'original_gossamer_id' , value : post_id . to_s )
if post_custom_field
post = post_custom_field . post
Rails . logger . info ( " DiscourseLegacyLinks: Found post with id: #{ post . id } " )
2024-09-07 12:59:50 +00:00
post
2024-09-09 01:54:02 +00:00
else
2024-09-09 02:11:39 +00:00
Rails . logger . warn ( " DiscourseLegacyLinks: No post found with original_gossamer_id: #{ post_id } " )
2024-09-09 01:54:02 +00:00
nil
2024-09-07 12:59:50 +00:00
end
2024-09-09 01:54:02 +00:00
end
2024-09-07 12:59:50 +00:00
2024-09-09 01:54:02 +00:00
# Redirects to the URL of the found post
def redirect_to_post ( post )
Rails . logger . info ( " DiscourseLegacyLinks: Redirecting to post URL: #{ post . url } " )
redirect_to post . url , status : :moved_permanently
end
# Renders a 404 Not Found response
def render_not_found
Rails . logger . info ( " DiscourseLegacyLinks: Rendering 404 Not Found " )
render plain : 'Post not found' , status : :not_found
end
# Renders a 400 Bad Request response
def render_bad_request
Rails . logger . info ( " DiscourseLegacyLinks: Rendering 400 Bad Request " )
render plain : 'Invalid URL' , status : :bad_request
2024-09-07 12:59:50 +00:00
end
2024-09-07 16:04:38 +00:00
end
2024-09-08 23:44:38 +00:00
2024-09-09 01:54:02 +00:00
# Rails.logger.info("DiscourseLegacyLinks: initialistaion")
DiscourseLegacyLinks :: Engine . routes . draw do
2024-09-09 02:01:00 +00:00
get " /forum " = > " legacy_links # index "
get " /forum/*path " = > " legacy_links # index "
2024-09-09 01:54:02 +00:00
end
2024-09-08 23:44:38 +00:00
2024-09-09 01:54:02 +00:00
Discourse :: Application . routes . append do
mount :: DiscourseLegacyLinks :: Engine , at : " / "
end
2024-09-06 14:06:57 +00:00
end
2024-09-06 14:51:22 +00:00