Add featured tag add/remove activity handler (#19408)
This commit is contained in:
		
							parent
							
								
									7c152acb2c
								
							
						
					
					
						commit
						1d34eff63f
					
				
					 3 changed files with 47 additions and 2 deletions
				
			
		|  | @ -2,12 +2,32 @@ | |||
| 
 | ||||
| class ActivityPub::Activity::Add < ActivityPub::Activity | ||||
|   def perform | ||||
|     return unless @json['target'].present? && value_or_id(@json['target']) == @account.featured_collection_url | ||||
|     return if @json['target'].blank? | ||||
| 
 | ||||
|     case value_or_id(@json['target']) | ||||
|     when @account.featured_collection_url | ||||
|       case @object['type'] | ||||
|       when 'Hashtag' | ||||
|         add_featured_tags | ||||
|       else | ||||
|         add_featured | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def add_featured | ||||
|     status = status_from_object | ||||
| 
 | ||||
|     return unless !status.nil? && status.account_id == @account.id && !@account.pinned?(status) | ||||
| 
 | ||||
|     StatusPin.create!(account: @account, status: status) | ||||
|   end | ||||
| 
 | ||||
|   def add_featured_tags | ||||
|     name = @object['name']&.delete_prefix('#') | ||||
| 
 | ||||
|     FeaturedTag.create!(account: @account, name: name) if name.present? | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -2,8 +2,22 @@ | |||
| 
 | ||||
| class ActivityPub::Activity::Remove < ActivityPub::Activity | ||||
|   def perform | ||||
|     return unless @json['target'].present? && value_or_id(@json['target']) == @account.featured_collection_url | ||||
|     return if @json['target'].blank? | ||||
| 
 | ||||
|     case value_or_id(@json['target']) | ||||
|     when @account.featured_collection_url | ||||
|       case @object['type'] | ||||
|       when 'Hashtag' | ||||
|         remove_featured_tags | ||||
|       else | ||||
|         remove_featured | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def remove_featured | ||||
|     status = status_from_uri(object_uri) | ||||
| 
 | ||||
|     return unless !status.nil? && status.account_id == @account.id | ||||
|  | @ -11,4 +25,13 @@ class ActivityPub::Activity::Remove < ActivityPub::Activity | |||
|     pin = StatusPin.find_by(account: @account, status: status) | ||||
|     pin&.destroy! | ||||
|   end | ||||
| 
 | ||||
|   def remove_featured_tags | ||||
|     name = @object['name']&.delete_prefix('#') | ||||
| 
 | ||||
|     return if name.blank? | ||||
| 
 | ||||
|     featured_tag = FeaturedTag.by_name(name).find_by(account: @account) | ||||
|     featured_tag&.destroy! | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -22,6 +22,8 @@ class FeaturedTag < ApplicationRecord | |||
|   before_create :set_tag | ||||
|   before_create :reset_data | ||||
| 
 | ||||
|   scope :by_name, ->(name) { joins(:tag).where(tag: { name: HashtagNormalizer.new.normalize(name) }) } | ||||
| 
 | ||||
|   delegate :display_name, to: :tag | ||||
| 
 | ||||
|   attr_writer :name | ||||
|  |  | |||
		Reference in a new issue