Federate pinned statuses over ActivityPub (#6610)
* Federate pinned statuses over ActivityPub * Display pinned toots in web UI Fix #6117 * Fix migration * Fix tests * Update outbox_serializer.rb * Update remove_serializer.rb * Update add_serializer.rb * Update fetch_featured_collection_service.rb
This commit is contained in:
		
							parent
							
								
									45feb439bd
								
							
						
					
					
						commit
						9110db41c5
					
				
					 29 changed files with 383 additions and 37 deletions
				
			
		
							
								
								
									
										57
									
								
								app/controllers/activitypub/collections_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/controllers/activitypub/collections_controller.rb
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class ActivityPub::CollectionsController < Api::BaseController | ||||
|   include SignatureVerification | ||||
| 
 | ||||
|   before_action :set_account | ||||
|   before_action :set_size | ||||
|   before_action :set_statuses | ||||
| 
 | ||||
|   def show | ||||
|     render json: collection_presenter, | ||||
|            serializer: ActivityPub::CollectionSerializer, | ||||
|            adapter: ActivityPub::Adapter, | ||||
|            content_type: 'application/activity+json', | ||||
|            skip_activities: true | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def set_account | ||||
|     @account = Account.find_local!(params[:account_username]) | ||||
|   end | ||||
| 
 | ||||
|   def set_statuses | ||||
|     @statuses = scope_for_collection.paginate_by_max_id(20, params[:max_id], params[:since_id]) | ||||
|     @statuses = cache_collection(@statuses, Status) | ||||
|   end | ||||
| 
 | ||||
|   def set_size | ||||
|     case params[:id] | ||||
|     when 'featured' | ||||
|       @account.pinned_statuses.count | ||||
|     else | ||||
|       raise ActiveRecord::NotFound | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def scope_for_collection | ||||
|     case params[:id] | ||||
|     when 'featured' | ||||
|       @account.statuses.permitted_for(@account, signed_request_account).tap do |scope| | ||||
|         scope.merge!(@account.pinned_statuses) | ||||
|       end | ||||
|     else | ||||
|       raise ActiveRecord::NotFound | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def collection_presenter | ||||
|     ActivityPub::CollectionPresenter.new( | ||||
|       id: account_collection_url(@account, params[:id]), | ||||
|       type: :ordered, | ||||
|       size: @size, | ||||
|       items: @statuses | ||||
|     ) | ||||
|   end | ||||
| end | ||||
|  | @ -9,7 +9,7 @@ class ActivityPub::OutboxesController < Api::BaseController | |||
|     @statuses = @account.statuses.permitted_for(@account, signed_request_account).paginate_by_max_id(20, params[:max_id], params[:since_id]) | ||||
|     @statuses = cache_collection(@statuses, Status) | ||||
| 
 | ||||
|     render json: outbox_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' | ||||
|     render json: outbox_presenter, serializer: ActivityPub::OutboxSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json' | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
|  |  | |||
|  | @ -11,12 +11,18 @@ class Api::V1::Statuses::PinsController < Api::BaseController | |||
| 
 | ||||
|   def create | ||||
|     StatusPin.create!(account: current_account, status: @status) | ||||
|     distribute_add_activity! | ||||
|     render json: @status, serializer: REST::StatusSerializer | ||||
|   end | ||||
| 
 | ||||
|   def destroy | ||||
|     pin = StatusPin.find_by(account: current_account, status: @status) | ||||
|     pin&.destroy! | ||||
| 
 | ||||
|     if pin | ||||
|       pin.destroy! | ||||
|       distribute_remove_activity! | ||||
|     end | ||||
| 
 | ||||
|     render json: @status, serializer: REST::StatusSerializer | ||||
|   end | ||||
| 
 | ||||
|  | @ -25,4 +31,24 @@ class Api::V1::Statuses::PinsController < Api::BaseController | |||
|   def set_status | ||||
|     @status = Status.find(params[:status_id]) | ||||
|   end | ||||
| 
 | ||||
|   def distribute_add_activity! | ||||
|     json = ActiveModelSerializers::SerializableResource.new( | ||||
|       @status, | ||||
|       serializer: ActivityPub::AddSerializer, | ||||
|       adapter: ActivityPub::Adapter | ||||
|     ).as_json | ||||
| 
 | ||||
|     ActivityPub::RawDistributionWorker.perform_async(Oj.dump(json), current_account) | ||||
|   end | ||||
| 
 | ||||
|   def distribute_remove_activity! | ||||
|     json = ActiveModelSerializers::SerializableResource.new( | ||||
|       @status, | ||||
|       serializer: ActivityPub::RemoveSerializer, | ||||
|       adapter: ActivityPub::Adapter | ||||
|     ).as_json | ||||
| 
 | ||||
|     ActivityPub::RawDistributionWorker.perform_async(Oj.dump(json), current_account) | ||||
|   end | ||||
| end | ||||
|  |  | |||
		Reference in a new issue