PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/app/controllers/concerns/issuable_collections.rb

https://gitlab.com/alexsanford/gitlab-ce
Ruby | 114 lines | 82 code | 22 blank | 10 comment | 17 complexity | a9dc34f04da15628fbae024f10da1180 MD5 | raw file
  1. module IssuableCollections
  2. extend ActiveSupport::Concern
  3. include SortingHelper
  4. included do
  5. helper_method :issues_finder
  6. helper_method :merge_requests_finder
  7. end
  8. private
  9. def issuable_meta_data(issuable_collection, collection_type)
  10. # map has to be used here since using pluck or select will
  11. # throw an error when ordering issuables by priority which inserts
  12. # a new order into the collection.
  13. # We cannot use reorder to not mess up the paginated collection.
  14. issuable_ids = issuable_collection.map(&:id)
  15. issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type)
  16. issuable_votes_count = AwardEmoji.votes_for_collection(issuable_ids, @collection_type)
  17. issuable_merge_requests_count =
  18. if collection_type == 'Issue'
  19. MergeRequestsClosingIssues.count_for_collection(issuable_ids)
  20. else
  21. []
  22. end
  23. issuable_ids.each_with_object({}) do |id, issuable_meta|
  24. downvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.downvote? }
  25. upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? }
  26. notes = issuable_note_count.find { |notes| notes.noteable_id == id }
  27. merge_requests = issuable_merge_requests_count.find { |mr| mr.first == id }
  28. issuable_meta[id] = Issuable::IssuableMeta.new(
  29. upvotes.try(:count).to_i,
  30. downvotes.try(:count).to_i,
  31. notes.try(:count).to_i,
  32. merge_requests.try(:last).to_i
  33. )
  34. end
  35. end
  36. def issues_collection
  37. issues_finder.execute.preload(:project, :author, :assignee, :labels, :milestone, project: :namespace)
  38. end
  39. def merge_requests_collection
  40. merge_requests_finder.execute.preload(:source_project, :target_project, :author, :assignee, :labels, :milestone, :merge_request_diff, target_project: :namespace)
  41. end
  42. def issues_finder
  43. @issues_finder ||= issuable_finder_for(IssuesFinder)
  44. end
  45. def merge_requests_finder
  46. @merge_requests_finder ||= issuable_finder_for(MergeRequestsFinder)
  47. end
  48. def issuable_finder_for(finder_class)
  49. finder_class.new(current_user, filter_params)
  50. end
  51. def filter_params
  52. set_sort_order_from_cookie
  53. set_default_scope
  54. set_default_state
  55. @filter_params = params.dup
  56. @filter_params[:sort] ||= default_sort_order
  57. @sort = @filter_params[:sort]
  58. if @project
  59. @filter_params[:project_id] = @project.id
  60. elsif @group
  61. @filter_params[:group_id] = @group.id
  62. else
  63. # TODO: this filter ignore issues/mr created in public or
  64. # internal repos where you are not a member. Enable this filter
  65. # or improve current implementation to filter only issues you
  66. # created or assigned or mentioned
  67. # @filter_params[:authorized_only] = true
  68. end
  69. @filter_params
  70. end
  71. def set_default_scope
  72. params[:scope] = 'all' if params[:scope].blank?
  73. end
  74. def set_default_state
  75. params[:state] = 'opened' if params[:state].blank?
  76. end
  77. def set_sort_order_from_cookie
  78. key = 'issuable_sort'
  79. cookies[key] = params[:sort] if params[:sort].present?
  80. # id_desc and id_asc are old values for these two.
  81. cookies[key] = sort_value_recently_created if cookies[key] == 'id_desc'
  82. cookies[key] = sort_value_oldest_created if cookies[key] == 'id_asc'
  83. params[:sort] = cookies[key]
  84. end
  85. def default_sort_order
  86. case params[:state]
  87. when 'opened', 'all' then sort_value_recently_created
  88. when 'merged', 'closed' then sort_value_recently_updated
  89. else sort_value_recently_created
  90. end
  91. end
  92. end