211 lines
6.9 KiB
Ruby
211 lines
6.9 KiB
Ruby
|
module Ci
|
||
|
module API
|
||
|
# Projects API
|
||
|
class Projects < Grape::API
|
||
|
before { authenticate! }
|
||
|
|
||
|
resource :projects do
|
||
|
# Register new webhook for project
|
||
|
#
|
||
|
# Parameters
|
||
|
# project_id (required) - The ID of a project
|
||
|
# web_hook (required) - WebHook URL
|
||
|
# Example Request
|
||
|
# POST /projects/:project_id/webhooks
|
||
|
post ":project_id/webhooks" do
|
||
|
required_attributes! [:web_hook]
|
||
|
|
||
|
project = Ci::Project.find(params[:project_id])
|
||
|
|
||
|
unauthorized! unless can?(current_user, :admin_project, project.gl_project)
|
||
|
|
||
|
web_hook = project.web_hooks.new({ url: params[:web_hook] })
|
||
|
|
||
|
if web_hook.save
|
||
|
present web_hook, with: Entities::WebHook
|
||
|
else
|
||
|
errors = web_hook.errors.full_messages.join(", ")
|
||
|
render_api_error!(errors, 400)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# 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:
|
||
|
# name (required) - The name of the project
|
||
|
# gitlab_id (required) - The gitlab id of the project
|
||
|
# path (required) - The gitlab project path, ex. randx/six
|
||
|
# ssh_url_to_repo (required) - The gitlab ssh url to the repo
|
||
|
# default_ref - The branch to run against (defaults to `master`)
|
||
|
# Example Request:
|
||
|
# POST /projects
|
||
|
post do
|
||
|
required_attributes! [:name, :gitlab_id, :ssh_url_to_repo]
|
||
|
|
||
|
filtered_params = {
|
||
|
name: params[:name],
|
||
|
gitlab_id: params[:gitlab_id],
|
||
|
# we accept gitlab_url for backward compatibility for a while (added to 7.11)
|
||
|
path: params[:path] || params[:gitlab_url].sub(/.*\/(.*\/.*)$/, '\1'),
|
||
|
default_ref: params[:default_ref] || 'master',
|
||
|
ssh_url_to_repo: params[:ssh_url_to_repo]
|
||
|
}
|
||
|
|
||
|
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
|
||
|
# name - The name of the project
|
||
|
# gitlab_id - The gitlab id of the project
|
||
|
# path - The gitlab project path, ex. randx/six
|
||
|
# ssh_url_to_repo - The gitlab ssh url to the repo
|
||
|
# 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 [:name, :gitlab_id, :path, :gitlab_url, :default_ref, :ssh_url_to_repo]
|
||
|
|
||
|
# we accept gitlab_url for backward compatibility for a while (added to 7.11)
|
||
|
if attrs[:gitlab_url] && !attrs[:path]
|
||
|
attrs[:path] = attrs[:gitlab_url].sub(/.*\/(.*\/.*)$/, '\1')
|
||
|
end
|
||
|
|
||
|
if project.update_attributes(attrs)
|
||
|
present project, with: Entities::Project
|
||
|
else
|
||
|
errors = project.errors.full_messages.join(", ")
|
||
|
render_api_error!(errors, 400)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# Remove a Gitlab CI project
|
||
|
#
|
||
|
# Parameters:
|
||
|
# id (required) - The ID of a project
|
||
|
# Example Request:
|
||
|
# DELETE /projects/:id
|
||
|
delete ":id" do
|
||
|
project = Ci::Project.find(params[:id])
|
||
|
|
||
|
unauthorized! unless can?(current_user, :admin_project, project.gl_project)
|
||
|
|
||
|
project.destroy
|
||
|
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
|