Skip to content

Commit

Permalink
Add endpoints to accept and dismiss multiple notification requests at…
Browse files Browse the repository at this point in the history
… once (mastodon#31242)
  • Loading branch information
ClearlyClaire authored Aug 1, 2024
1 parent 584b152 commit da5b45a
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 1 deletion.
17 changes: 16 additions & 1 deletion app/controllers/api/v1/notifications/requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
before_action -> { doorkeeper_authorize! :write, :'write:notifications' }, except: :index

before_action :require_user!
before_action :set_request, except: :index
before_action :set_request, only: [:show, :accept, :dismiss]
before_action :set_requests, only: [:accept_bulk, :dismiss_bulk]

after_action :insert_pagination_headers, only: :index

Expand All @@ -32,6 +33,16 @@ def dismiss
render_empty
end

def accept_bulk
@requests.each { |request| AcceptNotificationRequestService.new.call(request) }
render_empty
end

def dismiss_bulk
@requests.each(&:destroy!)
render_empty
end

private

def load_requests
Expand All @@ -53,6 +64,10 @@ def set_request
@request = NotificationRequest.where(account: current_account).find(params[:id])
end

def set_requests
@requests = NotificationRequest.where(account: current_account, id: Array(params[:id]).uniq.map(&:to_i))
end

def next_path
api_v1_notifications_requests_url pagination_params(max_id: pagination_max_id) unless @requests.empty?
end
Expand Down
5 changes: 5 additions & 0 deletions config/routes/api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,11 @@

namespace :notifications do
resources :requests, only: [:index, :show] do
collection do
post :accept, to: 'requests#accept_bulk'
post :dismiss, to: 'requests#dismiss_bulk'
end

member do
post :accept
post :dismiss
Expand Down
33 changes: 33 additions & 0 deletions spec/requests/api/v1/notifications/requests_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,37 @@
end
end
end

describe 'POST /api/v1/notifications/requests/accept' do
subject do
post '/api/v1/notifications/requests/accept', params: { id: [notification_request.id] }, headers: headers
end

let!(:notification_request) { Fabricate(:notification_request, account: user.account) }

it_behaves_like 'forbidden for wrong scope', 'read read:notifications'

it 'returns http success and creates notification permission', :aggregate_failures do
subject

expect(NotificationPermission.find_by(account: notification_request.account, from_account: notification_request.from_account)).to_not be_nil
expect(response).to have_http_status(200)
end
end

describe 'POST /api/v1/notifications/requests/dismiss' do
subject do
post '/api/v1/notifications/requests/dismiss', params: { id: [notification_request.id] }, headers: headers
end

let!(:notification_request) { Fabricate(:notification_request, account: user.account) }

it_behaves_like 'forbidden for wrong scope', 'read read:notifications'

it 'returns http success and destroys the notification request', :aggregate_failures do
expect { subject }.to change(NotificationRequest, :count).by(-1)

expect(response).to have_http_status(200)
end
end
end

0 comments on commit da5b45a

Please sign in to comment.