summaryrefslogtreecommitdiff
path: root/lib/api/helpers/merge_requests_helpers.rb
blob: eed9fa30d3c9ae8ef36233c5c6474cc92ad5bd76 (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# frozen_string_literal: true

module API
  module Helpers
    module MergeRequestsHelpers
      extend Grape::API::Helpers
      extend ActiveSupport::Concern

      UNPROCESSABLE_ERROR_KEYS = [:project_access, :branch_conflict, :validate_fork, :base].freeze

      params :ee_approval_params do
      end

      params :merge_requests_negatable_params do
        optional :author_id, type: Integer, desc: 'Return merge requests which are authored by the user with the given ID'
        optional :author_username, type: String, desc: 'Return merge requests which are authored by the user with the given username'
        mutually_exclusive :author_id, :author_username

        optional :assignee_id,
                 types: [Integer, String],
                 integer_none_any: true,
                 desc: 'Return merge requests which are assigned to the user with the given ID'
        optional :assignee_username,
                 type: Array[String],
                 check_assignees_count: true,
                 coerce_with: Validations::Validators::CheckAssigneesCount.coerce,
                 desc: 'Return merge requests which are assigned to the user with the given username'
        mutually_exclusive :assignee_id, :assignee_username
        optional :reviewer_username,
                 type: String,
                 desc: 'Return merge requests which have the user as a reviewer with the given username'

        optional :labels,
                 type: Array[String],
                 coerce_with: Validations::Types::CommaSeparatedToArray.coerce,
                 desc: 'Comma-separated list of label names'
        optional :milestone, type: String, desc: 'Return merge requests for a specific milestone'
        optional :my_reaction_emoji, type: String, desc: 'Return issues reacted by the authenticated user by the given emoji'
      end

      params :merge_requests_base_params do
        use :merge_requests_negatable_params
        optional :reviewer_id,
                 types: [Integer, String],
                 integer_none_any: true,
                 desc: 'Return merge requests which have the user as a reviewer with the given ID'
        mutually_exclusive :reviewer_id, :reviewer_username
        optional :state,
                 type: String,
                 values: %w[opened closed locked merged all],
                 default: 'all',
                 desc: 'Return opened, closed, locked, merged, or all merge requests'
        optional :order_by,
                 type: String,
                 values: Helpers::MergeRequestsHelpers.sort_options,
                 default: 'created_at',
                 desc: "Return merge requests ordered by #{Helpers::MergeRequestsHelpers.sort_options_help} fields."
        optional :sort,
                 type: String,
                 values: %w[asc desc],
                 default: 'desc',
                 desc: 'Return merge requests sorted in `asc` or `desc` order.'
        optional :with_labels_details, type: Boolean, desc: 'Return titles of labels and other details', default: false
        optional :with_merge_status_recheck, type: Boolean, desc: 'Request that stale merge statuses be rechecked asynchronously', default: false
        optional :created_after, type: DateTime, desc: 'Return merge requests created after the specified time'
        optional :created_before, type: DateTime, desc: 'Return merge requests created before the specified time'
        optional :updated_after, type: DateTime, desc: 'Return merge requests updated after the specified time'
        optional :updated_before, type: DateTime, desc: 'Return merge requests updated before the specified time'
        optional :view,
                 type: String,
                 values: %w[simple],
                 desc: 'If simple, returns the `iid`, URL, title, description, and basic state of merge request'

        optional :scope,
                 type: String,
                 values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
                 desc: 'Return merge requests for the given scope: `created_by_me`, `assigned_to_me` or `all`'
        optional :source_branch, type: String, desc: 'Return merge requests with the given source branch'
        optional :source_project_id, type: Integer, desc: 'Return merge requests with the given source project id'
        optional :target_branch, type: String, desc: 'Return merge requests with the given target branch'
        optional :search,
                 type: String,
                 desc: 'Search merge requests for text present in the title, description, or any combination of these'
        optional :in, type: String, desc: '`title`, `description`, or a string joining them with comma'
        optional :wip, type: String, values: %w[yes no], desc: 'Search merge requests for WIP in the title'
        optional :not, type: Hash, desc: 'Parameters to negate' do
          use :merge_requests_negatable_params
          optional :reviewer_id,
            types: Integer,
            desc: 'Return merge requests which have the user as a reviewer with the given ID'
          mutually_exclusive :reviewer_id, :reviewer_username
        end

        optional :deployed_before,
          'Return merge requests deployed before the given date/time'
        optional :deployed_after,
          'Return merge requests deployed after the given date/time'
        optional :environment,
          'Returns merge requests deployed to the given environment'
      end

      params :optional_scope_param do
        optional :scope,
                 type: String,
                 values: %w[created-by-me assigned-to-me created_by_me assigned_to_me all],
                 default: 'created_by_me',
                 desc: 'Return merge requests for the given scope: `created_by_me`, `assigned_to_me` or `all`'
      end

      def handle_merge_request_errors!(merge_request)
        return if merge_request.valid?

        errors = merge_request.errors

        UNPROCESSABLE_ERROR_KEYS.each do |error|
          unprocessable_entity!(errors[error]) if errors.has_key?(error)
        end

        conflict!(errors[:validate_branches]) if errors.has_key?(:validate_branches)

        render_validation_error!(merge_request)
      end

      def self.sort_options
        %w[
          created_at
          label_priority
          milestone_due
          popularity
          priority
          title
          updated_at
        ]
      end

      def self.sort_options_help
        sort_options.map { |y| "`#{y}`" }.to_sentence(last_word_connector: ' or ')
      end
    end
  end
end

API::Helpers::MergeRequestsHelpers.prepend_mod_with('API::Helpers::MergeRequestsHelpers')