Commit 679d0d6d760b850e27c13f3ce0f812b8b081df7f

Authored by randx
1 parent 63fe042d

Context refactoring. Move Issues list, Search logic to context

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  
app/contexts/commit_load_context.rb 0 → 100644
@@ -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
app/contexts/issues_list_context.rb 0 → 100644
@@ -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  
app/contexts/merge_requests_load_context.rb 0 → 100644
@@ -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
app/contexts/search_context.rb 0 → 100644
@@ -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 &lt; ProjectResourceController @@ -8,7 +8,7 @@ class CommitController &lt; 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 &lt; ApplicationController @@ -6,7 +6,7 @@ class DashboardController &lt; 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 &lt; ApplicationController @@ -19,14 +19,14 @@ class DashboardController &lt; 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 &lt; ApplicationController @@ -6,10 +6,7 @@ class GroupsController &lt; 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 &lt; ApplicationController @@ -22,14 +19,14 @@ class GroupsController &lt; 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 &lt; ApplicationController @@ -39,16 +36,11 @@ class GroupsController &lt; 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 &lt; ProjectResourceController @@ -19,7 +18,6 @@ class IssuesController &lt; 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 &lt; ProjectResourceController @@ -54,7 +52,7 @@ class IssuesController &lt; 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 &lt; ProjectResourceController @@ -69,7 +67,7 @@ class IssuesController &lt; 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 &lt; ProjectResourceController @@ -134,35 +132,6 @@ class IssuesController &lt; 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 &lt; ProjectResourceController @@ -18,7 +18,7 @@ class MergeRequestsController &lt; 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 &lt; ProjectResourceController @@ -55,7 +55,7 @@ class MergeRequestsController &lt; 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 &lt; ProjectResourceController @@ -70,7 +70,7 @@ class MergeRequestsController &lt; 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 &lt; ProjectResourceController @@ -125,7 +125,7 @@ class MergeRequestsController &lt; 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 &lt; ProjectResourceController @@ -136,7 +136,7 @@ class MergeRequestsController &lt; 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 &lt; ProjectResourceController @@ -54,7 +54,7 @@ class MilestonesController &lt; 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 &lt; ProjectResourceController @@ -9,9 +9,9 @@ class RefsController &lt; 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 &lt; ActiveRecord::Base @@ -30,6 +30,7 @@ class Event &lt; 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 &lt; ActiveRecord::Base @@ -39,10 +40,6 @@ class Event &lt; 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,