diff options
Diffstat (limited to 'app/models/issue.rb')
-rw-r--r-- | app/models/issue.rb | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/app/models/issue.rb b/app/models/issue.rb index 47dc084d69c..537e16e5cc3 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -63,6 +63,7 @@ class Issue < ApplicationRecord has_many :issue_assignees has_many :issue_email_participants + has_one :email has_many :assignees, class_name: "User", through: :issue_assignees has_many :zoom_meetings has_many :user_mentions, class_name: "IssueUserMention", dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent @@ -228,9 +229,37 @@ class Issue < ApplicationRecord end end + def next_object_by_relative_position(ignoring: nil, order: :asc) + return super unless Feature.enabled?(:optimized_issue_neighbor_queries, project, default_enabled: :yaml) + + array_mapping_scope = -> (id_expression) do + relation = Issue.where(Issue.arel_table[:project_id].eq(id_expression)) + + if order == :asc + relation.where(Issue.arel_table[:relative_position].gt(relative_position)) + else + relation.where(Issue.arel_table[:relative_position].lt(relative_position)) + end + end + + relation = Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new( + scope: Issue.order(relative_position: order, id: order), + array_scope: relative_positioning_parent_projects, + array_mapping_scope: array_mapping_scope, + finder_query: -> (_, id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } + ).execute + + relation = exclude_self(relation, excluded: ignoring) if ignoring.present? + + relation.take + end + + def relative_positioning_parent_projects + project.group&.root_ancestor&.all_projects&.select(:id) || Project.id_in(project).select(:id) + end + def self.relative_positioning_query_base(issue) - projects = issue.project.group&.root_ancestor&.all_projects || issue.project - in_projects(projects) + in_projects(issue.relative_positioning_parent_projects) end def self.relative_positioning_parent_column @@ -433,8 +462,6 @@ class Issue < ApplicationRecord # Returns `true` if the current issue can be viewed by either a logged in User # or an anonymous user. def visible_to_user?(user = nil) - return false unless project && project.feature_available?(:issues, user) - return publicly_visible? unless user return false unless readable_by?(user) @@ -562,10 +589,10 @@ class Issue < ApplicationRecord project.team.member?(user, Gitlab::Access::REPORTER) elsif hidden? false + elsif project.public? || (project.internal? && !user.external?) + project.feature_available?(:issues, user) else - project.public? || - project.internal? && !user.external? || - project.team.member?(user) + project.team.member?(user) end end @@ -604,7 +631,7 @@ class Issue < ApplicationRecord def could_not_move(exception) # Symptom of running out of space - schedule rebalancing - IssueRebalancingWorker.perform_async(nil, *project.self_or_root_group_ids) + Issues::RebalancingWorker.perform_async(nil, *project.self_or_root_group_ids) end end |