summaryrefslogtreecommitdiff
path: root/app/services/issuable_base_service.rb
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2016-06-30 17:34:19 +0200
committerRémy Coutable <remy@rymai.me>2016-08-13 00:05:57 +0200
commit0eea8c885743575b0e93a98846b3663e9903aa66 (patch)
tree9b1903bcb03789d15ed255b76be5d683f3b1e547 /app/services/issuable_base_service.rb
parent11eefba891f214eefc1efa334adbcc9e979c0ce3 (diff)
downloadgitlab-ce-0eea8c885743575b0e93a98846b3663e9903aa66.tar.gz
Support slash commands in noteable description and notes
Some important things to note: - commands are removed from noteable.description / note.note - commands are translated to params so that they are treated as normal params in noteable Creation services - the logic is not in the models but in the Creation services, which is the right place for advanced logic that has nothing to do with what models should be responsible of! - UI/JS needs to be updated to handle notes which consist of commands only - the `/merge` command is not handled yet Other improvements: - Don't process commands in commit notes and display a flash is note is only commands - Add autocomplete for slash commands - Add description and params to slash command DSL methods - Ensure replying by email with a commands-only note works - Use :subscription_event instead of calling noteable.subscribe - Support :todo_event in IssuableBaseService Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'app/services/issuable_base_service.rb')
-rw-r--r--app/services/issuable_base_service.rb79
1 files changed, 64 insertions, 15 deletions
diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb
index 2d96efe1042..b365e19c4a8 100644
--- a/app/services/issuable_base_service.rb
+++ b/app/services/issuable_base_service.rb
@@ -69,14 +69,9 @@ class IssuableBaseService < BaseService
end
def filter_labels
- if params[:add_label_ids].present? || params[:remove_label_ids].present?
- params.delete(:label_ids)
-
- filter_labels_in_param(:add_label_ids)
- filter_labels_in_param(:remove_label_ids)
- else
- filter_labels_in_param(:label_ids)
- end
+ filter_labels_in_param(:add_label_ids)
+ filter_labels_in_param(:remove_label_ids)
+ filter_labels_in_param(:label_ids)
end
def filter_labels_in_param(key)
@@ -85,23 +80,65 @@ class IssuableBaseService < BaseService
params[key] = project.labels.where(id: params[key]).pluck(:id)
end
- def update_issuable(issuable, attributes)
+ def process_label_ids(attributes, base_label_ids: [], merge_all: false)
+ label_ids = attributes.delete(:label_ids) { [] }
+ add_label_ids = attributes.delete(:add_label_ids) { [] }
+ remove_label_ids = attributes.delete(:remove_label_ids) { [] }
+
+ new_label_ids = base_label_ids
+ new_label_ids |= label_ids if merge_all || (add_label_ids.empty? && remove_label_ids.empty?)
+ new_label_ids |= add_label_ids
+ new_label_ids -= remove_label_ids
+
+ new_label_ids
+ end
+
+ def merge_slash_commands_into_params!
+ command_params = SlashCommands::InterpretService.new(project, current_user).
+ execute(params[:description])
+
+ params.merge!(command_params)
+ end
+
+ def create_issuable(issuable, attributes)
issuable.with_transaction_returning_status do
- add_label_ids = attributes.delete(:add_label_ids)
- remove_label_ids = attributes.delete(:remove_label_ids)
+ attributes.delete(:state_event)
+ params[:author] ||= current_user
+ label_ids = process_label_ids(attributes, merge_all: true)
+
+ issuable.assign_attributes(attributes)
+
+ if issuable.save
+ issuable.update_attributes(label_ids: label_ids)
+ end
+ end
+ end
- issuable.label_ids |= add_label_ids if add_label_ids
- issuable.label_ids -= remove_label_ids if remove_label_ids
+ def create(issuable)
+ merge_slash_commands_into_params!
+ filter_params
- issuable.assign_attributes(attributes.merge(updated_by: current_user))
+ if params.present? && create_issuable(issuable, params)
+ handle_creation(issuable)
+ issuable.create_cross_references!(current_user)
+ execute_hooks(issuable)
+ end
+
+ issuable
+ end
- issuable.save
+ def update_issuable(issuable, attributes)
+ issuable.with_transaction_returning_status do
+ attributes[:label_ids] = process_label_ids(attributes, base_label_ids: issuable.label_ids)
+
+ issuable.update(attributes.merge(updated_by: current_user))
end
end
def update(issuable)
change_state(issuable)
change_subscription(issuable)
+ change_todo(issuable)
filter_params
old_labels = issuable.labels.to_a
@@ -134,6 +171,18 @@ class IssuableBaseService < BaseService
end
end
+ def change_todo(issuable)
+ case params.delete(:todo_event)
+ when 'mark'
+ todo_service.mark_todo(issuable, current_user)
+ when 'done'
+ todo = TodosFinder.new(current_user).execute.find_by(target: issuable)
+ if todo
+ todo_service.mark_todos_as_done([todo], current_user)
+ end
+ end
+ end
+
def has_changes?(issuable, old_labels: [])
valid_attrs = [:title, :description, :assignee_id, :milestone_id, :target_branch]