From 76b4da0c44d7dd40ae4990c55c3977d19f3bd2af Mon Sep 17 00:00:00 2001
From: Marc Saleiko <msaleiko@gitlab.com>
Date: Wed, 24 Apr 2024 14:02:09 +0000
Subject: [PATCH] Adds tickets_confidential_by_default to controller and update
 sevrice

Adds processing of tickets_confidential_by_default
field to both ServiceDeskController and
ServiceDeskSettings::UpdateService and
pushes the feature flag service_desk_tickets_confidentiality
to the frontend on the project settings page.
---
 .../projects/service_desk_controller.rb       |  4 +++-
 app/controllers/projects_controller.rb        |  1 +
 .../service_desk_settings/update_service.rb   | 17 ++++++++++----
 .../settings/service_desk_setting_spec.rb     |  3 ++-
 .../projects/service_desk_controller_spec.rb  |  9 +++++---
 .../update_service_spec.rb                    | 23 +++++++++++++++++--
 6 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/app/controllers/projects/service_desk_controller.rb b/app/controllers/projects/service_desk_controller.rb
index a53e8859ee665..841946596cfda 100644
--- a/app/controllers/projects/service_desk_controller.rb
+++ b/app/controllers/projects/service_desk_controller.rb
@@ -35,6 +35,7 @@ def allowed_update_attributes
       project_key
       reopen_issue_on_external_participant_note
       add_external_participants_from_cc
+      tickets_confidential_by_default
     ]
   end
 
@@ -49,7 +50,8 @@ def service_desk_attributes
       outgoing_name: service_desk_settings&.outgoing_name,
       project_key: service_desk_settings&.project_key,
       reopen_issue_on_external_participant_note: service_desk_settings&.reopen_issue_on_external_participant_note,
-      add_external_participants_from_cc: service_desk_settings&.add_external_participants_from_cc
+      add_external_participants_from_cc: service_desk_settings&.add_external_participants_from_cc,
+      tickets_confidential_by_default: service_desk_settings&.tickets_confidential_by_default
     }
   end
 
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 772cafb0bb919..4ee996d14a1f1 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -41,6 +41,7 @@ class ProjectsController < Projects::ApplicationController
     push_frontend_feature_flag(:remove_monitor_metrics, @project)
     push_frontend_feature_flag(:explain_code_chat, current_user)
     push_frontend_feature_flag(:issue_email_participants, @project)
+    push_frontend_feature_flag(:service_desk_tickets_confidentiality, @project)
     push_frontend_feature_flag(:edit_branch_rules, @project)
     # TODO: We need to remove the FF eventually when we rollout page_specific_styles
     push_frontend_feature_flag(:page_specific_styles, current_user)
diff --git a/app/services/service_desk_settings/update_service.rb b/app/services/service_desk_settings/update_service.rb
index f8b825923f374..8139ccc92f077 100644
--- a/app/services/service_desk_settings/update_service.rb
+++ b/app/services/service_desk_settings/update_service.rb
@@ -9,7 +9,14 @@ def execute
 
       params[:project_key] = nil if params[:project_key].blank?
 
-      apply_feature_flag_restrictions!
+      apply_feature_flag_restrictions!(
+        feature_flag: :issue_email_participants,
+        field: :add_external_participants_from_cc
+      )
+      apply_feature_flag_restrictions!(
+        feature_flag: :service_desk_tickets_confidentiality,
+        field: :tickets_confidential_by_default
+      )
 
       # We want to know when custom email got enabled
       write_log_message = params[:custom_email_enabled].present? && !settings.custom_email_enabled?
@@ -25,11 +32,11 @@ def execute
 
     private
 
-    def apply_feature_flag_restrictions!
-      return if Feature.enabled?(:issue_email_participants, project)
-      return unless params.include?(:add_external_participants_from_cc)
+    def apply_feature_flag_restrictions!(feature_flag:, field:)
+      return if Feature.enabled?(feature_flag, project)
+      return unless params.include?(field)
 
-      params.delete(:add_external_participants_from_cc)
+      params.delete(field)
     end
   end
 end
diff --git a/spec/features/projects/settings/service_desk_setting_spec.rb b/spec/features/projects/settings/service_desk_setting_spec.rb
index 5401219585315..78bf8a8208b89 100644
--- a/spec/features/projects/settings/service_desk_setting_spec.rb
+++ b/spec/features/projects/settings/service_desk_setting_spec.rb
@@ -102,9 +102,10 @@
     end
   end
 
-  it 'pushes issue_email_participants feature flag to frontend' do
+  it 'pushes feature flags to frontend' do
     visit edit_project_path(project)
 
     expect(page).to have_pushed_frontend_feature_flags(issueEmailParticipants: true)
+    expect(page).to have_pushed_frontend_feature_flags(serviceDeskTicketsConfidentiality: true)
   end
 end
diff --git a/spec/requests/projects/service_desk_controller_spec.rb b/spec/requests/projects/service_desk_controller_spec.rb
index ce79ad2751407..f51ee78fa6fd7 100644
--- a/spec/requests/projects/service_desk_controller_spec.rb
+++ b/spec/requests/projects/service_desk_controller_spec.rb
@@ -82,7 +82,8 @@
       put project_service_desk_path(project, format: :json), params: {
         issue_template_key: 'service_desk',
         reopen_issue_on_external_participant_note: true,
-        add_external_participants_from_cc: true
+        add_external_participants_from_cc: true,
+        tickets_confidential_by_default: false
       }
 
       settings = project.service_desk_setting
@@ -90,12 +91,14 @@
       expect(settings).to have_attributes(
         issue_template_key: 'service_desk',
         reopen_issue_on_external_participant_note: true,
-        add_external_participants_from_cc: true
+        add_external_participants_from_cc: true,
+        tickets_confidential_by_default: false
       )
       expect(json_response).to include(
         'issue_template_key' => 'service_desk',
         'reopen_issue_on_external_participant_note' => true,
-        'add_external_participants_from_cc' => true
+        'add_external_participants_from_cc' => true,
+        'tickets_confidential_by_default' => false
       )
     end
 
diff --git a/spec/services/service_desk_settings/update_service_spec.rb b/spec/services/service_desk_settings/update_service_spec.rb
index 2c310bad2470f..e2a000201475a 100644
--- a/spec/services/service_desk_settings/update_service_spec.rb
+++ b/spec/services/service_desk_settings/update_service_spec.rb
@@ -18,7 +18,8 @@
           outgoing_name: 'some name',
           project_key: 'foo',
           reopen_issue_on_external_participant_note: true,
-          add_external_participants_from_cc: true
+          add_external_participants_from_cc: true,
+          tickets_confidential_by_default: false
         }
       end
 
@@ -30,7 +31,8 @@
           outgoing_name: 'some name',
           project_key: 'foo',
           reopen_issue_on_external_participant_note: true,
-          add_external_participants_from_cc: true
+          add_external_participants_from_cc: true,
+          tickets_confidential_by_default: false
         )
       end
 
@@ -68,6 +70,23 @@
           )
         end
       end
+
+      context 'when service_desk_tickets_confidentiality feature flag is disabled' do
+        before do
+          stub_feature_flags(service_desk_tickets_confidentiality: false)
+        end
+
+        it 'updates service desk setting but not tickets_confidential_by_default value' do
+          response = described_class.new(settings.project, user, params).execute
+
+          expect(response).to be_success
+          expect(settings.reset).to have_attributes(
+            outgoing_name: 'some name',
+            project_key: 'foo',
+            tickets_confidential_by_default: true
+          )
+        end
+      end
     end
 
     context 'when project_key is an empty string' do
-- 
GitLab