diff options
Diffstat (limited to 'app/serializers/pipeline_entity.rb')
-rw-r--r-- | app/serializers/pipeline_entity.rb | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb new file mode 100644 index 00000000000..08346b4ed77 --- /dev/null +++ b/app/serializers/pipeline_entity.rb @@ -0,0 +1,92 @@ +class PipelineEntity < Grape::Entity + include RequestAwareEntity + + expose :id + expose :user, if: proc { created_exposure? }, using: UserEntity + + expose :url do |pipeline| + namespace_project_pipeline_path( + pipeline.project.namespace, + pipeline.project, + pipeline) + end + + expose :details, if: proc { updated_exposure? } do + expose :status + expose :duration + expose :finished_at + expose :stages_with_statuses, as: :stages, using: PipelineStageEntity + expose :artifacts, using: PipelineArtifactEntity + expose :manual_actions, using: PipelineActionEntity + end + + expose :flags, if: proc { created_exposure? } do + expose :latest?, as: :latest + expose :triggered?, as: :triggered + + expose :yaml_errors?, as: :yaml_errors do |pipeline| + pipeline.yaml_errors.present? + end + + expose :stuck?, as: :stuck do |pipeline| + pipeline.builds.any?(&:stuck?) + end + end + + expose :ref, if: proc { updated_exposure? } do + expose :name do |pipeline| + pipeline.ref + end + + expose :url do |pipeline| + namespace_project_tree_url( + pipeline.project.namespace, + pipeline.project, + id: pipeline.ref) + end + + expose :tag? + end + + expose :commit, if: proc { created_exposure? }, using: CommitEntity + + expose :retry_url, if: proc { updated_exposure? } do |pipeline| + can?(request.user, :update_pipeline, pipeline.project) && + pipeline.retryable? && + retry_namespace_project_pipeline_path(pipeline.project.namespace, + pipeline.project, pipeline.id) + end + + expose :cancel_url, if: proc { updated_exposure? } do |pipeline| + can?(request.user, :update_pipeline, pipeline.project) && + pipeline.cancelable? && + cancel_namespace_project_pipeline_path(pipeline.project.namespace, + pipeline.project, pipeline.id) + end + + expose :created_at, :updated_at + + def created_exposure? + !incremental? || created? + end + + def updated_exposure? + !incremental? || updated? + end + + def incremental? + options[:incremental] && last_updated + end + + def last_updated + options.fetch(:last_updated) + end + + def updated? + @object.updated_at > last_updated + end + + def created? + @object.created_at > last_updated + end +end |