You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.4 KiB

  1. # frozen_string_literal: true
  2. class ActivityPub::FetchFeaturedCollectionService < BaseService
  3. include JsonLdHelper
  4. def call(account)
  5. return if account.featured_collection_url.blank? || account.suspended? || account.local?
  6. @account = account
  7. @json = fetch_resource(@account.featured_collection_url, true)
  8. return unless supported_context?
  9. case @json['type']
  10. when 'Collection', 'CollectionPage'
  11. process_items @json['items']
  12. when 'OrderedCollection', 'OrderedCollectionPage'
  13. process_items @json['orderedItems']
  14. end
  15. end
  16. private
  17. def process_items(items)
  18. status_ids = items.map { |item| value_or_id(item) }
  19. .filter_map { |uri| ActivityPub::FetchRemoteStatusService.new.call(uri) unless ActivityPub::TagManager.instance.local_uri?(uri) }
  20. .filter_map { |status| status.id if status.account_id == @account.id }
  21. to_remove = []
  22. to_add = status_ids
  23. StatusPin.where(account: @account).pluck(:status_id).each do |status_id|
  24. if status_ids.include?(status_id)
  25. to_add.delete(status_id)
  26. else
  27. to_remove << status_id
  28. end
  29. end
  30. StatusPin.where(account: @account, status_id: to_remove).delete_all unless to_remove.empty?
  31. to_add.each do |status_id|
  32. StatusPin.create!(account: @account, status_id: status_id)
  33. end
  34. end
  35. def supported_context?
  36. super(@json)
  37. end
  38. end