From 191d302b7f15a3619ded9c92d790effc5f54c6ce Mon Sep 17 00:00:00 2001
From: Claire <claire.github-309c@sitedethib.com>
Date: Mon, 21 Aug 2023 15:47:09 +0200
Subject: [PATCH] Refactor `Api::V1::ProfilesController` into two separate
 controllers (#26573)

---
 .../api/v1/profile/avatars_controller.rb      | 13 +++++++++
 .../api/v1/profile/headers_controller.rb      | 13 +++++++++
 app/controllers/api/v1/profiles_controller.rb | 29 -------------------
 config/routes/api.rb                          |  6 +++-
 spec/requests/api/v1/profiles_spec.rb         | 14 ---------
 5 files changed, 31 insertions(+), 44 deletions(-)
 create mode 100644 app/controllers/api/v1/profile/avatars_controller.rb
 create mode 100644 app/controllers/api/v1/profile/headers_controller.rb
 delete mode 100644 app/controllers/api/v1/profiles_controller.rb

diff --git a/app/controllers/api/v1/profile/avatars_controller.rb b/app/controllers/api/v1/profile/avatars_controller.rb
new file mode 100644
index 000000000..bc4d01a59
--- /dev/null
+++ b/app/controllers/api/v1/profile/avatars_controller.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class Api::V1::Profile::AvatarsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
+  before_action :require_user!
+
+  def destroy
+    @account = current_account
+    UpdateAccountService.new.call(@account, { avatar: nil }, raise_error: true)
+    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
+    render json: @account, serializer: REST::CredentialAccountSerializer
+  end
+end
diff --git a/app/controllers/api/v1/profile/headers_controller.rb b/app/controllers/api/v1/profile/headers_controller.rb
new file mode 100644
index 000000000..9f4daa2f7
--- /dev/null
+++ b/app/controllers/api/v1/profile/headers_controller.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+class Api::V1::Profile::HeadersController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
+  before_action :require_user!
+
+  def destroy
+    @account = current_account
+    UpdateAccountService.new.call(@account, { header: nil }, raise_error: true)
+    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
+    render json: @account, serializer: REST::CredentialAccountSerializer
+  end
+end
diff --git a/app/controllers/api/v1/profiles_controller.rb b/app/controllers/api/v1/profiles_controller.rb
deleted file mode 100644
index f781f0089..000000000
--- a/app/controllers/api/v1/profiles_controller.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-# frozen_string_literal: true
-
-class Api::V1::ProfilesController < Api::BaseController
-  before_action -> { doorkeeper_authorize! :write, :'write:accounts' }
-  before_action :require_user!
-  before_action :set_image
-  before_action :validate_image_param
-
-  def destroy
-    @account = current_account
-    UpdateAccountService.new.call(@account, { @image => nil }, raise_error: true)
-    ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
-    render json: @account, serializer: REST::CredentialAccountSerializer
-  end
-
-  private
-
-  def set_image
-    @image = params[:image]
-  end
-
-  def validate_image_param
-    raise(Mastodon::InvalidParameterError, 'Image must be either "avatar" or "header"') unless valid_image?
-  end
-
-  def valid_image?
-    %w(avatar header).include?(@image)
-  end
-end
diff --git a/config/routes/api.rb b/config/routes/api.rb
index dc6aea7f7..66eb82f59 100644
--- a/config/routes/api.rb
+++ b/config/routes/api.rb
@@ -95,7 +95,11 @@ namespace :api, format: false do
     resources :filters, only: [:index, :create, :show, :update, :destroy]
     resources :endorsements, only: [:index]
     resources :markers, only: [:index, :create]
-    resources :profile, only: :destroy, param: :image, controller: 'profiles'
+
+    namespace :profile do
+      resource :avatar, only: :destroy
+      resource :header, only: :destroy
+    end
 
     namespace :apps do
       get :verify_credentials, to: 'credentials#show'
diff --git a/spec/requests/api/v1/profiles_spec.rb b/spec/requests/api/v1/profiles_spec.rb
index 9fa5fd329..26a9b848e 100644
--- a/spec/requests/api/v1/profiles_spec.rb
+++ b/spec/requests/api/v1/profiles_spec.rb
@@ -94,19 +94,5 @@ RSpec.describe 'Deleting profile images' do
         expect(ActivityPub::UpdateDistributionWorker).to have_received(:perform_async).with(account.id)
       end
     end
-
-    context 'when provided picture value is invalid' do
-      it 'returns http bad request' do
-        delete '/api/v1/profile/invalid', headers: headers
-
-        expect(response).to have_http_status(400)
-      end
-
-      it 'does not queue up an account update distribution' do
-        delete '/api/v1/profile/invalid', headers: headers
-
-        expect(ActivityPub::UpdateDistributionWorker).to_not have_received(:perform_async).with(account.id)
-      end
-    end
   end
 end