summaryrefslogtreecommitdiff
path: root/app/models/issue.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/issue.rb')
-rw-r--r--app/models/issue.rb43
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