summaryrefslogtreecommitdiff
path: root/app/models/concerns/analytics/cycle_analytics/stage.rb
diff options
context:
space:
mode:
authorAdam Hegyi <ahegyi@gitlab.com>2019-08-23 20:28:11 +0000
committerMayra Cabrera <mcabrera@gitlab.com>2019-08-23 20:28:11 +0000
commit60e33885269bdae71e9710b17f199708b9b7c9e0 (patch)
treefce6fa4f2c779c4b3c5088577cc4fb26196da182 /app/models/concerns/analytics/cycle_analytics/stage.rb
parent0a94aac8a291ef8432dadfb4cbd70ecae62becff (diff)
downloadgitlab-ce-60e33885269bdae71e9710b17f199708b9b7c9e0.tar.gz
Implement validation logic to ProjectStage
- Introducting StageEvents to define the available events - Define the event pairing rules, since some events are not compatible - Express default Cycle Analytics stages with the event structure
Diffstat (limited to 'app/models/concerns/analytics/cycle_analytics/stage.rb')
-rw-r--r--app/models/concerns/analytics/cycle_analytics/stage.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/app/models/concerns/analytics/cycle_analytics/stage.rb b/app/models/concerns/analytics/cycle_analytics/stage.rb
new file mode 100644
index 00000000000..0c603c2d5e6
--- /dev/null
+++ b/app/models/concerns/analytics/cycle_analytics/stage.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module Analytics
+ module CycleAnalytics
+ module Stage
+ extend ActiveSupport::Concern
+
+ included do
+ validates :name, presence: true
+ validates :start_event_identifier, presence: true
+ validates :end_event_identifier, presence: true
+ validate :validate_stage_event_pairs
+
+ enum start_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :start_event_identifier
+ enum end_event_identifier: Gitlab::Analytics::CycleAnalytics::StageEvents.to_enum, _prefix: :end_event_identifier
+
+ alias_attribute :custom_stage?, :custom
+ end
+
+ def parent=(_)
+ raise NotImplementedError
+ end
+
+ def parent
+ raise NotImplementedError
+ end
+
+ def start_event
+ Gitlab::Analytics::CycleAnalytics::StageEvents[start_event_identifier].new(params_for_start_event)
+ end
+
+ def end_event
+ Gitlab::Analytics::CycleAnalytics::StageEvents[end_event_identifier].new(params_for_end_event)
+ end
+
+ def params_for_start_event
+ {}
+ end
+
+ def params_for_end_event
+ {}
+ end
+
+ def default_stage?
+ !custom
+ end
+
+ # The model that is going to be queried, Issue or MergeRequest
+ def subject_model
+ start_event.object_type
+ end
+
+ private
+
+ def validate_stage_event_pairs
+ return if start_event_identifier.nil? || end_event_identifier.nil?
+
+ unless pairing_rules.fetch(start_event.class, []).include?(end_event.class)
+ errors.add(:end_event, :not_allowed_for_the_given_start_event)
+ end
+ end
+
+ def pairing_rules
+ Gitlab::Analytics::CycleAnalytics::StageEvents.pairing_rules
+ end
+ end
+ end
+end