0
0
Fork 0

Add synchronization of remote featured tags (#19380)

* Add LIMIT of featured tag to instance API response

* Add featured_tags_collection_url to Account

* Add synchronization of remote featured tags

* Deliver update activity when updating featured tag

* Remove featured_tags_collection_url

* Revert "Add featured_tags_collection_url to Account"

This reverts commit cff349fc27b104ded2df6bb5665132dc24dab09c.

* Add hashtag sync from featured collections

* Fix tag name normalize

* Add target option to fetch featured collection

* Refactor fetch_featured_tags_collection_service

* Add LIMIT of featured tag to v1/instance API response
This commit is contained in:
Takeshi Umeda 2022-10-20 16:15:52 +09:00 committed by GitHub
parent d19c7f4a4c
commit b0e3f0312c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 148 additions and 5 deletions

View file

@ -3,10 +3,11 @@
class ActivityPub::FetchFeaturedCollectionService < BaseService
include JsonLdHelper
def call(account)
def call(account, **options)
return if account.featured_collection_url.blank? || account.suspended? || account.local?
@account = account
@options = options
@json = fetch_resource(@account.featured_collection_url, true, local_follower)
return unless supported_context?(@json)
@ -36,7 +37,15 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
end
def process_items(items)
process_note_items(items) if @options[:note]
process_hashtag_items(items) if @options[:hashtag]
end
def process_note_items(items)
status_ids = items.filter_map do |item|
type = item['type']
next unless type == 'Note'
uri = value_or_id(item)
next if ActivityPub::TagManager.instance.local_uri?(uri)
@ -67,6 +76,26 @@ class ActivityPub::FetchFeaturedCollectionService < BaseService
end
end
def process_hashtag_items(items)
names = items.filter_map { |item| item['type'] == 'Hashtag' && item['name']&.delete_prefix('#') }.map { |name| HashtagNormalizer.new.normalize(name) }
to_remove = []
to_add = names
FeaturedTag.where(account: @account).map(&:name).each do |name|
if names.include?(name)
to_add.delete(name)
else
to_remove << name
end
end
FeaturedTag.includes(:tag).where(account: @account, tags: { name: to_remove }).delete_all unless to_remove.empty?
to_add.each do |name|
FeaturedTag.create!(account: @account, name: name)
end
end
def local_follower
return @local_follower if defined?(@local_follower)