v0.2 Brand new plugin
This commit is contained in:
		@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					A custom Federated Computer plugin to redirect legacy Gossamer Forums URLs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										75
									
								
								plugin.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								plugin.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					# 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.2
 | 
				
			||||||
 | 
					# authors: saint@federated.computer
 | 
				
			||||||
 | 
					# url: https://gitea.federated.computer/saint/discourse-legacy_links.git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# require 'digest'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# enabled_site_setting :discourse_legacy_routing_enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# after_initialize do
 | 
				
			||||||
 | 
					after_initialize do
 | 
				
			||||||
 | 
					  module ::DiscourseCustomRouting
 | 
				
			||||||
 | 
					    class Engine < ::Rails::Engine
 | 
				
			||||||
 | 
					      engine_name "discourse_custom_routing"
 | 
				
			||||||
 | 
					      isolate_namespace DiscourseCustomRouting
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Define the custom controller
 | 
				
			||||||
 | 
					    class CustomPostController < ::ApplicationController
 | 
				
			||||||
 | 
					      # Match URLs that include a post_id at the end or query parameter
 | 
				
			||||||
 | 
					      def index
 | 
				
			||||||
 | 
					        post_id = extract_post_id_from_request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if post_id
 | 
				
			||||||
 | 
					          post = find_post_by_custom_field(post_id)
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					          if post
 | 
				
			||||||
 | 
					            # Redirect to the post URL if found
 | 
				
			||||||
 | 
					            redirect_to post_url(post)
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            # Return 404 if the post is not found
 | 
				
			||||||
 | 
					            render plain: 'Post not found', status: 404
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          # Handle cases where the post_id cannot be extracted
 | 
				
			||||||
 | 
					          render plain: 'Invalid URL', status: 400
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def extract_post_id_from_request
 | 
				
			||||||
 | 
					        # Extract post_id from various URL formats
 | 
				
			||||||
 | 
					        if params[:post_id]
 | 
				
			||||||
 | 
					          params[:post_id].to_i
 | 
				
			||||||
 | 
					        elsif request.path.match(%r{/forum/[^/]+/P(\d+)/})
 | 
				
			||||||
 | 
					          $1.to_i
 | 
				
			||||||
 | 
					        elsif request.query_string.match(/post=(\d+)/)
 | 
				
			||||||
 | 
					          $1.to_i
 | 
				
			||||||
 | 
					        elsif request.query_string.match(/parent_post_id=(\d+)/)
 | 
				
			||||||
 | 
					          $1.to_i
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          nil
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def find_post_by_custom_field(post_id)
 | 
				
			||||||
 | 
					        # Find the post with the specified custom field
 | 
				
			||||||
 | 
					        Post.joins(:topic_custom_fields)
 | 
				
			||||||
 | 
					            .where(topic_custom_fields: { name: 'original_gossamer_id', value: post_id.to_s })
 | 
				
			||||||
 | 
					            .first
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Register custom routes
 | 
				
			||||||
 | 
					    Discourse::Application.routes.append do
 | 
				
			||||||
 | 
					      get '/forum/*path' => 'custom_post#index'
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
		Reference in New Issue
	
	Block a user