Read about our upcoming Code of Conduct on this issue

project.rb 13 KB
Newer Older
1
2
3
resources :projects, only: [:index, :new, :create]

draw :git_http
4

5
constraints(::Constraints::ProjectUrlConstrainer.new) do
6
7
8
9
10
11
12
13
  # If the route has a wildcard segment, the segment has a regex constraint,
  # the segment is potentially followed by _another_ wildcard segment, and
  # the `format` option is not set to false, we need to specify that
  # regex constraint _outside_ of `constraints: {}`.
  #
  # Otherwise, Rails will overwrite the constraint with `/.+?/`,
  # which breaks some of our wildcard routes like `/blob/*id`
  # and `/tree/*id` that depend on the negative lookahead inside
14
  # `Gitlab::PathRegex.full_namespace_route_regex`, which helps the router
15
16
17
18
19
20
  # determine whether a certain path segment is part of `*namespace_id`,
  # `:project_id`, or `*id`.
  #
  # See https://github.com/rails/rails/blob/v4.2.8/actionpack/lib/action_dispatch/routing/mapper.rb#L155
  scope(path: '*namespace_id',
        as: :namespace,
21
        namespace_id: Gitlab::PathRegex.full_namespace_route_regex) do
22
    scope(path: ':project_id',
23
          constraints: { project_id: Gitlab::PathRegex.project_route_regex },
24
25
          module: :projects,
          as: :project) do
26

27
28
29
30
31
32
33
34
35
36
37
      resources :autocomplete_sources, only: [] do
        collection do
          get 'members'
          get 'issues'
          get 'merge_requests'
          get 'labels'
          get 'milestones'
          get 'commands'
        end
      end

38
39
40
      #
      # Templates
      #
41
      get '/templates/:template_type/:key' => 'templates#show', as: :template, constraints: { key: %r{[^/]+} }
42
43
44
45
46
47
48
49
50

      resource  :avatar, only: [:show, :destroy]
      resources :commit, only: [:show], constraints: { id: /\h{7,40}/ } do
        member do
          get :branches
          get :pipelines
          post :revert
          post :cherry_pick
          get :diff_for_path
51
          get :merge_requests
52
53
54
        end
      end

Rob Watson's avatar
Rob Watson committed
55
      resource :pages, only: [:show, :update, :destroy] do
56
        resources :domains, except: :index, controller: 'pages_domains', constraints: { id: %r{[^/]+} } do
57
58
59
60
          member do
            post :verify
          end
        end
61
62
      end

63
64
      resources :snippets, concerns: :awardable, constraints: { id: /\d+/ } do
        member do
65
          get :raw
Sean McGivern's avatar
Sean McGivern committed
66
          post :mark_as_spam
67
68
69
        end
      end

70
      resources :services, constraints: { id: %r{[^/]+} }, only: [:edit, :update] do
71
        member do
72
          put :test
73
74
75
        end
      end

Kamil Trzcinski's avatar
Kamil Trzcinski committed
76
      resource :mattermost, only: [:new, :create]
Z.J. van de Weg's avatar
Z.J. van de Weg committed
77

78
      namespace :prometheus do
79
80
81
        resources :metrics, constraints: { id: %r{[^\/]+} }, only: [] do
          get :active_common, on: :collection
        end
82
83
      end

84
      resources :deploy_keys, constraints: { id: /\d+/ }, only: [:index, :new, :create, :edit, :update] do
85
86
87
88
89
90
91
92
93
        member do
          put :enable
          put :disable
        end
      end

      resources :forks, only: [:index, :new, :create]
      resource :import, only: [:new, :create, :show]

Douwe Maan's avatar
Douwe Maan committed
94
      resources :merge_requests, concerns: :awardable, except: [:new, :create], constraints: { id: /\d+/ } do
95
        member do
Fatih Acet's avatar
Fatih Acet committed
96
          get :commit_change_content
97
          post :merge
98
          post :cancel_merge_when_pipeline_succeeds
99
          get :pipeline_status
100
          get :ci_environments_status
101
102
          post :toggle_subscription
          post :remove_wip
103
          post :assign_related_issues
104
          get :discussions, format: :json
105
          post :rebase
Douwe Maan's avatar
Douwe Maan committed
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

          scope constraints: { format: nil }, action: :show do
            get :commits, defaults: { tab: 'commits' }
            get :pipelines, defaults: { tab: 'pipelines' }
            get :diffs, defaults: { tab: 'diffs' }
          end

          scope constraints: { format: 'json' }, as: :json do
            get :commits
            get :pipelines
            get :diffs, to: 'merge_requests/diffs#show'
          end

          get :diff_for_path, controller: 'merge_requests/diffs'

          scope controller: 'merge_requests/conflicts' do
            get :conflicts, action: :show
            get :conflict_for_path
            post :resolve_conflicts
          end
126
127
128
129
130
131
132
        end

        collection do
          get :diff_for_path
          post :bulk_update
        end

133
        resources :discussions, only: [:show], constraints: { id: /\h{40}/ } do
134
135
136
137
138
139
140
          member do
            post :resolve
            delete :resolve, action: :unresolve
          end
        end
      end

Douwe Maan's avatar
Douwe Maan committed
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
      controller 'merge_requests/creations', path: 'merge_requests' do
        post '', action: :create, as: nil

        scope path: 'new', as: :new_merge_request do
          get '', action: :new

          scope constraints: { format: nil }, action: :new do
            get :diffs, defaults: { tab: 'diffs' }
            get :pipelines, defaults: { tab: 'pipelines' }
          end

          scope constraints: { format: 'json' }, as: :json do
            get :diffs
            get :pipelines
          end

          get :diff_for_path
          get :update_branches
          get :branch_from
          get :branch_to
        end
      end

164
      resource :variables, only: [:show, :update]
165

166
167
168
169
170
      resources :triggers, only: [:index, :create, :edit, :update, :destroy] do
        member do
          post :take_ownership
        end
      end
171
172
173
174

      resources :pipelines, only: [:index, :new, :create, :show] do
        collection do
          resource :pipelines_settings, path: 'settings', only: [:show, :update]
175
          get :charts
176
177
178
        end

        member do
179
          get :stage
180
181
          post :cancel
          post :retry
Filipa Lacerda's avatar
Filipa Lacerda committed
182
          get :builds
183
          get :failures
184
          get :status
185
186
187
        end
      end

188
189
      resources :pipeline_schedules, except: [:show] do
        member do
190
          post :play
191
192
193
194
          post :take_ownership
        end
      end

195
      resources :clusters, except: [:edit, :create] do
196
        collection do
197
198
199
200
201
202
203
204
          scope :providers do
            get '/user/new', to: 'clusters/user#new'
            post '/user', to: 'clusters/user#create'

            get '/gcp/new', to: 'clusters/gcp#new'
            get '/gcp/login', to: 'clusters/gcp#login'
            post '/gcp', to: 'clusters/gcp#create'
          end
205
        end
206
207

        member do
208
          get :status, format: :json
209

210
          scope :applications do
211
            post '/:application', to: 'clusters/applications#create', as: :install_applications
212
          end
213
        end
214
215
      end

216
      resources :environments, except: [:destroy] do
217
218
        member do
          post :stop
219
          get :terminal
220
          get :metrics
221
          get :additional_metrics
222
          get '/terminal.ws/authorize', to: 'environments#terminal_websocket_authorize', constraints: { format: nil }
223
        end
224
225

        collection do
226
          get :folder, path: 'folders/*id', constraints: { format: /(html|json)/ }
227
        end
228

Fatih Acet's avatar
Fatih Acet committed
229
230
231
        resources :deployments, only: [:index] do
          member do
            get :metrics
232
            get :additional_metrics
Fatih Acet's avatar
Fatih Acet committed
233
234
          end
        end
235
      end
236
237
238

      resource :cycle_analytics, only: [:show]

239
      namespace :cycle_analytics do
240
        scope :events, controller: 'events' do
241
242
243
244
245
246
247
          get :issue
          get :plan
          get :code
          get :test
          get :review
          get :staging
          get :production
248
249
250
        end
      end

251
252
253
254
255
256
257
258
259
260
261
      scope '-' do
        resources :jobs, only: [:index, :show], constraints: { id: /\d+/ } do
          collection do
            post :cancel_all

            resources :artifacts, only: [] do
              collection do
                get :latest_succeeded,
                  path: '*ref_name_and_path',
                  format: false
              end
262
263
264
            end
          end

265
266
267
268
269
270
271
272
273
          member do
            get :status
            post :cancel
            post :retry
            post :play
            post :erase
            get :trace, defaults: { format: 'json' }
            get :raw
          end
274

275
276
277
278
279
280
281
          resource :artifacts, only: [] do
            get :download
            get :browse, path: 'browse(/*path)', format: false
            get :file, path: 'file/*path', format: false
            get :raw, path: 'raw/*path', format: false
            post :keep
          end
282
283
284
        end
      end

Lin Jen-Shin's avatar
Lin Jen-Shin committed
285
      draw :legacy_builds
286

287
      resources :hooks, only: [:index, :create, :edit, :update, :destroy], constraints: { id: /\d+/ } do
288
289
290
        member do
          get :test
        end
Alexander Randa's avatar
Alexander Randa committed
291
292
293
294
295
296

        resources :hook_logs, only: [:show] do
          member do
            get :retry
          end
        end
297
298
      end

299
      resources :container_registry, only: [:index, :destroy],
300
                                     controller: 'registry/repositories'
301

302
303
      namespace :registry do
        resources :repository, only: [] do
304
305
306
307
308
309
310
          # We default to JSON format in the controller to avoid ambiguity.
          # `latest.json` could either be a request for a tag named `latest`
          # in JSON format, or a request for tag named `latest.json`.
          scope format: false do
            resources :tags, only: [:index, :destroy],
                             constraints: { id: Gitlab::Regex.container_registry_tag_regex }
          end
311
312
        end
      end
313
314
315

      resources :milestones, constraints: { id: /\d+/ } do
        member do
316
          post :promote
317
318
          put :sort_issues
          put :sort_merge_requests
319
320
321
          get :merge_requests
          get :participants
          get :labels
322
323
324
325
326
327
328
329
330
331
        end
      end

      resources :labels, except: [:show], constraints: { id: /\d+/ } do
        collection do
          post :generate
          post :set_priorities
        end

        member do
332
          post :promote
333
334
335
336
337
338
339
340
341
          post :toggle_subscription
          delete :remove_priority
        end
      end

      resources :issues, concerns: :awardable, constraints: { id: /\d+/ } do
        member do
          post :toggle_subscription
          post :mark_as_spam
342
          post :move
343
344
345
          get :referenced_merge_requests
          get :related_branches
          get :can_create_branch
346
          get :realtime_changes
347
          post :create_merge_request
348
          get :discussions, format: :json
349
350
351
352
353
354
        end
        collection do
          post  :bulk_update
        end
      end

355
      resources :project_members, except: [:show, :new, :edit], constraints: { id: %r{[a-zA-Z./0-9_\-#%+]+} }, concerns: :access_requestable do
356
357
358
359
360
361
362
363
364
365
366
367
368
369
        collection do
          delete :leave

          # Used for import team
          # from another project
          get :import
          post :apply_import
        end

        member do
          post :resend_invite
        end
      end

370
      resources :group_links, only: [:index, :create, :update, :destroy], constraints: { id: /\d+/ }
371

372
      resources :notes, only: [:create, :destroy, :update], concerns: :awardable, constraints: { id: /\d+/ } do
373
374
375
376
377
378
379
        member do
          delete :delete_attachment
          post :resolve
          delete :resolve, action: :unresolve
        end
      end

380
381
      get 'noteable/:target_type/:target_id/notes' => 'notes#index', as: 'noteable_notes'

382
      # On CE only index and show are needed
Felipe Artur's avatar
Felipe Artur committed
383
      resources :boards, only: [:index, :show]
384
385
386
387
388

      resources :todos, only: [:create]

      resources :uploads, only: [:create] do
        collection do
389
          get ":secret/:filename", action: :show, as: :show, constraints: { filename: %r{[^/]+} }
390
391
392
393
394
        end
      end

      resources :runners, only: [:index, :edit, :update, :destroy, :show] do
        member do
395
396
          post :resume
          post :pause
397
398
399
400
401
402
403
404
405
406
        end

        collection do
          post :toggle_shared_runners
        end
      end

      resources :runner_projects, only: [:create, :destroy]
      resources :badges, only: [:index] do
        collection do
407
          scope '*ref', constraints: { ref: Gitlab::PathRegex.git_reference_regex } do
408
            constraints format: /svg/ do
409
410
411
              # Keep around until 10.0, see gitlab-org/gitlab-ce#35307
              get :build, to: "badges#pipeline"
              get :pipeline
412
413
414
415
416
              get :coverage
            end
          end
        end
      end
417
      namespace :settings do
418
        get :members, to: redirect("%{namespace_id}/%{project_id}/project_members")
419
        resource :ci_cd, only: [:show], controller: 'ci_cd' do
420
          post :reset_cache
421
        end
422
        resource :integrations, only: [:show]
423
        resource :repository, only: [:show], controller: :repository
424
425
      end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
426
427
428
429
      # Since both wiki and repository routing contains wildcard characters
      # its preferable to keep it below all other project routes
      draw :wiki
      draw :repository
430
    end
431
432
433

    resources(:projects,
              path: '/',
434
              constraints: { id: Gitlab::PathRegex.project_route_regex },
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
              only: [:edit, :show, :update, :destroy]) do
      member do
        put :transfer
        delete :remove_fork
        post :archive
        post :unarchive
        post :housekeeping
        post :toggle_star
        post :preview_markdown
        post :export
        post :remove_export
        post :generate_new_export
        get :download_export
        get :activity
        get :refs
450
        put :new_issuable_address
451
452
      end
    end
453
454
  end
end