diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /app/models/issue_link.rb | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) | |
download | gitlab-ce-85dc423f7090da0a52c73eb66faf22ddb20efff9.tar.gz |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'app/models/issue_link.rb')
-rw-r--r-- | app/models/issue_link.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/app/models/issue_link.rb b/app/models/issue_link.rb new file mode 100644 index 00000000000..9740b009396 --- /dev/null +++ b/app/models/issue_link.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +class IssueLink < ApplicationRecord + include FromUnion + + belongs_to :source, class_name: 'Issue' + belongs_to :target, class_name: 'Issue' + + validates :source, presence: true + validates :target, presence: true + validates :source, uniqueness: { scope: :target_id, message: 'is already related' } + validate :check_self_relation + + scope :for_source_issue, ->(issue) { where(source_id: issue.id) } + scope :for_target_issue, ->(issue) { where(target_id: issue.id) } + + TYPE_RELATES_TO = 'relates_to' + TYPE_BLOCKS = 'blocks' + TYPE_IS_BLOCKED_BY = 'is_blocked_by' + + enum link_type: { TYPE_RELATES_TO => 0, TYPE_BLOCKS => 1, TYPE_IS_BLOCKED_BY => 2 } + + def self.inverse_link_type(type) + type + end + + private + + def check_self_relation + return unless source && target + + if source == target + errors.add(:source, 'cannot be related to itself') + end + end +end + +IssueLink.prepend_if_ee('EE::IssueLink') |