Change featured tag updates to add/remove activity (#19409)
* Change featured tag updates to add/remove activity * Fix to check for the existence of feature tag * Rename service and worker * Merge AddHashtagSerializer with AddSerializer * Undo removal of sidekiq_options
This commit is contained in:
		
							parent
							
								
									73a48318a1
								
							
						
					
					
						commit
						74ead7d106
					
				
					 10 changed files with 117 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -13,14 +13,12 @@ class Api::V1::FeaturedTagsController < Api::BaseController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def create
 | 
			
		||||
    @featured_tag = current_account.featured_tags.create!(featured_tag_params)
 | 
			
		||||
    ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
 | 
			
		||||
    render json: @featured_tag, serializer: REST::FeaturedTagSerializer
 | 
			
		||||
    featured_tag = CreateFeaturedTagService.new.call(current_account, featured_tag_params[:name])
 | 
			
		||||
    render json: featured_tag, serializer: REST::FeaturedTagSerializer
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def destroy
 | 
			
		||||
    @featured_tag.destroy!
 | 
			
		||||
    ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
 | 
			
		||||
    RemoveFeaturedTagWorker.perform_async(current_account.id, @featured_tag.id)
 | 
			
		||||
    render_empty
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,10 +10,8 @@ class Settings::FeaturedTagsController < Settings::BaseController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def create
 | 
			
		||||
    @featured_tag = current_account.featured_tags.new(featured_tag_params)
 | 
			
		||||
 | 
			
		||||
    if @featured_tag.save
 | 
			
		||||
      ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
 | 
			
		||||
    if !featured_tag_exists?
 | 
			
		||||
      CreateFeaturedTagService.new.call(current_account, featured_tag_params[:name])
 | 
			
		||||
      redirect_to settings_featured_tags_path
 | 
			
		||||
    else
 | 
			
		||||
      set_featured_tags
 | 
			
		||||
| 
						 | 
				
			
			@ -24,13 +22,16 @@ class Settings::FeaturedTagsController < Settings::BaseController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def destroy
 | 
			
		||||
    @featured_tag.destroy!
 | 
			
		||||
    ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
 | 
			
		||||
    RemoveFeaturedTagWorker.perform_async(current_account.id, @featured_tag.id)
 | 
			
		||||
    redirect_to settings_featured_tags_path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def featured_tag_exists?
 | 
			
		||||
    current_account.featured_tags.by_name(featured_tag_params[:name]).exists?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_featured_tag
 | 
			
		||||
    @featured_tag = current_account.featured_tags.find(params[:id])
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,10 @@ class FeaturedTag < ApplicationRecord
 | 
			
		|||
 | 
			
		||||
  LIMIT = 10
 | 
			
		||||
 | 
			
		||||
  def sign?
 | 
			
		||||
    true
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def name
 | 
			
		||||
    tag_id.present? ? tag.name : @name
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,29 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::AddSerializer < ActivityPub::Serializer
 | 
			
		||||
  class UriSerializer < ActiveModel::Serializer
 | 
			
		||||
    include RoutingHelper
 | 
			
		||||
 | 
			
		||||
    def serializable_hash(*_args)
 | 
			
		||||
      ActivityPub::TagManager.instance.uri_for(object)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.serializer_for(model, options)
 | 
			
		||||
    case model.class.name
 | 
			
		||||
    when 'Status'
 | 
			
		||||
      UriSerializer
 | 
			
		||||
    when 'FeaturedTag'
 | 
			
		||||
      ActivityPub::HashtagSerializer
 | 
			
		||||
    else
 | 
			
		||||
      super
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  attributes :type, :actor, :target
 | 
			
		||||
  attribute :proper_object, key: :object
 | 
			
		||||
  has_one :proper_object, key: :object
 | 
			
		||||
 | 
			
		||||
  def type
 | 
			
		||||
    'Add'
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +34,7 @@ class ActivityPub::AddSerializer < ActivityPub::Serializer
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def proper_object
 | 
			
		||||
    ActivityPub::TagManager.instance.uri_for(object)
 | 
			
		||||
    object
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def target
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::HashtagSerializer < ActivityPub::Serializer
 | 
			
		||||
  context_extensions :hashtag
 | 
			
		||||
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  attributes :type, :href, :name
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,29 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::RemoveSerializer < ActivityPub::Serializer
 | 
			
		||||
  class UriSerializer < ActiveModel::Serializer
 | 
			
		||||
    include RoutingHelper
 | 
			
		||||
 | 
			
		||||
    def serializable_hash(*_args)
 | 
			
		||||
      ActivityPub::TagManager.instance.uri_for(object)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.serializer_for(model, options)
 | 
			
		||||
    case model.class.name
 | 
			
		||||
    when 'Status'
 | 
			
		||||
      UriSerializer
 | 
			
		||||
    when 'FeaturedTag'
 | 
			
		||||
      ActivityPub::HashtagSerializer
 | 
			
		||||
    else
 | 
			
		||||
      super
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  attributes :type, :actor, :target
 | 
			
		||||
  attribute :proper_object, key: :object
 | 
			
		||||
  has_one :proper_object, key: :object
 | 
			
		||||
 | 
			
		||||
  def type
 | 
			
		||||
    'Remove'
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +34,7 @@ class ActivityPub::RemoveSerializer < ActivityPub::Serializer
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def proper_object
 | 
			
		||||
    ActivityPub::TagManager.instance.uri_for(object)
 | 
			
		||||
    object
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def target
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								app/services/create_featured_tag_service.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/services/create_featured_tag_service.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class CreateFeaturedTagService < BaseService
 | 
			
		||||
  include Payloadable
 | 
			
		||||
 | 
			
		||||
  def call(account, name)
 | 
			
		||||
    @account = account
 | 
			
		||||
 | 
			
		||||
    FeaturedTag.create!(account: account, name: name).tap do |featured_tag|
 | 
			
		||||
      ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
 | 
			
		||||
    end
 | 
			
		||||
  rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
    FeaturedTag.by_name(name).find_by!(account: account)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def build_json(featured_tag)
 | 
			
		||||
    Oj.dump(serialize_payload(featured_tag, ActivityPub::AddSerializer, signer: @account))
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										18
									
								
								app/services/remove_featured_tag_service.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								app/services/remove_featured_tag_service.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class RemoveFeaturedTagService < BaseService
 | 
			
		||||
  include Payloadable
 | 
			
		||||
 | 
			
		||||
  def call(account, featured_tag)
 | 
			
		||||
    @account = account
 | 
			
		||||
 | 
			
		||||
    featured_tag.destroy!
 | 
			
		||||
    ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def build_json(featured_tag)
 | 
			
		||||
    Oj.dump(serialize_payload(featured_tag, ActivityPub::RemoveSerializer, signer: @account))
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class ActivityPub::AccountRawDistributionWorker < ActivityPub::RawDistributionWorker
 | 
			
		||||
  protected
 | 
			
		||||
 | 
			
		||||
  def inboxes
 | 
			
		||||
    @inboxes ||= AccountReachFinder.new(@account).inboxes
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										11
									
								
								app/workers/remove_featured_tag_worker.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/workers/remove_featured_tag_worker.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class RemoveFeaturedTagWorker
 | 
			
		||||
  include Sidekiq::Worker
 | 
			
		||||
 | 
			
		||||
  def perform(account_id, featured_tag_id)
 | 
			
		||||
    RemoveFeaturedTagService.new.call(Account.find(account_id), FeaturedTag.find(featured_tag_id))
 | 
			
		||||
  rescue ActiveRecord::RecordNotFound
 | 
			
		||||
    true
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in a new issue