diff options
author | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-17 20:04:14 -0200 |
---|---|---|
committer | Douglas Barbosa Alexandre <dbalexandre@gmail.com> | 2016-02-20 12:12:05 -0200 |
commit | 3b98adcc75f82f4e5e469da5c164467da02b0f0c (patch) | |
tree | b8839b6775ca6817b95daa99501a9038aa38f114 /app | |
parent | 4120b7941d75217d013dcc9612e3e5dff76f10d5 (diff) | |
download | gitlab-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.rb | 2 | ||||
-rw-r--r-- | app/services/merge_requests/update_service.rb | 2 | ||||
-rw-r--r-- | app/services/task_service.rb | 79 |
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 |