summaryrefslogtreecommitdiff
path: root/lib/api/commit_statuses.rb
blob: 41c05334296e2f13d45563b62c6da3b7bf63f737 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
require 'mime/types'

module API
  # Project commit statuses API
  class CommitStatus < Grape::API
    resource :projects do
      before { authenticate! }
      before { authorize! :read_commit_statuses, user_project }

      # Get a commit's statuses
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   sha (required) - The commit hash
      #   ref (optional) - The ref
      #   stage (optional) - The stage
      #   name (optional) - The name
      #   all (optional) - Show all statuses, default: false
      # Examples:
      #   GET /projects/:id/repository/commits/:sha/statuses
      get ':id/repository/commits/:sha/statuses' do
        sha = params[:sha]
        ci_commit = user_project.ci_commit(sha)
        not_found! 'Commit' unless ci_commit
        statuses = ci_commit.statuses
        statuses = statuses.latest unless parse_boolean(params[:all])
        statuses = statuses.where(ref: params[:ref]) if params[:ref].present?
        statuses = statuses.where(name: params[:stage]) if params[:stage].present?
        statuses = statuses.where(name: params[:name]) if params[:name].present?
        present paginate(statuses), with: Entities::CommitStatus
      end

      # Post status to commit
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   sha (required) - The commit hash
      #   ref (optional) - The ref
      #   state (required) - The state of the status. Can be: pending, running, success, error or failure
      #   target_url (optional) - The target URL to associate with this status
      #   description (optional) - A short description of the status
      #   name or context (optional) - A string label to differentiate this status from the status of other systems. Default: "default"
      # Examples:
      #   POST /projects/:id/statuses/:sha
      post ':id/statuses/:sha' do
        required_attributes! [:state]
        attrs = attributes_for_keys [:ref, :target_url, :description, :context, :name]
        commit = @project.commit(params[:sha])
        not_found! 'Commit' unless commit

        ci_commit = @project.ensure_ci_commit(commit.sha)

        name = params[:name] || params[:context]
        status = GenericCommitStatus.running_or_pending.find_by(commit: ci_commit, name: name, ref: params[:ref])
        status = GenericCommitStatus.new(commit: ci_commit) unless status
        status.update(attrs)

        case params[:state].to_s
          when 'running'
            status.run
          when 'success'
            status.success
          when 'failed'
            status.drop
          when 'canceled'
            status.cancel
          else
            status.status = params[:state].to_s
        end

        if status.save
          present status, with: Entities::CommitStatus
        else
          render_validation_error!(status)
        end
      end
    end
  end
end