forked from cybrespace/mastodon
		
	authorize-follow-requests-after-unlocking (#4658)
This commit is contained in:
		
							parent
							
								
									3ac7b353f8
								
							
						
					
					
						commit
						649a20ab46
					
				
					 4 changed files with 37 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -12,7 +12,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
 | 
			
		|||
 | 
			
		||||
  def update
 | 
			
		||||
    @account = current_account
 | 
			
		||||
    @account.update!(account_params)
 | 
			
		||||
    UpdateAccountService.new.call(@account, account_params, raise_error: true)
 | 
			
		||||
    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
 | 
			
		||||
    render json: @account, serializer: REST::CredentialAccountSerializer
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ class Settings::ProfilesController < ApplicationController
 | 
			
		|||
  def show; end
 | 
			
		||||
 | 
			
		||||
  def update
 | 
			
		||||
    if @account.update(account_params)
 | 
			
		||||
    if UpdateAccountService.new.call(@account, account_params)
 | 
			
		||||
      ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
 | 
			
		||||
      redirect_to settings_profile_path, notice: I18n.t('generic.changes_saved_msg')
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								app/services/update_account_service.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/services/update_account_service.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class UpdateAccountService < BaseService
 | 
			
		||||
  def call(account, params, raise_error: false)
 | 
			
		||||
    was_locked = account.locked
 | 
			
		||||
    update_method = raise_error ? :update! : :update
 | 
			
		||||
    account.send(update_method, params).tap do |ret|
 | 
			
		||||
      next unless ret
 | 
			
		||||
      authorize_all_follow_requests(account) if was_locked && !account.locked
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def authorize_all_follow_requests(account)
 | 
			
		||||
    follow_requests = FollowRequest.where(target_account: account)
 | 
			
		||||
    AuthorizeFollowWorker.push_bulk(follow_requests) do |req|
 | 
			
		||||
      [req.account_id, req.target_account_id]
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										14
									
								
								app/workers/authorize_follow_worker.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/workers/authorize_follow_worker.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class AuthorizeFollowWorker
 | 
			
		||||
  include Sidekiq::Worker
 | 
			
		||||
 | 
			
		||||
  def perform(source_account_id, target_account_id)
 | 
			
		||||
    source_account = Account.find(source_account_id)
 | 
			
		||||
    target_account = Account.find(target_account_id)
 | 
			
		||||
 | 
			
		||||
    AuthorizeFollowService.new.call(source_account, target_account)
 | 
			
		||||
  rescue ActiveRecord::RecordNotFound
 | 
			
		||||
    true
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue