Commit 679d0d6d760b850e27c13f3ce0f812b8b081df7f
1 parent
63fe042d
Exists in
master
and in
4 other branches
Context refactoring. Move Issues list, Search logic to context
Showing
17 changed files
with
144 additions
and
127 deletions
Show diff stats
app/contexts/commit_load.rb
@@ -1,33 +0,0 @@ | @@ -1,33 +0,0 @@ | ||
1 | -class CommitLoad < BaseContext | ||
2 | - def execute | ||
3 | - result = { | ||
4 | - commit: nil, | ||
5 | - suppress_diff: false, | ||
6 | - line_notes: [], | ||
7 | - notes_count: 0, | ||
8 | - note: nil, | ||
9 | - status: :ok | ||
10 | - } | ||
11 | - | ||
12 | - commit = project.commit(params[:id]) | ||
13 | - | ||
14 | - if commit | ||
15 | - commit = CommitDecorator.decorate(commit) | ||
16 | - line_notes = project.commit_line_notes(commit) | ||
17 | - | ||
18 | - result[:commit] = commit | ||
19 | - result[:note] = project.build_commit_note(commit) | ||
20 | - result[:line_notes] = line_notes | ||
21 | - result[:notes_count] = line_notes.count + project.commit_notes(commit).count | ||
22 | - | ||
23 | - begin | ||
24 | - result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff] | ||
25 | - rescue Grit::Git::GitTimeout | ||
26 | - result[:suppress_diff] = true | ||
27 | - result[:status] = :huge_commit | ||
28 | - end | ||
29 | - end | ||
30 | - | ||
31 | - result | ||
32 | - end | ||
33 | -end |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +class CommitLoadContext < BaseContext | ||
2 | + def execute | ||
3 | + result = { | ||
4 | + commit: nil, | ||
5 | + suppress_diff: false, | ||
6 | + line_notes: [], | ||
7 | + notes_count: 0, | ||
8 | + note: nil, | ||
9 | + status: :ok | ||
10 | + } | ||
11 | + | ||
12 | + commit = project.commit(params[:id]) | ||
13 | + | ||
14 | + if commit | ||
15 | + commit = CommitDecorator.decorate(commit) | ||
16 | + line_notes = project.commit_line_notes(commit) | ||
17 | + | ||
18 | + result[:commit] = commit | ||
19 | + result[:note] = project.build_commit_note(commit) | ||
20 | + result[:line_notes] = line_notes | ||
21 | + result[:notes_count] = line_notes.count + project.commit_notes(commit).count | ||
22 | + | ||
23 | + begin | ||
24 | + result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff] | ||
25 | + rescue Grit::Git::GitTimeout | ||
26 | + result[:suppress_diff] = true | ||
27 | + result[:status] = :huge_commit | ||
28 | + end | ||
29 | + end | ||
30 | + | ||
31 | + result | ||
32 | + end | ||
33 | +end |
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +class IssuesListContext < BaseContext | ||
2 | + include IssuesHelper | ||
3 | + | ||
4 | + attr_accessor :issues | ||
5 | + | ||
6 | + def execute | ||
7 | + @issues = case params[:f] | ||
8 | + when issues_filter[:all] then @project.issues | ||
9 | + when issues_filter[:closed] then @project.issues.closed | ||
10 | + when issues_filter[:to_me] then @project.issues.opened.assigned(current_user) | ||
11 | + else @project.issues.opened | ||
12 | + end | ||
13 | + | ||
14 | + @issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present? | ||
15 | + @issues = @issues.includes(:author, :project).order("updated_at") | ||
16 | + | ||
17 | + # Filter by specific assignee_id (or lack thereof)? | ||
18 | + if params[:assignee_id].present? | ||
19 | + @issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) | ||
20 | + end | ||
21 | + | ||
22 | + # Filter by specific milestone_id (or lack thereof)? | ||
23 | + if params[:milestone_id].present? | ||
24 | + @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) | ||
25 | + end | ||
26 | + | ||
27 | + @issues | ||
28 | + end | ||
29 | +end |
app/contexts/merge_requests_load.rb
@@ -1,16 +0,0 @@ | @@ -1,16 +0,0 @@ | ||
1 | -class MergeRequestsLoad < BaseContext | ||
2 | - def execute | ||
3 | - type = params[:f] | ||
4 | - | ||
5 | - merge_requests = project.merge_requests | ||
6 | - | ||
7 | - merge_requests = case type | ||
8 | - when 'all' then merge_requests | ||
9 | - when 'closed' then merge_requests.closed | ||
10 | - when 'assigned-to-me' then merge_requests.opened.assigned(current_user) | ||
11 | - else merge_requests.opened | ||
12 | - end.page(params[:page]).per(20) | ||
13 | - | ||
14 | - merge_requests.includes(:author, :project).order("closed, created_at desc") | ||
15 | - end | ||
16 | -end |
@@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
1 | +class MergeRequestsLoadContext < BaseContext | ||
2 | + def execute | ||
3 | + type = params[:f] | ||
4 | + | ||
5 | + merge_requests = project.merge_requests | ||
6 | + | ||
7 | + merge_requests = case type | ||
8 | + when 'all' then merge_requests | ||
9 | + when 'closed' then merge_requests.closed | ||
10 | + when 'assigned-to-me' then merge_requests.opened.assigned(current_user) | ||
11 | + else merge_requests.opened | ||
12 | + end.page(params[:page]).per(20) | ||
13 | + | ||
14 | + merge_requests.includes(:author, :project).order("closed, created_at desc") | ||
15 | + end | ||
16 | +end |
@@ -0,0 +1,27 @@ | @@ -0,0 +1,27 @@ | ||
1 | +class SearchContext | ||
2 | + attr_accessor :project_ids, :params | ||
3 | + | ||
4 | + def initialize(project_ids, params) | ||
5 | + @project_ids, @params = project_ids, params.dup | ||
6 | + end | ||
7 | + | ||
8 | + def execute | ||
9 | + query = params[:search] | ||
10 | + | ||
11 | + return result unless query.present? | ||
12 | + | ||
13 | + result[:projects] = Project.where(id: project_ids).search(query).limit(10) | ||
14 | + result[:merge_requests] = MergeRequest.where(project_id: project_ids).search(query).limit(10) | ||
15 | + result[:issues] = Issue.where(project_id: project_ids).search(query).limit(10) | ||
16 | + result | ||
17 | + end | ||
18 | + | ||
19 | + def result | ||
20 | + @result ||= { | ||
21 | + projects: [], | ||
22 | + merge_requests: [], | ||
23 | + issues: [] | ||
24 | + } | ||
25 | + end | ||
26 | +end | ||
27 | + |
app/controllers/commit_controller.rb
@@ -8,7 +8,7 @@ class CommitController < ProjectResourceController | @@ -8,7 +8,7 @@ class CommitController < ProjectResourceController | ||
8 | before_filter :require_non_empty_project | 8 | before_filter :require_non_empty_project |
9 | 9 | ||
10 | def show | 10 | def show |
11 | - result = CommitLoad.new(project, current_user, params).execute | 11 | + result = CommitLoadContext.new(project, current_user, params).execute |
12 | 12 | ||
13 | @commit = result[:commit] | 13 | @commit = result[:commit] |
14 | git_not_found! unless @commit | 14 | git_not_found! unless @commit |
app/controllers/dashboard_controller.rb
@@ -6,7 +6,7 @@ class DashboardController < ApplicationController | @@ -6,7 +6,7 @@ class DashboardController < ApplicationController | ||
6 | @projects = current_user.projects_with_events | 6 | @projects = current_user.projects_with_events |
7 | @projects = @projects.page(params[:page]).per(20) | 7 | @projects = @projects.page(params[:page]).per(20) |
8 | 8 | ||
9 | - @events = Event.recent_for_user(current_user).limit(20).offset(params[:offset] || 0) | 9 | + @events = Event.in_projects(current_user.project_ids).limit(20).offset(params[:offset] || 0) |
10 | @last_push = current_user.recent_push | 10 | @last_push = current_user.recent_push |
11 | 11 | ||
12 | respond_to do |format| | 12 | respond_to do |format| |
@@ -19,14 +19,14 @@ class DashboardController < ApplicationController | @@ -19,14 +19,14 @@ class DashboardController < ApplicationController | ||
19 | # Get authored or assigned open merge requests | 19 | # Get authored or assigned open merge requests |
20 | def merge_requests | 20 | def merge_requests |
21 | @projects = current_user.projects.all | 21 | @projects = current_user.projects.all |
22 | - @merge_requests = current_user.cared_merge_requests.order("created_at DESC").page(params[:page]).per(20) | 22 | + @merge_requests = current_user.cared_merge_requests.recent.page(params[:page]).per(20) |
23 | end | 23 | end |
24 | 24 | ||
25 | # Get only assigned issues | 25 | # Get only assigned issues |
26 | def issues | 26 | def issues |
27 | @projects = current_user.projects.all | 27 | @projects = current_user.projects.all |
28 | @user = current_user | 28 | @user = current_user |
29 | - @issues = current_user.assigned_issues.opened.order("created_at DESC").page(params[:page]).per(20) | 29 | + @issues = current_user.assigned_issues.opened.recent.page(params[:page]).per(20) |
30 | @issues = @issues.includes(:author, :project) | 30 | @issues = @issues.includes(:author, :project) |
31 | 31 | ||
32 | respond_to do |format| | 32 | respond_to do |format| |
app/controllers/groups_controller.rb
@@ -6,10 +6,7 @@ class GroupsController < ApplicationController | @@ -6,10 +6,7 @@ class GroupsController < ApplicationController | ||
6 | before_filter :projects | 6 | before_filter :projects |
7 | 7 | ||
8 | def show | 8 | def show |
9 | - @events = Event.where(project_id: project_ids). | ||
10 | - order('id DESC'). | ||
11 | - limit(20).offset(params[:offset] || 0) | ||
12 | - | 9 | + @events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0) |
13 | @last_push = current_user.recent_push | 10 | @last_push = current_user.recent_push |
14 | 11 | ||
15 | respond_to do |format| | 12 | respond_to do |format| |
@@ -22,14 +19,14 @@ class GroupsController < ApplicationController | @@ -22,14 +19,14 @@ class GroupsController < ApplicationController | ||
22 | # Get authored or assigned open merge requests | 19 | # Get authored or assigned open merge requests |
23 | def merge_requests | 20 | def merge_requests |
24 | @merge_requests = current_user.cared_merge_requests | 21 | @merge_requests = current_user.cared_merge_requests |
25 | - @merge_requests = @merge_requests.of_group(@group).order("created_at DESC").page(params[:page]).per(20) | 22 | + @merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20) |
26 | end | 23 | end |
27 | 24 | ||
28 | # Get only assigned issues | 25 | # Get only assigned issues |
29 | def issues | 26 | def issues |
30 | @user = current_user | 27 | @user = current_user |
31 | @issues = current_user.assigned_issues.opened | 28 | @issues = current_user.assigned_issues.opened |
32 | - @issues = @issues.of_group(@group).order("created_at DESC").page(params[:page]).per(20) | 29 | + @issues = @issues.of_group(@group).recent.page(params[:page]).per(20) |
33 | @issues = @issues.includes(:author, :project) | 30 | @issues = @issues.includes(:author, :project) |
34 | 31 | ||
35 | respond_to do |format| | 32 | respond_to do |format| |
@@ -39,16 +36,11 @@ class GroupsController < ApplicationController | @@ -39,16 +36,11 @@ class GroupsController < ApplicationController | ||
39 | end | 36 | end |
40 | 37 | ||
41 | def search | 38 | def search |
42 | - query = params[:search] | ||
43 | - | ||
44 | - @merge_requests = [] | ||
45 | - @issues = [] | 39 | + result = SearchContext.new(project_ids, params).execute |
46 | 40 | ||
47 | - if query.present? | ||
48 | - @projects = @projects.search(query).limit(10) | ||
49 | - @merge_requests = MergeRequest.where(project_id: project_ids).search(query).limit(10) | ||
50 | - @issues = Issue.where(project_id: project_ids).search(query).limit(10) | ||
51 | - end | 41 | + @projects = result[:projects] |
42 | + @merge_requests = result[:merge_requests] | ||
43 | + @issues = result[:issues] | ||
52 | end | 44 | end |
53 | 45 | ||
54 | def people | 46 | def people |
app/controllers/issues_controller.rb
1 | class IssuesController < ProjectResourceController | 1 | class IssuesController < ProjectResourceController |
2 | before_filter :module_enabled | 2 | before_filter :module_enabled |
3 | before_filter :issue, only: [:edit, :update, :destroy, :show] | 3 | before_filter :issue, only: [:edit, :update, :destroy, :show] |
4 | - helper_method :issues_filter | ||
5 | 4 | ||
6 | # Allow read any issue | 5 | # Allow read any issue |
7 | before_filter :authorize_read_issue! | 6 | before_filter :authorize_read_issue! |
@@ -19,7 +18,6 @@ class IssuesController < ProjectResourceController | @@ -19,7 +18,6 @@ class IssuesController < ProjectResourceController | ||
19 | 18 | ||
20 | def index | 19 | def index |
21 | @issues = issues_filtered | 20 | @issues = issues_filtered |
22 | - | ||
23 | @issues = @issues.page(params[:page]).per(20) | 21 | @issues = @issues.page(params[:page]).per(20) |
24 | 22 | ||
25 | respond_to do |format| | 23 | respond_to do |format| |
@@ -54,7 +52,7 @@ class IssuesController < ProjectResourceController | @@ -54,7 +52,7 @@ class IssuesController < ProjectResourceController | ||
54 | 52 | ||
55 | respond_to do |format| | 53 | respond_to do |format| |
56 | format.html do | 54 | format.html do |
57 | - if @issue.valid? | 55 | + if @issue.valid? |
58 | redirect_to project_issue_path(@project, @issue) | 56 | redirect_to project_issue_path(@project, @issue) |
59 | else | 57 | else |
60 | render :new | 58 | render :new |
@@ -69,7 +67,7 @@ class IssuesController < ProjectResourceController | @@ -69,7 +67,7 @@ class IssuesController < ProjectResourceController | ||
69 | 67 | ||
70 | respond_to do |format| | 68 | respond_to do |format| |
71 | format.js | 69 | format.js |
72 | - format.html do | 70 | + format.html do |
73 | if @issue.valid? | 71 | if @issue.valid? |
74 | redirect_to [@project, @issue] | 72 | redirect_to [@project, @issue] |
75 | else | 73 | else |
@@ -134,35 +132,6 @@ class IssuesController < ProjectResourceController | @@ -134,35 +132,6 @@ class IssuesController < ProjectResourceController | ||
134 | end | 132 | end |
135 | 133 | ||
136 | def issues_filtered | 134 | def issues_filtered |
137 | - @issues = case params[:f] | ||
138 | - when issues_filter[:all] then @project.issues | ||
139 | - when issues_filter[:closed] then @project.issues.closed | ||
140 | - when issues_filter[:to_me] then @project.issues.opened.assigned(current_user) | ||
141 | - else @project.issues.opened | ||
142 | - end | ||
143 | - | ||
144 | - @issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present? | ||
145 | - @issues = @issues.includes(:author, :project).order("updated_at") | ||
146 | - | ||
147 | - # Filter by specific assignee_id (or lack thereof)? | ||
148 | - if params[:assignee_id].present? | ||
149 | - @issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) | ||
150 | - end | ||
151 | - | ||
152 | - # Filter by specific milestone_id (or lack thereof)? | ||
153 | - if params[:milestone_id].present? | ||
154 | - @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) | ||
155 | - end | ||
156 | - | ||
157 | - @issues | ||
158 | - end | ||
159 | - | ||
160 | - def issues_filter | ||
161 | - { | ||
162 | - all: "all", | ||
163 | - closed: "closed", | ||
164 | - to_me: "assigned-to-me", | ||
165 | - open: "open" | ||
166 | - } | 135 | + @issues = IssuesListContext.new(project, current_user, params).execute |
167 | end | 136 | end |
168 | end | 137 | end |
app/controllers/merge_requests_controller.rb
@@ -18,7 +18,7 @@ class MergeRequestsController < ProjectResourceController | @@ -18,7 +18,7 @@ class MergeRequestsController < ProjectResourceController | ||
18 | 18 | ||
19 | 19 | ||
20 | def index | 20 | def index |
21 | - @merge_requests = MergeRequestsLoad.new(project, current_user, params).execute | 21 | + @merge_requests = MergeRequestsLoadContext.new(project, current_user, params).execute |
22 | end | 22 | end |
23 | 23 | ||
24 | def show | 24 | def show |
@@ -55,7 +55,7 @@ class MergeRequestsController < ProjectResourceController | @@ -55,7 +55,7 @@ class MergeRequestsController < ProjectResourceController | ||
55 | @merge_request.reload_code | 55 | @merge_request.reload_code |
56 | redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' | 56 | redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' |
57 | else | 57 | else |
58 | - render action: "new" | 58 | + render action: "new" |
59 | end | 59 | end |
60 | end | 60 | end |
61 | 61 | ||
@@ -70,7 +70,7 @@ class MergeRequestsController < ProjectResourceController | @@ -70,7 +70,7 @@ class MergeRequestsController < ProjectResourceController | ||
70 | end | 70 | end |
71 | 71 | ||
72 | def automerge_check | 72 | def automerge_check |
73 | - if @merge_request.unchecked? | 73 | + if @merge_request.unchecked? |
74 | @merge_request.check_if_can_be_merged | 74 | @merge_request.check_if_can_be_merged |
75 | end | 75 | end |
76 | render json: {state: @merge_request.human_state} | 76 | render json: {state: @merge_request.human_state} |
@@ -125,7 +125,7 @@ class MergeRequestsController < ProjectResourceController | @@ -125,7 +125,7 @@ class MergeRequestsController < ProjectResourceController | ||
125 | 125 | ||
126 | def validates_merge_request | 126 | def validates_merge_request |
127 | # Show git not found page if target branch doesnt exist | 127 | # Show git not found page if target branch doesnt exist |
128 | - return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) | 128 | + return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) |
129 | 129 | ||
130 | # Show git not found page if source branch doesnt exist | 130 | # Show git not found page if source branch doesnt exist |
131 | # and there is no saved commits between source & target branch | 131 | # and there is no saved commits between source & target branch |
@@ -136,7 +136,7 @@ class MergeRequestsController < ProjectResourceController | @@ -136,7 +136,7 @@ class MergeRequestsController < ProjectResourceController | ||
136 | # Build a note object for comment form | 136 | # Build a note object for comment form |
137 | @note = @project.notes.new(noteable: @merge_request) | 137 | @note = @project.notes.new(noteable: @merge_request) |
138 | 138 | ||
139 | - # Get commits from repository | 139 | + # Get commits from repository |
140 | # or from cache if already merged | 140 | # or from cache if already merged |
141 | @commits = @merge_request.commits | 141 | @commits = @merge_request.commits |
142 | @commits = CommitDecorator.decorate(@commits) | 142 | @commits = CommitDecorator.decorate(@commits) |
app/controllers/milestones_controller.rb
@@ -54,7 +54,7 @@ class MilestonesController < ProjectResourceController | @@ -54,7 +54,7 @@ class MilestonesController < ProjectResourceController | ||
54 | 54 | ||
55 | respond_to do |format| | 55 | respond_to do |format| |
56 | format.js | 56 | format.js |
57 | - format.html do | 57 | + format.html do |
58 | if @milestone.valid? | 58 | if @milestone.valid? |
59 | redirect_to [@project, @milestone] | 59 | redirect_to [@project, @milestone] |
60 | else | 60 | else |
app/controllers/refs_controller.rb
@@ -9,9 +9,9 @@ class RefsController < ProjectResourceController | @@ -9,9 +9,9 @@ class RefsController < ProjectResourceController | ||
9 | before_filter :ref | 9 | before_filter :ref |
10 | before_filter :define_tree_vars, only: [:blob, :logs_tree] | 10 | before_filter :define_tree_vars, only: [:blob, :logs_tree] |
11 | 11 | ||
12 | - def switch | ||
13 | - respond_to do |format| | ||
14 | - format.html do | 12 | + def switch |
13 | + respond_to do |format| | ||
14 | + format.html do | ||
15 | new_path = if params[:destination] == "tree" | 15 | new_path = if params[:destination] == "tree" |
16 | project_tree_path(@project, @ref) | 16 | project_tree_path(@project, @ref) |
17 | else | 17 | else |
app/controllers/search_controller.rb
1 | class SearchController < ApplicationController | 1 | class SearchController < ApplicationController |
2 | def show | 2 | def show |
3 | - query = params[:search] | 3 | + result = SearchContext.new(current_user.project_ids, params).execute |
4 | 4 | ||
5 | - @projects = [] | ||
6 | - @merge_requests = [] | ||
7 | - @issues = [] | ||
8 | - | ||
9 | - if query.present? | ||
10 | - @projects = current_user.projects.search(query).limit(10) | ||
11 | - @merge_requests = MergeRequest.where(project_id: current_user.project_ids).search(query).limit(10) | ||
12 | - @issues = Issue.where(project_id: current_user.project_ids).search(query).limit(10) | ||
13 | - end | 5 | + @projects = result[:projects] |
6 | + @merge_requests = result[:merge_requests] | ||
7 | + @issues = result[:issues] | ||
14 | end | 8 | end |
15 | end | 9 | end |
app/helpers/issues_helper.rb
@@ -43,4 +43,13 @@ module IssuesHelper | @@ -43,4 +43,13 @@ module IssuesHelper | ||
43 | # Milestone uses :title, Issue uses :name | 43 | # Milestone uses :title, Issue uses :name |
44 | OpenStruct.new(id: 0, title: 'Unspecified', name: 'Unassigned') | 44 | OpenStruct.new(id: 0, title: 'Unspecified', name: 'Unassigned') |
45 | end | 45 | end |
46 | + | ||
47 | + def issues_filter | ||
48 | + { | ||
49 | + all: "all", | ||
50 | + closed: "closed", | ||
51 | + to_me: "assigned-to-me", | ||
52 | + open: "open" | ||
53 | + } | ||
54 | + end | ||
46 | end | 55 | end |
app/models/event.rb
@@ -30,6 +30,7 @@ class Event < ActiveRecord::Base | @@ -30,6 +30,7 @@ class Event < ActiveRecord::Base | ||
30 | # Scopes | 30 | # Scopes |
31 | scope :recent, order("created_at DESC") | 31 | scope :recent, order("created_at DESC") |
32 | scope :code_push, where(action: Pushed) | 32 | scope :code_push, where(action: Pushed) |
33 | + scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } | ||
33 | 34 | ||
34 | class << self | 35 | class << self |
35 | def determine_action(record) | 36 | def determine_action(record) |
@@ -39,10 +40,6 @@ class Event < ActiveRecord::Base | @@ -39,10 +40,6 @@ class Event < ActiveRecord::Base | ||
39 | Event::Commented | 40 | Event::Commented |
40 | end | 41 | end |
41 | end | 42 | end |
42 | - | ||
43 | - def recent_for_user user | ||
44 | - where(project_id: user.projects.map(&:id)).recent | ||
45 | - end | ||
46 | end | 43 | end |
47 | 44 | ||
48 | # Next events currently enabled for system | 45 | # Next events currently enabled for system |
app/roles/issue_commonality.rb
1 | -# Contains common functionality | ||
2 | -# shared between Issues and MergeRequests | 1 | +# Contains common functionality shared between Issues and MergeRequests |
3 | module IssueCommonality | 2 | module IssueCommonality |
4 | extend ActiveSupport::Concern | 3 | extend ActiveSupport::Concern |
5 | 4 | ||
@@ -18,6 +17,7 @@ module IssueCommonality | @@ -18,6 +17,7 @@ module IssueCommonality | ||
18 | scope :closed, where(closed: true) | 17 | scope :closed, where(closed: true) |
19 | scope :of_group, ->(group) { where(project_id: group.project_ids) } | 18 | scope :of_group, ->(group) { where(project_id: group.project_ids) } |
20 | scope :assigned, ->(u) { where(assignee_id: u.id)} | 19 | scope :assigned, ->(u) { where(assignee_id: u.id)} |
20 | + scope :recent, order("created_at DESC") | ||
21 | 21 | ||
22 | delegate :name, | 22 | delegate :name, |
23 | :email, | 23 | :email, |