diff --git a/ee/app/helpers/ee/system_note_helper.rb b/ee/app/helpers/ee/system_note_helper.rb index 1f69a12c65c42fbb1645afd8a3c8513ba331d1e3..d951696d40959b2699f61da1f0e87defbe617510 100644 --- a/ee/app/helpers/ee/system_note_helper.rb +++ b/ee/app/helpers/ee/system_note_helper.rb @@ -25,7 +25,8 @@ module SystemNoteHelper 'published' => 'bullhorn', 'paging_started' => 'mobile', 'progress' => 'progress', - 'checkin_reminder' => 'clock' + 'checkin_reminder' => 'clock', + 'notify_service' => 'comment' }.freeze override :system_note_icon_name diff --git a/ee/app/models/ee/system_note_metadata.rb b/ee/app/models/ee/system_note_metadata.rb index 0e4ab0046c19ecadeba0966c0defb86ac99dddf2..b53ac01b7035e8fae18ef52138f0c3c2a3334a19 100644 --- a/ee/app/models/ee/system_note_metadata.rb +++ b/ee/app/models/ee/system_note_metadata.rb @@ -10,6 +10,7 @@ module SystemNoteMetadata epic_issue_moved issue_changed_epic epic_date_changed relate_epic unrelate_epic vulnerability_confirmed vulnerability_dismissed vulnerability_resolved vulnerability_detected iteration paging_started progress checkin_reminder approvals_reset + notify_service ].freeze EE_TYPES_WITH_CROSS_REFERENCES = %w[ diff --git a/ee/app/services/ee/system_note_service.rb b/ee/app/services/ee/system_note_service.rb index b0533de8f7b18dcd4eeec1155867e7c9c5a82a9a..3cd81dacbaedc1d9220cb5e001a33cdf9cdc5731 100644 --- a/ee/app/services/ee/system_note_service.rb +++ b/ee/app/services/ee/system_note_service.rb @@ -189,6 +189,10 @@ def override_requested_changes(noteable, user, event) merge_requests_service(noteable, noteable.project, user).override_requested_changes(event) end + def amazon_q_called(noteable, user, event) + issuables_service(noteable, noteable.project, user).amazon_q_called(event) + end + private def issuables_service(noteable, project, author) diff --git a/ee/app/services/ee/system_notes/issuables_service.rb b/ee/app/services/ee/system_notes/issuables_service.rb index a195d863aaccf90530dcb7026eeee437b37f6bb8..8e666bdf35235f4ac32ab4a4e4f56cdeacbe4a13 100644 --- a/ee/app/services/ee/system_notes/issuables_service.rb +++ b/ee/app/services/ee/system_notes/issuables_service.rb @@ -155,6 +155,24 @@ def cross_reference_disallowed?(mentioned_in) epic_self_reference?(mentioned_in) || super end + # Called when an Amazon Q command is successfully sent to the AI gateway + # + # noteable_ref - Referenced noteable object + # event - The type of command executed by the user + # + # Example Note text: + # + # "sent dev request to Amazon Q" + # + # Returns the created Note object + def amazon_q_called(event) + body = "sent #{event} request to Amazon Q" + + track_issue_event(:track_issue_related_action) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'notify_service')) + end + private def block_message(issuable_type, noteable_reference, type) diff --git a/ee/spec/services/ai/amazon_q/amazon_q_trigger_service_spec.rb b/ee/spec/services/ai/amazon_q/amazon_q_trigger_service_spec.rb index 5e6a2541f3338af554bd6547b856f109390a5c20..b9e38230594fa3a1d4ce8ded09a6661d496f3d17 100644 --- a/ee/spec/services/ai/amazon_q/amazon_q_trigger_service_spec.rb +++ b/ee/spec/services/ai/amazon_q/amazon_q_trigger_service_spec.rb @@ -40,7 +40,7 @@ before do allow(Gitlab::Llm::QAi::Client).to receive(:new).with(user).and_return(client) allow(::CloudConnector::AvailableServices).to receive(:find_by_name).with(service_name).and_return(service_data) - allow(SystemNoteService).to receive(:amazon_q_called) + allow(SystemNoteService).to receive(:amazon_q_called).and_call_original end context 'with dev command' do @@ -54,7 +54,7 @@ end it 'executes successfully' do - expect { execution }.not_to change { Note.count } + expect { execution }.to change { Note.system.count }.by(1).and not_change { Note.user.count } expect(execution.parsed_response).to be_nil expect(SystemNoteService).to have_received(:amazon_q_called).with(source, user, command) end @@ -74,7 +74,7 @@ end it 'updates a new note with an error' do - expect { execution }.to change { Note.count }.by(1) + expect { execution }.to change { Note.system.count }.by(1).and change { Note.user.count }.by(1) expect(Note.last.note).to include( "Sorry, I'm not able to complete the request at this moment. Please try again later") expect(Note.last.note).to include("Request ID:") @@ -109,7 +109,7 @@ end it 'executes successfully' do - expect { execution }.not_to change { Note.count } + expect { execution }.to change { Note.system.count }.by(1).and not_change { Note.user.count } expect(execution.parsed_response).to be_nil expect(SystemNoteService).to have_received(:amazon_q_called).with(source, user, command) end @@ -168,7 +168,7 @@ end it 'executes successfully with the right payload' do - expect { execution }.to change { Note.count }.by(1) + expect { execution }.to change { Note.system.count }.by(1).and change { Note.user.count }.by(1) expect(execution.parsed_response).to be_nil end end diff --git a/ee/spec/services/ee/system_notes/issuables_service_spec.rb b/ee/spec/services/ee/system_notes/issuables_service_spec.rb index 25a6f7af0a38655ac80c91710a4a5e752b738bbb..8ce5c821ac7454581340e250709085b4f9a088b5 100644 --- a/ee/spec/services/ee/system_notes/issuables_service_spec.rb +++ b/ee/spec/services/ee/system_notes/issuables_service_spec.rb @@ -300,4 +300,16 @@ end end end + + describe '#amazon_q_called' do + subject(:system_note) { service.amazon_q_called('test') } + + it_behaves_like 'a system note' do + let(:action) { 'notify_service' } + end + + it 'creates system note mentioning q action' do + expect(system_note.note).to eq "sent test request to Amazon Q" + end + end end diff --git a/ee/spec/services/system_note_service_spec.rb b/ee/spec/services/system_note_service_spec.rb index f113fc12cb8c75bef07d105a054afe09d76ec3f3..791c0a083858d71549ec6f0d193a8b41500d843a 100644 --- a/ee/spec/services/system_note_service_spec.rb +++ b/ee/spec/services/system_note_service_spec.rb @@ -320,4 +320,14 @@ described_class.change_color_note(noteable, author, '#0052cc') end end + + describe '.amazon_q_called' do + it 'calls AmazonQ' do + expect_next_instance_of(::SystemNotes::IssuablesService) do |service| + expect(service).to receive(:amazon_q_called).with('test') + end + + described_class.amazon_q_called(noteable, author, 'test') + end + end end