mastodon/app/services/process_links_service.rb
Shlee 1f84b98292
Some checks failed
Check i18n / check-i18n (push) Waiting to run
Chromatic / Check for relevant changes (push) Waiting to run
Chromatic / Run Chromatic (push) Blocked by required conditions
CodeQL / Analyze (actions) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Crowdin / Upload translations / upload-translations (push) Waiting to run
Check formatting / lint (push) Waiting to run
JavaScript Linting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
JavaScript Testing / test (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Waiting to run
Historical data migration test / test (15-alpine) (push) Waiting to run
Historical data migration test / test (16-alpine) (push) Waiting to run
Historical data migration test / test (17-alpine) (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / test (3.4) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.4) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.19.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.4, docker.elastic.co/elasticsearch/elasticsearch:7.17.29) (push) Blocked by required conditions
CSS Linting / lint (push) Has been cancelled
Follow up to #38711 - support instances running on subdomains (#39379)
2026-06-11 13:58:19 +00:00

57 lines
1.8 KiB
Ruby

# frozen_string_literal: true
class ProcessLinksService < BaseService
include Payloadable
# Scan status for links to ActivityPub objects and attach them to statuses
# @param [Status] status
def call(status)
return unless status.local?
@status = status
@previous_objects = @status.tagged_objects.includes(:object).to_a
@current_objects = []
Status.transaction do
scan_text!
assign_tagged_objects!
end
end
private
def scan_text!
urls = @status.text.scan(FetchLinkCardService::URL_PATTERN).map { |array| Addressable::URI.parse(array[1]).normalize }
domains = urls.map(&:host).uniq
valid_domains = Instance.searchable.where(domain: domains).pluck(:domain)
urls.each do |url|
# We only support `FeaturedCollection` at this time
object = ActivityPub::TagManager.instance.uri_to_resource(url.to_s, Collection)
object ||= ResolveURLService.new.call(url.to_s) if valid_domains.include?(url.host)
next unless object.is_a?(Collection)
tagged_object = @previous_objects.find { |x| x.object == object || x.uri == url }
tagged_object ||= @current_objects.find { |x| x.object == object || x.uri == url }
tagged_object ||= @status.tagged_objects.new(object: object, ap_type: 'FeaturedCollection', uri: ActivityPub::TagManager.instance.uri_for(object))
@current_objects << tagged_object
end
end
def assign_tagged_objects!
return unless @status.persisted?
@current_objects.each do |object|
object.save if object.new_record?
end
# If previous objects are no longer contained in the text, remove them to lighten the database
removed_objects = @previous_objects - @current_objects
TaggedObject.where(id: removed_objects.map(&:id)).delete_all unless removed_objects.empty?
end
end