# plugins/discourse-legacy_links/plugin.rb # frozen_string_literal: true # name: discourse-legacy_links # about: A plugin to handle legacy Gossamer Forums URLs # version: 0.19 # authors: saint@federated.computer # url: https://gitea.federated.computer/saint/discourse-legacy_links.git # require 'digest' # enabled_site_setting :discourse_legacy_links_enabled # after_initialize do after_initialize do module ::DiscourseLegacyLinks class Engine < ::Rails::Engine engine_name "discourse_legacy_links" isolate_namespace DiscourseLegacyLinks end # Define the custom controller class CustomPostController < ::ApplicationController skip_before_action :verify_authenticity_token skip_before_action :ensure_logged_in skip_before_action :redirect_to_login_if_required skip_before_action :check_xhr skip_before_action :ensure_staff def test Rails.logger.warn "[WARN WARN WARN WARN WARN WARN WARN WARN WARN WARN AMDG JMJ PAX WARN WARN WARN WARN]" render plain: 'Test route' end # Match URLs that include a post_id at the end or query parameter # Main action triggered when the route is matched. def index Rails.logger.warn "[DEBUG] Reached the index action" # Log all incoming parameters to see what's being passed Rails.logger.warn "[DEBUG] Params: #{params.inspect}" post_id = extract_post_id_from_request if post_id Rails.logger.warn "[DEBUG] Processing request for post_id: #{post_id}" post = find_post_by_custom_field(post_id) if post # Redirect to the post URL if found Rails.logger.warn "[DEBUG] Redirecting to post with ID: #{post.id}" # redirect_to post_url(post) redirect_to_post(post) else # Return 404 if the post is not found Rails.logger.warn "[ERROR] Post with original_gossamer_id #{post_id} not found" render plain: 'Post not found', status: 404 end else # Handle cases where the post_id cannot be extracted Rails.logger.warn "[ERROR] Could not extract post_id from the request" render plain: 'Invalid URL', status: 400 end end private # Extracts the post ID from the request URL or query string. # Supports various formats of legacy forum URLs. # @return [Integer, nil] The extracted post ID or nil if not found def extract_post_id_from_request # Check if post_id is passed as a query parameter (?post=post_id) if params[:post_id] post_id = params[:post_id].to_i Rails.logger.warn "[DEBUG] Extracted post_id from query param: #{post_id}" return post_id end # Check for post_id in the URL path (e.g., /forum/.../P12345/) if match = request.path.match(%r{/forum/[^/]+/P(\d+)/?}) post_id = match[1].to_i Rails.logger.warn "[DEBUG] Extracted post_id from URL path: #{post_id}" return post_id end # Check for post_id in the query string (e.g., ?post=12345) if match = request.query_string.match(/post=(\d+)/) post_id = match[1].to_i Rails.logger.warn "[DEBUG] Extracted post_id from query string (?post=): #{post_id}" return post_id end # Check for parent_post_id in the query string (e.g., ?parent_post_id=12345) if match = request.query_string.match(/parent_post_id=(\d+)/) post_id = match[1].to_i Rails.logger.warn "[DEBUG] Extracted parent_post_id from query string: #{post_id}" return post_id end # If no post_id was found in any format Rails.logger.warn "[DEBUG] Could not extract post_id from request" nil end # Finds the Discourse post that has the specified custom field value. # The custom field used is 'original_gossamer_id'. # @param post_id [Integer] The extracted Gossamer forum post ID # @return [Post, nil] The corresponding Discourse post or nil if not found def find_post_by_custom_field(post_id) Rails.logger.warn "[DEBUG] Searching for post with custom field 'original_gossamer_id' and value #{post_id}" # Use ActiveRecord query to find the post by the custom field value post = Post.joins(:topic_custom_fields) .where(topic_custom_fields: { name: 'original_gossamer_id', value: post_id.to_s }) .first if post Rails.logger.warn "[DEBUG] Found post with ID: #{post.id} for original_gossamer_id: #{post_id}" else Rails.logger.warn "[DEBUG] No post found for original_gossamer_id: #{post_id}" end post end # Redirects to the specified Discourse post. # @param post [Post] The Discourse post to redirect to def redirect_to_post(post) topic_url = "#{Discourse.base_url}/t/#{post.topic_id}/#{post.post_number}" Rails.logger.warn "[DEBUG] Redirecting to topic URL: #{topic_url}" redirect topic_url end end # Register custom routes to handle legacy URLs Rails.logger.warn "[DEBUG DEBUG DEBUG DEBUG DEBUG WOW WOW WOW]" Rails.application.routes.routes.each do |route| Rails.logger.warn "[ROUTE] #{route.path.spec}" end # Discourse::Application.routes.append do Discourse::Application.routes.prepend do # get '/forum/*path', to: 'discourse_legacy_links/custom_post#index', constraints: lambda { |req| !Permalink.exists?(url: req.path) } get '/forum/*path', to: 'discourse_legacy_links/custom_post#index', constraints: lambda { |request| Rails.logger.warn("[DEBUG] StarForum Route matched: #{request.path}") } get '/forum', to: 'discourse_legacy_links/custom_post#index', constraints: lambda { |request| Rails.logger.warn("[DEBUG] NoStarForum Route matched: #{request.path}") } get '/forum2', to: 'discourse_legacy_links/custom_post#test', constraints: lambda { |request| Rails.logger.warn("[DEBUG] TestRoute Route matched: #{request.path}") } # get '/testroute2' => 'discourse_legacy_links/custom_post#test' # get '/forum/*path' => 'discourse_legacy_links/custom_post#index' # get '/forum' => 'discourse_legacy_links/custom_post#index' end end end