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   -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 @@
  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 @@
  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   -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 @@
  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 @@
  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 8 before_filter :require_non_empty_project
9 9  
10 10 def show
11   - result = CommitLoad.new(project, current_user, params).execute
  11 + result = CommitLoadContext.new(project, current_user, params).execute
12 12  
13 13 @commit = result[:commit]
14 14 git_not_found! unless @commit
... ...
app/controllers/dashboard_controller.rb
... ... @@ -6,7 +6,7 @@ class DashboardController &lt; ApplicationController
6 6 @projects = current_user.projects_with_events
7 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 10 @last_push = current_user.recent_push
11 11  
12 12 respond_to do |format|
... ... @@ -19,14 +19,14 @@ class DashboardController &lt; ApplicationController
19 19 # Get authored or assigned open merge requests
20 20 def merge_requests
21 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 23 end
24 24  
25 25 # Get only assigned issues
26 26 def issues
27 27 @projects = current_user.projects.all
28 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 30 @issues = @issues.includes(:author, :project)
31 31  
32 32 respond_to do |format|
... ...
app/controllers/groups_controller.rb
... ... @@ -6,10 +6,7 @@ class GroupsController &lt; ApplicationController
6 6 before_filter :projects
7 7  
8 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 10 @last_push = current_user.recent_push
14 11  
15 12 respond_to do |format|
... ... @@ -22,14 +19,14 @@ class GroupsController &lt; ApplicationController
22 19 # Get authored or assigned open merge requests
23 20 def merge_requests
24 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 23 end
27 24  
28 25 # Get only assigned issues
29 26 def issues
30 27 @user = current_user
31 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 30 @issues = @issues.includes(:author, :project)
34 31  
35 32 respond_to do |format|
... ... @@ -39,16 +36,11 @@ class GroupsController &lt; ApplicationController
39 36 end
40 37  
41 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 44 end
53 45  
54 46 def people
... ...
app/controllers/issues_controller.rb
1 1 class IssuesController < ProjectResourceController
2 2 before_filter :module_enabled
3 3 before_filter :issue, only: [:edit, :update, :destroy, :show]
4   - helper_method :issues_filter
5 4  
6 5 # Allow read any issue
7 6 before_filter :authorize_read_issue!
... ... @@ -19,7 +18,6 @@ class IssuesController &lt; ProjectResourceController
19 18  
20 19 def index
21 20 @issues = issues_filtered
22   -
23 21 @issues = @issues.page(params[:page]).per(20)
24 22  
25 23 respond_to do |format|
... ... @@ -54,7 +52,7 @@ class IssuesController &lt; ProjectResourceController
54 52  
55 53 respond_to do |format|
56 54 format.html do
57   - if @issue.valid?
  55 + if @issue.valid?
58 56 redirect_to project_issue_path(@project, @issue)
59 57 else
60 58 render :new
... ... @@ -69,7 +67,7 @@ class IssuesController &lt; ProjectResourceController
69 67  
70 68 respond_to do |format|
71 69 format.js
72   - format.html do
  70 + format.html do
73 71 if @issue.valid?
74 72 redirect_to [@project, @issue]
75 73 else
... ... @@ -134,35 +132,6 @@ class IssuesController &lt; ProjectResourceController
134 132 end
135 133  
136 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 136 end
168 137 end
... ...
app/controllers/merge_requests_controller.rb
... ... @@ -18,7 +18,7 @@ class MergeRequestsController &lt; ProjectResourceController
18 18  
19 19  
20 20 def index
21   - @merge_requests = MergeRequestsLoad.new(project, current_user, params).execute
  21 + @merge_requests = MergeRequestsLoadContext.new(project, current_user, params).execute
22 22 end
23 23  
24 24 def show
... ... @@ -55,7 +55,7 @@ class MergeRequestsController &lt; ProjectResourceController
55 55 @merge_request.reload_code
56 56 redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.'
57 57 else
58   - render action: "new"
  58 + render action: "new"
59 59 end
60 60 end
61 61  
... ... @@ -70,7 +70,7 @@ class MergeRequestsController &lt; ProjectResourceController
70 70 end
71 71  
72 72 def automerge_check
73   - if @merge_request.unchecked?
  73 + if @merge_request.unchecked?
74 74 @merge_request.check_if_can_be_merged
75 75 end
76 76 render json: {state: @merge_request.human_state}
... ... @@ -125,7 +125,7 @@ class MergeRequestsController &lt; ProjectResourceController
125 125  
126 126 def validates_merge_request
127 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 130 # Show git not found page if source branch doesnt exist
131 131 # and there is no saved commits between source & target branch
... ... @@ -136,7 +136,7 @@ class MergeRequestsController &lt; ProjectResourceController
136 136 # Build a note object for comment form
137 137 @note = @project.notes.new(noteable: @merge_request)
138 138  
139   - # Get commits from repository
  139 + # Get commits from repository
140 140 # or from cache if already merged
141 141 @commits = @merge_request.commits
142 142 @commits = CommitDecorator.decorate(@commits)
... ...
app/controllers/milestones_controller.rb
... ... @@ -54,7 +54,7 @@ class MilestonesController &lt; ProjectResourceController
54 54  
55 55 respond_to do |format|
56 56 format.js
57   - format.html do
  57 + format.html do
58 58 if @milestone.valid?
59 59 redirect_to [@project, @milestone]
60 60 else
... ...
app/controllers/refs_controller.rb
... ... @@ -9,9 +9,9 @@ class RefsController &lt; ProjectResourceController
9 9 before_filter :ref
10 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 15 new_path = if params[:destination] == "tree"
16 16 project_tree_path(@project, @ref)
17 17 else
... ...
app/controllers/search_controller.rb
1 1 class SearchController < ApplicationController
2 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 8 end
15 9 end
... ...
app/helpers/issues_helper.rb
... ... @@ -43,4 +43,13 @@ module IssuesHelper
43 43 # Milestone uses :title, Issue uses :name
44 44 OpenStruct.new(id: 0, title: 'Unspecified', name: 'Unassigned')
45 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 55 end
... ...
app/models/event.rb
... ... @@ -30,6 +30,7 @@ class Event &lt; ActiveRecord::Base
30 30 # Scopes
31 31 scope :recent, order("created_at DESC")
32 32 scope :code_push, where(action: Pushed)
  33 + scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
33 34  
34 35 class << self
35 36 def determine_action(record)
... ... @@ -39,10 +40,6 @@ class Event &lt; ActiveRecord::Base
39 40 Event::Commented
40 41 end
41 42 end
42   -
43   - def recent_for_user user
44   - where(project_id: user.projects.map(&:id)).recent
45   - end
46 43 end
47 44  
48 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 2 module IssueCommonality
4 3 extend ActiveSupport::Concern
5 4  
... ... @@ -18,6 +17,7 @@ module IssueCommonality
18 17 scope :closed, where(closed: true)
19 18 scope :of_group, ->(group) { where(project_id: group.project_ids) }
20 19 scope :assigned, ->(u) { where(assignee_id: u.id)}
  20 + scope :recent, order("created_at DESC")
21 21  
22 22 delegate :name,
23 23 :email,
... ...