56 lines
1.4 KiB
Ruby
56 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module SlashCommands
|
||
|
class IssueComment < IssueCommand
|
||
|
def self.match(text)
|
||
|
/\Aissue\s+comment\s+#{Issue.reference_prefix}?(?<iid>\d+)\n*(?<note_body>(.|\n)*)/.match(text)
|
||
|
end
|
||
|
|
||
|
def self.help_message
|
||
|
'issue comment <id> *`⇧ Shift`*+*`↵ Enter`* <comment>'
|
||
|
end
|
||
|
|
||
|
def execute(match)
|
||
|
note_body = match[:note_body].to_s.strip
|
||
|
issue = find_by_iid(match[:iid])
|
||
|
|
||
|
return not_found unless issue
|
||
|
return access_denied unless can_create_note?(issue)
|
||
|
|
||
|
note = create_note(issue: issue, note: note_body)
|
||
|
|
||
|
if note.persisted?
|
||
|
presenter(note).present
|
||
|
else
|
||
|
presenter(note).display_errors
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def can_create_note?(issue)
|
||
|
Ability.allowed?(current_user, :create_note, issue)
|
||
|
end
|
||
|
|
||
|
def not_found
|
||
|
Gitlab::SlashCommands::Presenters::Access.new.not_found
|
||
|
end
|
||
|
|
||
|
def access_denied
|
||
|
Gitlab::SlashCommands::Presenters::Access.new.generic_access_denied
|
||
|
end
|
||
|
|
||
|
def create_note(issue:, note:)
|
||
|
note_params = { noteable: issue, note: note }
|
||
|
|
||
|
Notes::CreateService.new(project, current_user, note_params).execute
|
||
|
end
|
||
|
|
||
|
def presenter(note)
|
||
|
Gitlab::SlashCommands::Presenters::IssueComment.new(note)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|