127 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module API
 | |
|   # Environments RESTfull API endpoints
 | |
|   class Environments < ::API::Base
 | |
|     include PaginationParams
 | |
| 
 | |
|     before { authenticate! }
 | |
| 
 | |
|     params do
 | |
|       requires :id, type: String, desc: 'The project ID'
 | |
|     end
 | |
|     resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
 | |
|       desc 'Get all environments of the project' do
 | |
|         detail 'This feature was introduced in GitLab 8.11.'
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         use :pagination
 | |
|         optional :name, type: String, desc: 'Returns the environment with this name'
 | |
|         optional :search, type: String, desc: 'Returns list of environments matching the search criteria'
 | |
|         mutually_exclusive :name, :search, message: 'cannot be used together'
 | |
|       end
 | |
|       get ':id/environments' do
 | |
|         authorize! :read_environment, user_project
 | |
| 
 | |
|         environments = ::EnvironmentsFinder.new(user_project, current_user, params).find
 | |
| 
 | |
|         present paginate(environments), with: Entities::Environment, current_user: current_user
 | |
|       end
 | |
| 
 | |
|       desc 'Creates a new environment' do
 | |
|         detail 'This feature was introduced in GitLab 8.11.'
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         requires :name,           type: String,   desc: 'The name of the environment to be created'
 | |
|         optional :external_url,   type: String,   desc: 'URL on which this deployment is viewable'
 | |
|         optional :slug, absence: { message: "is automatically generated and cannot be changed" }
 | |
|       end
 | |
|       post ':id/environments' do
 | |
|         authorize! :create_environment, user_project
 | |
| 
 | |
|         environment = user_project.environments.create(declared_params)
 | |
| 
 | |
|         if environment.persisted?
 | |
|           present environment, with: Entities::Environment, current_user: current_user
 | |
|         else
 | |
|           render_validation_error!(environment)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       desc 'Updates an existing environment' do
 | |
|         detail 'This feature was introduced in GitLab 8.11.'
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         requires :environment_id, type: Integer,  desc: 'The environment ID'
 | |
|         optional :name,           type: String,   desc: 'The new environment name'
 | |
|         optional :external_url,   type: String,   desc: 'The new URL on which this deployment is viewable'
 | |
|         optional :slug, absence: { message: "is automatically generated and cannot be changed" }
 | |
|       end
 | |
|       put ':id/environments/:environment_id' do
 | |
|         authorize! :update_environment, user_project
 | |
| 
 | |
|         environment = user_project.environments.find(params[:environment_id])
 | |
| 
 | |
|         update_params = declared_params(include_missing: false).extract!(:name, :external_url)
 | |
|         if environment.update(update_params)
 | |
|           present environment, with: Entities::Environment, current_user: current_user
 | |
|         else
 | |
|           render_validation_error!(environment)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       desc 'Deletes an existing environment' do
 | |
|         detail 'This feature was introduced in GitLab 8.11.'
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         requires :environment_id, type: Integer, desc: 'The environment ID'
 | |
|       end
 | |
|       delete ':id/environments/:environment_id' do
 | |
|         authorize! :read_environment, user_project
 | |
| 
 | |
|         environment = user_project.environments.find(params[:environment_id])
 | |
|         authorize! :destroy_environment, environment
 | |
| 
 | |
|         destroy_conditionally!(environment)
 | |
|       end
 | |
| 
 | |
|       desc 'Stops an existing environment' do
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         requires :environment_id, type: Integer, desc: 'The environment ID'
 | |
|       end
 | |
|       post ':id/environments/:environment_id/stop' do
 | |
|         authorize! :read_environment, user_project
 | |
| 
 | |
|         environment = user_project.environments.find(params[:environment_id])
 | |
|         authorize! :stop_environment, environment
 | |
| 
 | |
|         environment.stop_with_action!(current_user)
 | |
| 
 | |
|         status 200
 | |
|         present environment, with: Entities::Environment, current_user: current_user
 | |
|       end
 | |
| 
 | |
|       desc 'Get a single environment' do
 | |
|         success Entities::Environment
 | |
|       end
 | |
|       params do
 | |
|         requires :environment_id, type: Integer, desc: 'The environment ID'
 | |
|       end
 | |
|       get ':id/environments/:environment_id' do
 | |
|         authorize! :read_environment, user_project
 | |
| 
 | |
|         environment = user_project.environments.find(params[:environment_id])
 | |
|         present environment, with: Entities::Environment, current_user: current_user,
 | |
|                              except: [:project, { last_deployment: [:environment] }],
 | |
|                              last_deployment: true
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |