diff --git a/app/contexts/commit_load.rb b/app/contexts/commit_load.rb deleted file mode 100644 index 81fb492..0000000 --- a/app/contexts/commit_load.rb +++ /dev/null @@ -1,33 +0,0 @@ -class CommitLoad < BaseContext - def execute - result = { - commit: nil, - suppress_diff: false, - line_notes: [], - notes_count: 0, - note: nil, - status: :ok - } - - commit = project.commit(params[:id]) - - if commit - commit = CommitDecorator.decorate(commit) - line_notes = project.commit_line_notes(commit) - - result[:commit] = commit - result[:note] = project.build_commit_note(commit) - result[:line_notes] = line_notes - result[:notes_count] = line_notes.count + project.commit_notes(commit).count - - begin - result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff] - rescue Grit::Git::GitTimeout - result[:suppress_diff] = true - result[:status] = :huge_commit - end - end - - result - end -end diff --git a/app/contexts/commit_load_context.rb b/app/contexts/commit_load_context.rb new file mode 100644 index 0000000..b3548ed --- /dev/null +++ b/app/contexts/commit_load_context.rb @@ -0,0 +1,33 @@ +class CommitLoadContext < BaseContext + def execute + result = { + commit: nil, + suppress_diff: false, + line_notes: [], + notes_count: 0, + note: nil, + status: :ok + } + + commit = project.commit(params[:id]) + + if commit + commit = CommitDecorator.decorate(commit) + line_notes = project.commit_line_notes(commit) + + result[:commit] = commit + result[:note] = project.build_commit_note(commit) + result[:line_notes] = line_notes + result[:notes_count] = line_notes.count + project.commit_notes(commit).count + + begin + result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff] + rescue Grit::Git::GitTimeout + result[:suppress_diff] = true + result[:status] = :huge_commit + end + end + + result + end +end diff --git a/app/contexts/issues_list_context.rb b/app/contexts/issues_list_context.rb new file mode 100644 index 0000000..9bbdfe1 --- /dev/null +++ b/app/contexts/issues_list_context.rb @@ -0,0 +1,29 @@ +class IssuesListContext < BaseContext + include IssuesHelper + + attr_accessor :issues + + def execute + @issues = case params[:f] + when issues_filter[:all] then @project.issues + when issues_filter[:closed] then @project.issues.closed + when issues_filter[:to_me] then @project.issues.opened.assigned(current_user) + else @project.issues.opened + end + + @issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present? + @issues = @issues.includes(:author, :project).order("updated_at") + + # Filter by specific assignee_id (or lack thereof)? + if params[:assignee_id].present? + @issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) + end + + # Filter by specific milestone_id (or lack thereof)? + if params[:milestone_id].present? + @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) + end + + @issues + end +end diff --git a/app/contexts/merge_requests_load.rb b/app/contexts/merge_requests_load.rb deleted file mode 100644 index e2f68e3..0000000 --- a/app/contexts/merge_requests_load.rb +++ /dev/null @@ -1,16 +0,0 @@ -class MergeRequestsLoad < BaseContext - def execute - type = params[:f] - - merge_requests = project.merge_requests - - merge_requests = case type - when 'all' then merge_requests - when 'closed' then merge_requests.closed - when 'assigned-to-me' then merge_requests.opened.assigned(current_user) - else merge_requests.opened - end.page(params[:page]).per(20) - - merge_requests.includes(:author, :project).order("closed, created_at desc") - end -end diff --git a/app/contexts/merge_requests_load_context.rb b/app/contexts/merge_requests_load_context.rb new file mode 100644 index 0000000..e7dbdd2 --- /dev/null +++ b/app/contexts/merge_requests_load_context.rb @@ -0,0 +1,16 @@ +class MergeRequestsLoadContext < BaseContext + def execute + type = params[:f] + + merge_requests = project.merge_requests + + merge_requests = case type + when 'all' then merge_requests + when 'closed' then merge_requests.closed + when 'assigned-to-me' then merge_requests.opened.assigned(current_user) + else merge_requests.opened + end.page(params[:page]).per(20) + + merge_requests.includes(:author, :project).order("closed, created_at desc") + end +end diff --git a/app/contexts/search_context.rb b/app/contexts/search_context.rb new file mode 100644 index 0000000..6e5e8c5 --- /dev/null +++ b/app/contexts/search_context.rb @@ -0,0 +1,27 @@ +class SearchContext + attr_accessor :project_ids, :params + + def initialize(project_ids, params) + @project_ids, @params = project_ids, params.dup + end + + def execute + query = params[:search] + + return result unless query.present? + + result[:projects] = Project.where(id: project_ids).search(query).limit(10) + result[:merge_requests] = MergeRequest.where(project_id: project_ids).search(query).limit(10) + result[:issues] = Issue.where(project_id: project_ids).search(query).limit(10) + result + end + + def result + @result ||= { + projects: [], + merge_requests: [], + issues: [] + } + end +end + diff --git a/app/controllers/commit_controller.rb b/app/controllers/commit_controller.rb index 25a1f0f..9799835 100644 --- a/app/controllers/commit_controller.rb +++ b/app/controllers/commit_controller.rb @@ -8,7 +8,7 @@ class CommitController < ProjectResourceController before_filter :require_non_empty_project def show - result = CommitLoad.new(project, current_user, params).execute + result = CommitLoadContext.new(project, current_user, params).execute @commit = result[:commit] git_not_found! unless @commit diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index ee82d0f..0ad73f3 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -6,7 +6,7 @@ class DashboardController < ApplicationController @projects = current_user.projects_with_events @projects = @projects.page(params[:page]).per(20) - @events = Event.recent_for_user(current_user).limit(20).offset(params[:offset] || 0) + @events = Event.in_projects(current_user.project_ids).limit(20).offset(params[:offset] || 0) @last_push = current_user.recent_push respond_to do |format| @@ -19,14 +19,14 @@ class DashboardController < ApplicationController # Get authored or assigned open merge requests def merge_requests @projects = current_user.projects.all - @merge_requests = current_user.cared_merge_requests.order("created_at DESC").page(params[:page]).per(20) + @merge_requests = current_user.cared_merge_requests.recent.page(params[:page]).per(20) end # Get only assigned issues def issues @projects = current_user.projects.all @user = current_user - @issues = current_user.assigned_issues.opened.order("created_at DESC").page(params[:page]).per(20) + @issues = current_user.assigned_issues.opened.recent.page(params[:page]).per(20) @issues = @issues.includes(:author, :project) respond_to do |format| diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 5576bc0..761238a 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -6,10 +6,7 @@ class GroupsController < ApplicationController before_filter :projects def show - @events = Event.where(project_id: project_ids). - order('id DESC'). - limit(20).offset(params[:offset] || 0) - + @events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0) @last_push = current_user.recent_push respond_to do |format| @@ -22,14 +19,14 @@ class GroupsController < ApplicationController # Get authored or assigned open merge requests def merge_requests @merge_requests = current_user.cared_merge_requests - @merge_requests = @merge_requests.of_group(@group).order("created_at DESC").page(params[:page]).per(20) + @merge_requests = @merge_requests.of_group(@group).recent.page(params[:page]).per(20) end # Get only assigned issues def issues @user = current_user @issues = current_user.assigned_issues.opened - @issues = @issues.of_group(@group).order("created_at DESC").page(params[:page]).per(20) + @issues = @issues.of_group(@group).recent.page(params[:page]).per(20) @issues = @issues.includes(:author, :project) respond_to do |format| @@ -39,16 +36,11 @@ class GroupsController < ApplicationController end def search - query = params[:search] - - @merge_requests = [] - @issues = [] + result = SearchContext.new(project_ids, params).execute - if query.present? - @projects = @projects.search(query).limit(10) - @merge_requests = MergeRequest.where(project_id: project_ids).search(query).limit(10) - @issues = Issue.where(project_id: project_ids).search(query).limit(10) - end + @projects = result[:projects] + @merge_requests = result[:merge_requests] + @issues = result[:issues] end def people diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 82ae5b3..0f28fc3 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -1,7 +1,6 @@ class IssuesController < ProjectResourceController before_filter :module_enabled before_filter :issue, only: [:edit, :update, :destroy, :show] - helper_method :issues_filter # Allow read any issue before_filter :authorize_read_issue! @@ -19,7 +18,6 @@ class IssuesController < ProjectResourceController def index @issues = issues_filtered - @issues = @issues.page(params[:page]).per(20) respond_to do |format| @@ -54,7 +52,7 @@ class IssuesController < ProjectResourceController respond_to do |format| format.html do - if @issue.valid? + if @issue.valid? redirect_to project_issue_path(@project, @issue) else render :new @@ -69,7 +67,7 @@ class IssuesController < ProjectResourceController respond_to do |format| format.js - format.html do + format.html do if @issue.valid? redirect_to [@project, @issue] else @@ -134,35 +132,6 @@ class IssuesController < ProjectResourceController end def issues_filtered - @issues = case params[:f] - when issues_filter[:all] then @project.issues - when issues_filter[:closed] then @project.issues.closed - when issues_filter[:to_me] then @project.issues.opened.assigned(current_user) - else @project.issues.opened - end - - @issues = @issues.tagged_with(params[:label_name]) if params[:label_name].present? - @issues = @issues.includes(:author, :project).order("updated_at") - - # Filter by specific assignee_id (or lack thereof)? - if params[:assignee_id].present? - @issues = @issues.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) - end - - # Filter by specific milestone_id (or lack thereof)? - if params[:milestone_id].present? - @issues = @issues.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) - end - - @issues - end - - def issues_filter - { - all: "all", - closed: "closed", - to_me: "assigned-to-me", - open: "open" - } + @issues = IssuesListContext.new(project, current_user, params).execute end end diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index f8d8426..8e180c9 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -18,7 +18,7 @@ class MergeRequestsController < ProjectResourceController def index - @merge_requests = MergeRequestsLoad.new(project, current_user, params).execute + @merge_requests = MergeRequestsLoadContext.new(project, current_user, params).execute end def show @@ -55,7 +55,7 @@ class MergeRequestsController < ProjectResourceController @merge_request.reload_code redirect_to [@project, @merge_request], notice: 'Merge request was successfully created.' else - render action: "new" + render action: "new" end end @@ -70,7 +70,7 @@ class MergeRequestsController < ProjectResourceController end def automerge_check - if @merge_request.unchecked? + if @merge_request.unchecked? @merge_request.check_if_can_be_merged end render json: {state: @merge_request.human_state} @@ -125,7 +125,7 @@ class MergeRequestsController < ProjectResourceController def validates_merge_request # Show git not found page if target branch doesnt exist - return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) + return git_not_found! unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) # Show git not found page if source branch doesnt exist # and there is no saved commits between source & target branch @@ -136,7 +136,7 @@ class MergeRequestsController < ProjectResourceController # Build a note object for comment form @note = @project.notes.new(noteable: @merge_request) - # Get commits from repository + # Get commits from repository # or from cache if already merged @commits = @merge_request.commits @commits = CommitDecorator.decorate(@commits) diff --git a/app/controllers/milestones_controller.rb b/app/controllers/milestones_controller.rb index 68479a2..f8fe987 100644 --- a/app/controllers/milestones_controller.rb +++ b/app/controllers/milestones_controller.rb @@ -54,7 +54,7 @@ class MilestonesController < ProjectResourceController respond_to do |format| format.js - format.html do + format.html do if @milestone.valid? redirect_to [@project, @milestone] else diff --git a/app/controllers/refs_controller.rb b/app/controllers/refs_controller.rb index d3fc816..6a1a360 100644 --- a/app/controllers/refs_controller.rb +++ b/app/controllers/refs_controller.rb @@ -9,9 +9,9 @@ class RefsController < ProjectResourceController before_filter :ref before_filter :define_tree_vars, only: [:blob, :logs_tree] - def switch - respond_to do |format| - format.html do + def switch + respond_to do |format| + format.html do new_path = if params[:destination] == "tree" project_tree_path(@project, @ref) else diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 71e2d92..1dc8507 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,15 +1,9 @@ class SearchController < ApplicationController def show - query = params[:search] + result = SearchContext.new(current_user.project_ids, params).execute - @projects = [] - @merge_requests = [] - @issues = [] - - if query.present? - @projects = current_user.projects.search(query).limit(10) - @merge_requests = MergeRequest.where(project_id: current_user.project_ids).search(query).limit(10) - @issues = Issue.where(project_id: current_user.project_ids).search(query).limit(10) - end + @projects = result[:projects] + @merge_requests = result[:merge_requests] + @issues = result[:issues] end end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 9b53718..99ea9ef 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -43,4 +43,13 @@ module IssuesHelper # Milestone uses :title, Issue uses :name OpenStruct.new(id: 0, title: 'Unspecified', name: 'Unassigned') end + + def issues_filter + { + all: "all", + closed: "closed", + to_me: "assigned-to-me", + open: "open" + } + end end diff --git a/app/models/event.rb b/app/models/event.rb index 647abdb..0ea3224 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -30,6 +30,7 @@ class Event < ActiveRecord::Base # Scopes scope :recent, order("created_at DESC") scope :code_push, where(action: Pushed) + scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } class << self def determine_action(record) @@ -39,10 +40,6 @@ class Event < ActiveRecord::Base Event::Commented end end - - def recent_for_user user - where(project_id: user.projects.map(&:id)).recent - end end # Next events currently enabled for system diff --git a/app/roles/issue_commonality.rb b/app/roles/issue_commonality.rb index 4aee916..3d90748 100644 --- a/app/roles/issue_commonality.rb +++ b/app/roles/issue_commonality.rb @@ -1,5 +1,4 @@ -# Contains common functionality -# shared between Issues and MergeRequests +# Contains common functionality shared between Issues and MergeRequests module IssueCommonality extend ActiveSupport::Concern @@ -18,6 +17,7 @@ module IssueCommonality scope :closed, where(closed: true) scope :of_group, ->(group) { where(project_id: group.project_ids) } scope :assigned, ->(u) { where(assignee_id: u.id)} + scope :recent, order("created_at DESC") delegate :name, :email, -- libgit2 0.21.2