summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-02-17 20:04:14 -0200
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-02-20 12:12:05 -0200
commit3b98adcc75f82f4e5e469da5c164467da02b0f0c (patch)
treeb8839b6775ca6817b95daa99501a9038aa38f114 /app
parent4120b7941d75217d013dcc9612e3e5dff76f10d5 (diff)
downloadgitlab-ce-3b98adcc75f82f4e5e469da5c164467da02b0f0c.tar.gz
Create a pending task when a user is mentioned when edit a issue/mr/note
Diffstat (limited to 'app')
-rw-r--r--app/services/issues/update_service.rb2
-rw-r--r--app/services/merge_requests/update_service.rb2
-rw-r--r--app/services/task_service.rb79
3 files changed, 67 insertions, 16 deletions
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index 9e39847dc54..042b567b25f 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -6,7 +6,7 @@ module Issues
def handle_changes(issue, options = {})
if have_changes?(issue, options)
- task_service.mark_pending_tasks_as_done(issue, current_user)
+ task_service.update_issue(issue, current_user)
end
if issue.previous_changes.include?('milestone_id')
diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb
index 38ae067877a..87949f0a9b8 100644
--- a/app/services/merge_requests/update_service.rb
+++ b/app/services/merge_requests/update_service.rb
@@ -16,7 +16,7 @@ module MergeRequests
def handle_changes(merge_request, options = {})
if have_changes?(merge_request, options)
- task_service.mark_pending_tasks_as_done(merge_request, current_user)
+ task_service.update_merge_request(merge_request, current_user)
end
if merge_request.previous_changes.include?('target_branch')
diff --git a/app/services/task_service.rb b/app/services/task_service.rb
index c9b30bcb19c..48678763f31 100644
--- a/app/services/task_service.rb
+++ b/app/services/task_service.rb
@@ -8,12 +8,22 @@
class TaskService
# When create an issue we should:
#
- # * creates a pending task for assignee if issue is assigned
+ # * create a task for assignee if issue is assigned
+ # * create a task for each mentioned user on issue
#
def new_issue(issue, current_user)
new_issuable(issue, current_user)
end
+ # When update an issue we should:
+ #
+ # * mark all pending tasks related to the issue for the current user as done
+ # * create a task for each new user mentioned on issue
+ #
+ def update_issue(issue, current_user)
+ update_issuable(issue, current_user)
+ end
+
# When close an issue we should:
#
# * mark all pending tasks related to the target for the current user as done
@@ -24,7 +34,7 @@ class TaskService
# When we reassign an issue we should:
#
- # * creates a pending task for new assignee if issue is assigned
+ # * create a pending task for new assignee if issue is assigned
#
def reassigned_issue(issue, current_user)
reassigned_issuable(issue, current_user)
@@ -33,11 +43,21 @@ class TaskService
# When create a merge request we should:
#
# * creates a pending task for assignee if merge request is assigned
+ # * create a task for each mentioned user on merge request
#
def new_merge_request(merge_request, current_user)
new_issuable(merge_request, current_user)
end
+ # When update a merge request we should:
+ #
+ # * mark all pending tasks related to the merge request for the current user as done
+ # * create a task for each new user mentioned on merge request
+ #
+ def update_merge_request(merge_request, current_user)
+ update_issuable(merge_request, current_user)
+ end
+
# When close a merge request we should:
#
# * mark all pending tasks related to the target for the current user as done
@@ -62,17 +82,10 @@ class TaskService
mark_pending_tasks_as_done(merge_request, current_user)
end
- # When we mark a task as done we should:
- #
- # * mark all pending tasks related to the target for the user as done
- #
- def mark_pending_tasks_as_done(target, user)
- pending_tasks(user, target.project, target).update_all(state: :done)
- end
-
# When create a note we should:
#
# * mark all pending tasks related to the noteable for the note author as done
+ # * create a task for each mentioned user on note
#
def new_note(note)
# Skip system notes, like status changes and cross-references
@@ -94,11 +107,24 @@ class TaskService
# When update a note we should:
#
# * mark all pending tasks related to the noteable for the current user as done
+ # * create a task for each new user mentioned on note
#
def update_note(note, current_user)
# Skip system notes, like status changes and cross-references
unless note.system
- mark_pending_tasks_as_done(note.noteable, current_user)
+ project = note.project
+ target = note.noteable
+ author = current_user
+
+ mark_pending_tasks_as_done(target, author)
+
+ mentioned_users = build_mentioned_users(project, note, author)
+
+ mentioned_users.each do |user|
+ unless pending_tasks(mentioned_user, project, target, note: note, action: Task::MENTIONED).exists?
+ create_task(project, target, author, user, Task::MENTIONED, note)
+ end
+ end
end
end
@@ -128,8 +154,17 @@ class TaskService
mentioned_users.uniq
end
- def pending_tasks(user, project, target)
- user.tasks.pending.where(project: project, target: target)
+ def mark_pending_tasks_as_done(target, user)
+ pending_tasks(user, target.project, target).update_all(state: :done)
+ end
+
+ def pending_tasks(user, project, target, options = {})
+ options.reverse_merge({
+ project: project,
+ target: target
+ })
+
+ user.tasks.pending.where(options)
end
def new_issuable(issuable, current_user)
@@ -148,8 +183,24 @@ class TaskService
end
end
+ def update_issuable(issuable, current_user)
+ project = issuable.project
+ target = issuable
+ author = current_user
+
+ mark_pending_tasks_as_done(target, author)
+
+ mentioned_users = build_mentioned_users(project, target, author)
+
+ mentioned_users.each do |mentioned_user|
+ unless pending_tasks(mentioned_user, project, target, action: Task::MENTIONED).exists?
+ create_task(project, target, author, mentioned_user, Task::MENTIONED)
+ end
+ end
+ end
+
def reassigned_issuable(issuable, current_user)
- if issuable.is_assigned? && issuable.assignee != current_user
+ if issuable.assignee && issuable.assignee != current_user
create_task(issuable.project, issuable, current_user, issuable.assignee, Task::ASSIGNED)
end
end