Clean up api/subscriptions controller (#3448)
This commit is contained in:
		
							parent
							
								
									93de41b39b
								
							
						
					
					
						commit
						83435c49ea
					
				
					 2 changed files with 45 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -5,18 +5,15 @@ class Api::SubscriptionsController < ApiController
 | 
			
		|||
  respond_to :txt
 | 
			
		||||
 | 
			
		||||
  def show
 | 
			
		||||
    if @account.subscription(api_subscription_url(@account.id)).valid?(params['hub.topic'])
 | 
			
		||||
      @account.update(subscription_expires_at: Time.now.utc + (params['hub.lease_seconds'] || 86_400).to_i.seconds)
 | 
			
		||||
      render plain: HTMLEntities.new.encode(params['hub.challenge']), status: 200
 | 
			
		||||
    if subscription.valid?(params['hub.topic'])
 | 
			
		||||
      @account.update(subscription_expires_at: future_expires)
 | 
			
		||||
      render plain: encoded_challenge, status: 200
 | 
			
		||||
    else
 | 
			
		||||
      head 404
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def update
 | 
			
		||||
    body = request.body.read
 | 
			
		||||
    subscription = @account.subscription(api_subscription_url(@account.id))
 | 
			
		||||
 | 
			
		||||
    if subscription.verify(body, request.headers['HTTP_X_HUB_SIGNATURE'])
 | 
			
		||||
      ProcessingWorker.perform_async(@account.id, body.force_encoding('UTF-8'))
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +23,28 @@ class Api::SubscriptionsController < ApiController
 | 
			
		|||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def subscription
 | 
			
		||||
    @_subscription ||= @account.subscription(
 | 
			
		||||
      api_subscription_url(@account.id)
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def body
 | 
			
		||||
    @_body ||= request.body.read
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def encoded_challenge
 | 
			
		||||
    HTMLEntities.new.encode(params['hub.challenge'])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def future_expires
 | 
			
		||||
    Time.now.utc + lease_seconds_or_default
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def lease_seconds_or_default
 | 
			
		||||
    (params['hub.lease_seconds'] || 86_400).to_i.seconds
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_account
 | 
			
		||||
    @account = Account.find(params[:id])
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,16 +6,29 @@ RSpec.describe Api::SubscriptionsController, type: :controller do
 | 
			
		|||
  let(:account) { Fabricate(:account, username: 'gargron', domain: 'quitter.no', remote_url: 'topic_url', secret: 'abc') }
 | 
			
		||||
 | 
			
		||||
  describe 'GET #show' do
 | 
			
		||||
    before do
 | 
			
		||||
      get :show, params: { :id => account.id, 'hub.topic' => 'topic_url', 'hub.challenge' => '456', 'hub.lease_seconds' => "#{86400 * 30}" }
 | 
			
		||||
    context 'with valid subscription' do
 | 
			
		||||
      before do
 | 
			
		||||
        get :show, params: { :id => account.id, 'hub.topic' => 'topic_url', 'hub.challenge' => '456', 'hub.lease_seconds' => "#{86400 * 30}" }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns http success' do
 | 
			
		||||
        expect(response).to have_http_status(:success)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'echoes back the challenge' do
 | 
			
		||||
        expect(response.body).to match '456'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'returns http success' do
 | 
			
		||||
      expect(response).to have_http_status(:success)
 | 
			
		||||
    end
 | 
			
		||||
    context 'with invalid subscription' do
 | 
			
		||||
      before do
 | 
			
		||||
        expect_any_instance_of(Account).to receive_message_chain(:subscription, :valid?).and_return(false)
 | 
			
		||||
        get :show, params: { :id => account.id }
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
    it 'echoes back the challenge' do
 | 
			
		||||
      expect(response.body).to match '456'
 | 
			
		||||
      it 'returns http success' do
 | 
			
		||||
        expect(response).to have_http_status(:missing)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue