discourse-legacy_links/plugin.rb

140 lines
5.2 KiB
Ruby

# 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.12
# 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
# Match URLs that include a post_id at the end or query parameter
# Main action triggered when the route is matched.
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
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.looger.warn "[DEBUG DEBUG DEBUG DEBUG DEBUG WOW WOW WOW]"
# Discourse::Application.routes.append do
# Discourse::Application.routes.draw do
get '/test_route' => '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