Files
gitlabhq/lib/ci/api/projects.rb
T

158 lines
4.9 KiB
Ruby

module Ci
module API
# Projects API
class Projects < Grape::API
before { authenticate! }
resource :projects do
# Retrieve all Gitlab CI projects that the user has access to
#
# Example Request:
# GET /projects
get do
gitlab_projects = current_user.authorized_projects
gitlab_projects = filter_projects(gitlab_projects)
gitlab_projects = paginate gitlab_projects
ids = gitlab_projects.map { |project| project.id }
projects = Ci::Project.where("gitlab_id IN (?)", ids).load
present projects, with: Entities::Project
end
# Retrieve all Gitlab CI projects that the user owns
#
# Example Request:
# GET /projects/owned
get "owned" do
gitlab_projects = current_user.owned_projects
gitlab_projects = filter_projects(gitlab_projects)
gitlab_projects = paginate gitlab_projects
ids = gitlab_projects.map { |project| project.id }
projects = Ci::Project.where("gitlab_id IN (?)", ids).load
present projects, with: Entities::Project
end
# Retrieve info for a Gitlab CI project
#
# Parameters:
# id (required) - The ID of a project
# Example Request:
# GET /projects/:id
get ":id" do
project = Ci::Project.find(params[:id])
unauthorized! unless can?(current_user, :read_project, project.gl_project)
present project, with: Entities::Project
end
# Create Gitlab CI project using Gitlab project info
#
# Parameters:
# gitlab_id (required) - The gitlab id of the project
# default_ref - The branch to run against (defaults to `master`)
# Example Request:
# POST /projects
post do
required_attributes! [:gitlab_id]
filtered_params = {
gitlab_id: params[:gitlab_id],
# we accept gitlab_url for backward compatibility for a while (added to 7.11)
default_ref: params[:default_ref] || 'master'
}
project = Ci::Project.new(filtered_params)
project.build_missing_services
if project.save
present project, with: Entities::Project
else
errors = project.errors.full_messages.join(", ")
render_api_error!(errors, 400)
end
end
# Update a Gitlab CI project
#
# Parameters:
# id (required) - The ID of a project
# default_ref - The branch to run against (defaults to `master`)
# Example Request:
# PUT /projects/:id
put ":id" do
project = Ci::Project.find(params[:id])
unauthorized! unless can?(current_user, :admin_project, project.gl_project)
attrs = attributes_for_keys [:default_ref]
if project.update_attributes(attrs)
present project, with: Entities::Project
else
errors = project.errors.full_messages.join(", ")
render_api_error!(errors, 400)
end
end
# Link a Gitlab CI project to a runner
#
# Parameters:
# id (required) - The ID of a CI project
# runner_id (required) - The ID of a runner
# Example Request:
# POST /projects/:id/runners/:runner_id
post ":id/runners/:runner_id" do
project = Ci::Project.find(params[:id])
runner = Ci::Runner.find(params[:runner_id])
unauthorized! unless can?(current_user, :admin_project, project.gl_project)
options = {
project_id: project.id,
runner_id: runner.id
}
runner_project = Ci::RunnerProject.new(options)
if runner_project.save
present runner_project, with: Entities::RunnerProject
else
errors = project.errors.full_messages.join(", ")
render_api_error!(errors, 400)
end
end
# Remove a Gitlab CI project from a runner
#
# Parameters:
# id (required) - The ID of a CI project
# runner_id (required) - The ID of a runner
# Example Request:
# DELETE /projects/:id/runners/:runner_id
delete ":id/runners/:runner_id" do
project = Ci::Project.find(params[:id])
runner = Ci::Runner.find(params[:runner_id])
unauthorized! unless can?(current_user, :admin_project, project.gl_project)
options = {
project_id: project.id,
runner_id: runner.id
}
runner_project = Ci::RunnerProject.find_by(options)
if runner_project.present?
runner_project.destroy
else
not_found!
end
end
end
end
end
end