project.rb 11.9 KB
Newer Older
1
require 'constraints/project_url_constrainer'
2
require 'gitlab/routes/legacy_builds'
3 4 5 6

resources :projects, only: [:index, :new, :create]

draw :git_http
7

8
constraints(ProjectUrlConstrainer.new) do
9 10 11 12 13 14 15 16
  # 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
17
  # `Gitlab::PathRegex.full_namespace_route_regex`, which helps the router
18 19 20 21 22 23
  # 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,
24
        namespace_id: Gitlab::PathRegex.full_namespace_route_regex) do
25
    scope(path: ':project_id',
26
          constraints: { project_id: Gitlab::PathRegex.project_route_regex },
27 28
          module: :projects,
          as: :project) do
29

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

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
      #
      # Templates
      #
      get '/templates/:template_type/:key' => 'templates#show', as: :template

      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
        end
      end

57
      resource :pages, only: [:show, :destroy] do
58
        resources :domains, only: [:show, :new, :create, :destroy], controller: 'pages_domains', constraints: { id: /[^\/]+/ }
59 60
      end

61 62
      resources :snippets, concerns: :awardable, constraints: { id: /\d+/ } do
        member do
63
          get :raw
64
          post :mark_as_spam
65 66 67 68 69
        end
      end

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

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

76 77 78 79
      namespace :prometheus do
        get :active_metrics
      end

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

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

90
      resources :merge_requests, concerns: :awardable, except: [:new, :create], constraints: { id: /\d+/ } do
91
        member do
Fatih Acet's avatar
Fatih Acet committed
92
          get :commit_change_content
93
          post :merge
94
          post :cancel_merge_when_pipeline_succeeds
95
          get :pipeline_status
96
          get :ci_environments_status
97 98
          post :toggle_subscription
          post :remove_wip
99
          post :assign_related_issues
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

          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
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
        end

        collection do
          get :diff_for_path
          post :bulk_update
        end

        resources :discussions, only: [], constraints: { id: /\h{40}/ } do
          member do
            post :resolve
            delete :resolve, action: :unresolve
          end
        end
      end

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
      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

158
      resources :variables, only: [:index, :show, :update, :create, :destroy]
159 160 161 162 163
      resources :triggers, only: [:index, :create, :edit, :update, :destroy] do
        member do
          post :take_ownership
        end
      end
164 165 166 167

      resources :pipelines, only: [:index, :new, :create, :show] do
        collection do
          resource :pipelines_settings, path: 'settings', only: [:show, :update]
168
          get :charts
169 170 171
        end

        member do
172
          get :stage
173 174
          post :cancel
          post :retry
Filipa Lacerda's avatar
Filipa Lacerda committed
175
          get :builds
176
          get :failures
177
          get :status
178 179 180
        end
      end

181 182 183 184 185 186
      resources :pipeline_schedules, except: [:show] do
        member do
          post :take_ownership
        end
      end

187
      resources :environments, except: [:destroy] do
188 189
        member do
          post :stop
190
          get :terminal
191
          get :metrics
192
          get :additional_metrics
193
          get '/terminal.ws/authorize', to: 'environments#terminal_websocket_authorize', constraints: { format: nil }
194
        end
195 196

        collection do
197
          get :folder, path: 'folders/*id', constraints: { format: /(html|json)/ }
198
        end
199

Fatih Acet's avatar
Fatih Acet committed
200 201 202
        resources :deployments, only: [:index] do
          member do
            get :metrics
203
            get :additional_metrics
Fatih Acet's avatar
Fatih Acet committed
204 205
          end
        end
206
      end
207 208 209

      resource :cycle_analytics, only: [:show]

210
      namespace :cycle_analytics do
211
        scope :events, controller: 'events' do
212 213 214 215 216 217 218
          get :issue
          get :plan
          get :code
          get :test
          get :review
          get :staging
          get :production
219 220 221
        end
      end

222 223 224 225 226 227 228 229 230 231 232
      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
233 234 235
            end
          end

236 237 238 239 240 241 242 243 244
          member do
            get :status
            post :cancel
            post :retry
            post :play
            post :erase
            get :trace, defaults: { format: 'json' }
            get :raw
          end
245

246 247 248 249 250 251 252
          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
253 254 255
        end
      end

256
      Gitlab::Routes::LegacyBuilds.new(self).draw
257

258
      resources :hooks, only: [:index, :create, :edit, :update, :destroy], constraints: { id: /\d+/ } do
259 260 261
        member do
          get :test
        end
262 263 264 265 266 267

        resources :hook_logs, only: [:show] do
          member do
            get :retry
          end
        end
268 269
      end

270
      resources :container_registry, only: [:index, :destroy],
271
                                     controller: 'registry/repositories'
272

273 274
      namespace :registry do
        resources :repository, only: [] do
275
          resources :tags, only: [:destroy],
276
                           constraints: { id: Gitlab::Regex.container_registry_reference_regex }
277 278
        end
      end
279 280 281 282 283

      resources :milestones, constraints: { id: /\d+/ } do
        member do
          put :sort_issues
          put :sort_merge_requests
284 285 286
          get :merge_requests
          get :participants
          get :labels
287 288 289 290 291 292 293 294 295 296
        end
      end

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

        member do
297
          post :promote
298 299 300 301 302 303 304 305 306 307 308 309
          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
          get :referenced_merge_requests
          get :related_branches
          get :can_create_branch
310
          get :realtime_changes
311
          post :create_merge_request
312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
        end
        collection do
          post  :bulk_update
        end
      end

      resources :project_members, except: [:show, :new, :edit], constraints: { id: /[a-zA-Z.\/0-9_\-#%+]+/ }, concerns: :access_requestable do
        collection do
          delete :leave

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

        member do
          post :resend_invite
        end
      end

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

335
      resources :notes, only: [:create, :destroy, :update], concerns: :awardable, constraints: { id: /\d+/ } do
336 337 338 339 340 341 342
        member do
          delete :delete_attachment
          post :resolve
          delete :resolve, action: :unresolve
        end
      end

343 344
      get 'noteable/:target_type/:target_id/notes' => 'notes#index', as: 'noteable_notes'

345
      resources :boards, only: [:index, :show] do
346
        scope module: :boards do
347
          resources :issues, only: [:index, :update]
348 349 350 351 352 353

          resources :lists, only: [:index, :create, :update, :destroy] do
            collection do
              post :generate
            end

354
            resources :issues, only: [:index, :create]
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
          end
        end
      end

      resources :todos, only: [:create]

      resources :uploads, only: [:create] do
        collection do
          get ":secret/:filename", action: :show, as: :show, constraints: { filename: /[^\/]+/ }
        end
      end

      resources :runners, only: [:index, :edit, :update, :destroy, :show] do
        member do
          get :resume
          get :pause
        end

        collection do
          post :toggle_shared_runners
        end
      end

      resources :runner_projects, only: [:create, :destroy]
      resources :badges, only: [:index] do
        collection do
381
          scope '*ref', constraints: { ref: Gitlab::PathRegex.git_reference_regex } do
382 383 384 385 386 387 388
            constraints format: /svg/ do
              get :build
              get :coverage
            end
          end
        end
      end
389 390
      namespace :settings do
        resource :members, only: [:show]
391
        resource :ci_cd, only: [:show], controller: 'ci_cd'
392
        resource :integrations, only: [:show]
393
        resource :repository, only: [:show], controller: :repository
394 395
      end

396 397 398 399
      # Since both wiki and repository routing contains wildcard characters
      # its preferable to keep it below all other project routes
      draw :wiki
      draw :repository
400
    end
401 402 403

    resources(:projects,
              path: '/',
404
              constraints: { id: Gitlab::PathRegex.project_route_regex },
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
              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
        put :new_issue_address
      end
    end
423 424
  end
end