96 lines
2.7 KiB
Ruby
96 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Chat
|
|
# Class for scheduling chat pipelines.
|
|
#
|
|
# A Command takes care of creating a `Ci::Pipeline` with all the data
|
|
# necessary to execute a chat command. This includes data such as the chat
|
|
# data (e.g. the response URL) and any environment variables that should be
|
|
# exposed to the chat command.
|
|
class Command
|
|
include Utils::StrongMemoize
|
|
|
|
attr_reader :project, :chat_name, :name, :arguments, :response_url,
|
|
:channel
|
|
|
|
# project - The Project to schedule the command for.
|
|
# chat_name - The ChatName belonging to the user that scheduled the
|
|
# command.
|
|
# name - The name of the chat command to run.
|
|
# arguments - The arguments (as a String) to pass to the command.
|
|
# channel - The channel the message was sent from.
|
|
# response_url - The URL to send the response back to.
|
|
def initialize(project:, chat_name:, name:, arguments:, channel:, response_url:)
|
|
@project = project
|
|
@chat_name = chat_name
|
|
@name = name
|
|
@arguments = arguments
|
|
@channel = channel
|
|
@response_url = response_url
|
|
end
|
|
|
|
# Tries to create a new pipeline.
|
|
#
|
|
# This method will return a pipeline that _may_ be persisted, or `nil` if
|
|
# the pipeline could not be created.
|
|
def try_create_pipeline
|
|
return unless valid?
|
|
|
|
create_pipeline
|
|
end
|
|
|
|
def create_pipeline
|
|
service = ::Ci::CreatePipelineService.new(
|
|
project,
|
|
chat_name.user,
|
|
ref: branch,
|
|
sha: commit,
|
|
chat_data: {
|
|
chat_name_id: chat_name.id,
|
|
command: name,
|
|
arguments: arguments,
|
|
response_url: response_url
|
|
}
|
|
)
|
|
|
|
response = service.execute(:chat) do |pipeline|
|
|
build_environment_variables(pipeline)
|
|
build_chat_data(pipeline)
|
|
end
|
|
|
|
response.payload
|
|
end
|
|
|
|
# pipeline - The `Ci::Pipeline` to create the environment variables for.
|
|
def build_environment_variables(pipeline)
|
|
pipeline.variables.build(
|
|
[{ key: 'CHAT_INPUT', value: arguments },
|
|
{ key: 'CHAT_CHANNEL', value: channel }]
|
|
)
|
|
end
|
|
|
|
# pipeline - The `Ci::Pipeline` to create the chat data for.
|
|
def build_chat_data(pipeline)
|
|
pipeline.build_chat_data(
|
|
chat_name_id: chat_name.id,
|
|
response_url: response_url
|
|
)
|
|
end
|
|
|
|
def valid?
|
|
branch && commit
|
|
end
|
|
|
|
def branch
|
|
strong_memoize(:branch) { project.default_branch }
|
|
end
|
|
|
|
def commit
|
|
strong_memoize(:commit) do
|
|
project.commit(branch)&.id if branch
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|