Unverified Commit 6f812a5b authored by cmrd Senya's avatar cmrd Senya Committed by Benjamin Neff
Browse files

Add LinksController

LinksController redirects requests for provided diaspora:// links to
respective entities urls.
parent 2e0b3826
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
# frozen_string_literal: true

class LinksController < ApplicationController
  def resolve
    entity = DiasporaLinkService.new(query).find_or_fetch_entity
    raise ActiveRecord::RecordNotFound if entity.nil?

    redirect_to url_for(entity)
  end

  private

  def query
    @query ||= params.fetch(:q)
  end
end
+1 −2
Original line number Original line Diff line number Diff line
@@ -22,8 +22,7 @@ class Reference < ApplicationRecord
    private
    private


    def add_reference(author, type, guid)
    def add_reference(author, type, guid)
      class_name = DiasporaFederation::Entity.entity_class(type).to_s.rpartition("::").last
      entity = Diaspora::EntityFinder.new(type, guid).find
      entity = Diaspora::Federation::Mappings.model_class_for(class_name).find_by(guid: guid)
      references.find_or_create_by(target: entity) if entity&.diaspora_handle == author
      references.find_or_create_by(target: entity) if entity&.diaspora_handle == author
    rescue => e # rubocop:disable Lint/RescueWithoutErrorClass
    rescue => e # rubocop:disable Lint/RescueWithoutErrorClass
      logger.warn "ignoring invalid diaspora-url: diaspora://#{author}/#{type}/#{guid}: #{e.class}: #{e.message}"
      logger.warn "ignoring invalid diaspora-url: diaspora://#{author}/#{type}/#{guid}: #{e.class}: #{e.message}"
+45 −0
Original line number Original line Diff line number Diff line
# frozen_string_literal: true

# Encapsulates logic of processing diaspora:// links
class DiasporaLinkService
  attr_reader :type, :author, :guid

  def initialize(link)
    @link = link.dup
    parse
  end

  def find_or_fetch_entity
    entity_finder.find || fetch_entity
  end

  private

  attr_accessor :link

  def fetch_entity
    DiasporaFederation::Federation::Fetcher.fetch_public(author, type, guid)
    entity_finder.find
  rescue DiasporaFederation::Federation::Fetcher::NotFetchable
    nil
  end

  def entity_finder
    @entity_finder ||= Diaspora::EntityFinder.new(type, guid)
  end

  def normalize
    link.gsub!(%r{^web\+diaspora://}, "diaspora://") ||
      link.gsub!(%r{^//}, "diaspora://") ||
      %r{^diaspora://}.match(link) ||
      self.link = "diaspora://#{link}"
  end

  def parse
    normalize
    match = DiasporaFederation::Federation::DiasporaUrlParser::DIASPORA_URL_REGEX.match(link)
    @author = match[1]
    @type = match[2]
    @guid = match[3]
  end
end
+2 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,8 @@ Rails.application.routes.draw do
	#Search
	#Search
	get 'search' => "search#search"
	get 'search' => "search#search"


  get "link" => "links#resolve"

  resources :conversations, except: %i(edit update destroy)  do
  resources :conversations, except: %i(edit update destroy)  do
    resources :messages, only: %i(create)
    resources :messages, only: %i(create)
    delete 'visibility' => 'conversation_visibilities#destroy'
    delete 'visibility' => 'conversation_visibilities#destroy'
+22 −0
Original line number Original line Diff line number Diff line
# frozen_string_literal: true

module Diaspora
  class EntityFinder
    def initialize(type, guid)
      @type = type
      @guid = guid
    end

    def class_name
      @class_name ||= DiasporaFederation::Entity.entity_class(type).to_s.rpartition("::").last
    end

    def find
      Diaspora::Federation::Mappings.model_class_for(class_name).find_by(guid: guid)
    end

    private

    attr_reader :type, :guid
  end
end
Loading