summaryrefslogtreecommitdiff
path: root/lib/atlassian/jira_connect/serializers/deployment_entity.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/atlassian/jira_connect/serializers/deployment_entity.rb')
-rw-r--r--lib/atlassian/jira_connect/serializers/deployment_entity.rb90
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/atlassian/jira_connect/serializers/deployment_entity.rb b/lib/atlassian/jira_connect/serializers/deployment_entity.rb
new file mode 100644
index 00000000000..9ef1666b61c
--- /dev/null
+++ b/lib/atlassian/jira_connect/serializers/deployment_entity.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+module Atlassian
+ module JiraConnect
+ module Serializers
+ class DeploymentEntity < Grape::Entity
+ include Gitlab::Routing
+
+ format_with(:iso8601, &:iso8601)
+
+ expose :schema_version, as: :schemaVersion
+ expose :iid, as: :deploymentSequenceNumber
+ expose :update_sequence_id, as: :updateSequenceNumber
+ expose :display_name, as: :displayName
+ expose :description
+ expose :associations
+ expose :url
+ expose :label
+ expose :state
+ expose :updated_at, as: :lastUpdated, format_with: :iso8601
+ expose :pipeline_entity, as: :pipeline
+ expose :environment_entity, as: :environment
+
+ def issue_keys
+ return [] unless build&.pipeline.present?
+
+ @issue_keys ||= BuildEntity.new(build.pipeline).issue_keys
+ end
+
+ private
+
+ delegate :project, :deployable, :environment, :iid, :ref, :short_sha, to: :object
+ alias_method :deployment, :object
+ alias_method :build, :deployable
+
+ def associations
+ keys = issue_keys
+
+ [{ associationType: :issueKeys, values: keys }] if keys.present?
+ end
+
+ def display_name
+ "Deployment #{iid} (#{ref}@#{short_sha}) to #{environment.name}"
+ end
+
+ def label
+ "#{project.full_path}-#{environment.name}-#{iid}-#{short_sha}"
+ end
+
+ def description
+ "Deployment #{deployment.iid} of #{project.name} at #{short_sha} (#{build&.name}) to #{environment.name}"
+ end
+
+ def url
+ # There is no controller action to show a single deployment, so we
+ # link to the build instead
+ project_job_url(project, build) if build
+ end
+
+ def state
+ case deployment.status
+ when 'created' then 'pending'
+ when 'running' then 'in_progress'
+ when 'success' then 'successful'
+ when 'failed' then 'failed'
+ when 'canceled', 'skipped' then 'cancelled'
+ else
+ 'unknown'
+ end
+ end
+
+ def schema_version
+ '1.0'
+ end
+
+ def pipeline_entity
+ PipelineEntity.new(build.pipeline) if build&.pipeline.present?
+ end
+
+ def environment_entity
+ EnvironmentEntity.new(environment)
+ end
+
+ def update_sequence_id
+ options[:update_sequence_id] || Client.generate_update_sequence_id
+ end
+ end
+ end
+ end
+end