diff options
Diffstat (limited to 'app/models/analytics/devops_adoption/segment_selection.rb')
-rw-r--r-- | app/models/analytics/devops_adoption/segment_selection.rb | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/app/models/analytics/devops_adoption/segment_selection.rb b/app/models/analytics/devops_adoption/segment_selection.rb new file mode 100644 index 00000000000..6b70c13a773 --- /dev/null +++ b/app/models/analytics/devops_adoption/segment_selection.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class Analytics::DevopsAdoption::SegmentSelection < ApplicationRecord + ALLOWED_SELECTIONS_PER_SEGMENT = 20 + + belongs_to :segment + belongs_to :project + belongs_to :group + + validates :segment, presence: true + validates :project, presence: { unless: :group } + validates :project_id, uniqueness: { scope: :segment_id, if: :project } + validates :group, presence: { unless: :project } + validates :group_id, uniqueness: { scope: :segment_id, if: :group } + + validate :exclusive_project_or_group + validate :validate_selection_count + + private + + def exclusive_project_or_group + if project.present? && group.present? + errors.add(:group, s_('DevopsAdoptionSegmentSelection|The selection cannot be configured for a project and for a group at the same time')) + end + end + + def validate_selection_count + return unless segment + + selection_count_for_segment = self.class.where(segment: segment).count + + if selection_count_for_segment >= ALLOWED_SELECTIONS_PER_SEGMENT + errors.add(:segment, s_('DevopsAdoptionSegmentSelection|The maximum number of selections has been reached')) + end + end +end |