2012-06-29 12:46:01 +02:00
|
|
|
module Gitlab
|
|
|
|
# Projects API
|
|
|
|
class Projects < Grape::API
|
|
|
|
before { authenticate! }
|
|
|
|
|
|
|
|
resource :projects do
|
|
|
|
# Get a projects list for authenticated user
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects
|
|
|
|
get do
|
2012-09-03 13:46:29 +02:00
|
|
|
@projects = paginate current_user.projects
|
2012-08-11 00:07:50 +02:00
|
|
|
present @projects, with: Entities::Project
|
2012-06-29 12:46:01 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Get a single project
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 12:46:01 +02:00
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id
|
|
|
|
get ":id" do
|
2012-08-11 00:07:50 +02:00
|
|
|
present user_project, with: Entities::Project
|
2012-06-29 12:46:01 +02:00
|
|
|
end
|
|
|
|
|
2012-08-31 09:15:37 +02:00
|
|
|
# Create new project
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# name (required) - name for new project
|
2012-08-31 10:11:12 +02:00
|
|
|
# code (optional) - code for new project, uses project name if not set
|
|
|
|
# path (optional) - path for new project, uses project name if not set
|
2012-09-03 17:00:24 +02:00
|
|
|
# description (optional) - short project description
|
|
|
|
# default_branch (optional) - 'master' by default
|
|
|
|
# issues_enabled (optional) - enabled by default
|
|
|
|
# wall_enabled (optional) - enabled by default
|
|
|
|
# merge_requests_enabled (optional) - enabled by default
|
|
|
|
# wiki_enabled (optional) - enabled by default
|
2012-08-31 09:15:37 +02:00
|
|
|
# Example Request
|
|
|
|
# POST /projects
|
|
|
|
post do
|
2012-09-05 10:44:47 +02:00
|
|
|
params[:code] ||= params[:name]
|
|
|
|
params[:path] ||= params[:name]
|
|
|
|
project_attrs = {}
|
|
|
|
params.each_pair do |k ,v|
|
|
|
|
if Project.attribute_names.include? k
|
|
|
|
project_attrs[k] = v
|
|
|
|
end
|
|
|
|
end
|
|
|
|
@project = Project.create_by_user(project_attrs, current_user)
|
2012-08-31 09:15:37 +02:00
|
|
|
if @project.saved?
|
|
|
|
present @project, with: Entities::Project
|
|
|
|
else
|
2012-09-10 09:41:46 +02:00
|
|
|
not_found!
|
2012-08-31 09:15:37 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-09-06 22:49:29 +02:00
|
|
|
# Get project users
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/users
|
|
|
|
get ":id/users" do
|
|
|
|
@users_projects = paginate user_project.users_projects
|
|
|
|
present @users_projects, with: Entities::UsersProject
|
|
|
|
end
|
|
|
|
|
2012-09-05 22:01:03 +02:00
|
|
|
# Add users to project with specified access level
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# user_ids (required) - The ID list of users to add
|
|
|
|
# project_access (required) - Project access level
|
|
|
|
# Example Request:
|
2012-09-06 22:49:29 +02:00
|
|
|
# POST /projects/:id/users
|
|
|
|
post ":id/users" do
|
2012-09-10 08:06:11 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-05 23:13:25 +02:00
|
|
|
user_project.add_users_ids_to_team(params[:user_ids].values, params[:project_access])
|
2012-09-08 19:01:08 +02:00
|
|
|
nil
|
2012-09-05 22:01:03 +02:00
|
|
|
end
|
|
|
|
|
2012-09-06 22:49:29 +02:00
|
|
|
# Update users to specified access level
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# user_ids (required) - The ID list of users to add
|
|
|
|
# project_access (required) - New project access level to
|
|
|
|
# Example Request:
|
|
|
|
# PUT /projects/:id/add_users
|
|
|
|
put ":id/users" do
|
2012-09-10 08:06:11 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-06 22:49:29 +02:00
|
|
|
user_project.update_users_ids_to_role(params[:user_ids].values, params[:project_access])
|
2012-09-08 19:01:08 +02:00
|
|
|
nil
|
2012-09-06 22:49:29 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Delete project users
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# user_ids (required) - The ID list of users to delete
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /projects/:id/users
|
|
|
|
delete ":id/users" do
|
2012-09-10 08:06:11 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-06 22:49:29 +02:00
|
|
|
user_project.delete_users_ids_from_team(params[:user_ids].values)
|
2012-09-08 19:01:08 +02:00
|
|
|
nil
|
2012-09-06 22:49:29 +02:00
|
|
|
end
|
|
|
|
|
2012-09-08 19:51:12 +02:00
|
|
|
# Get project hooks
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/hooks
|
|
|
|
get ":id/hooks" do
|
2012-09-10 15:50:01 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-08 19:51:12 +02:00
|
|
|
@hooks = paginate user_project.hooks
|
|
|
|
present @hooks, with: Entities::Hook
|
|
|
|
end
|
|
|
|
|
|
|
|
# Add hook to project
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# url (required) - The hook URL
|
|
|
|
# Example Request:
|
|
|
|
# POST /projects/:id/hooks
|
|
|
|
post ":id/hooks" do
|
2012-09-10 15:50:01 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-08 19:51:12 +02:00
|
|
|
@hook = user_project.hooks.new({"url" => params[:url]})
|
|
|
|
if @hook.save
|
|
|
|
present @hook, with: Entities::Hook
|
|
|
|
else
|
|
|
|
error!({'message' => '404 Not found'}, 404)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Delete project hook
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
|
|
|
# hook_id (required) - The ID of hook to delete
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /projects/:id/hooks
|
|
|
|
delete ":id/hooks" do
|
2012-09-10 15:50:01 +02:00
|
|
|
authorize! :admin_project, user_project
|
2012-09-08 19:51:12 +02:00
|
|
|
@hook = user_project.hooks.find(params[:hook_id])
|
|
|
|
@hook.destroy
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
2012-06-29 12:46:01 +02:00
|
|
|
# Get a project repository branches
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 12:46:01 +02:00
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/repository/branches
|
|
|
|
get ":id/repository/branches" do
|
2012-08-11 00:07:50 +02:00
|
|
|
present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject
|
2012-06-29 12:46:01 +02:00
|
|
|
end
|
|
|
|
|
2012-07-26 16:29:53 +02:00
|
|
|
# Get a single branch
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
2012-08-01 14:48:15 +02:00
|
|
|
# branch (required) - The name of the branch
|
2012-07-26 16:29:53 +02:00
|
|
|
# Example Request:
|
2012-08-01 14:48:15 +02:00
|
|
|
# GET /projects/:id/repository/branches/:branch
|
|
|
|
get ":id/repository/branches/:branch" do
|
|
|
|
@branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
|
2012-08-11 00:07:50 +02:00
|
|
|
present @branch, with: Entities::RepoObject
|
2012-07-26 16:29:53 +02:00
|
|
|
end
|
|
|
|
|
2012-06-29 12:46:01 +02:00
|
|
|
# Get a project repository tags
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 12:46:01 +02:00
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/repository/tags
|
|
|
|
get ":id/repository/tags" do
|
2012-08-11 00:07:50 +02:00
|
|
|
present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
|
2012-06-29 12:46:01 +02:00
|
|
|
end
|
2012-06-29 15:34:08 +02:00
|
|
|
|
|
|
|
# Get a project snippet
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 15:34:08 +02:00
|
|
|
# snippet_id (required) - The ID of a project snippet
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/snippets/:snippet_id
|
|
|
|
get ":id/snippets/:snippet_id" do
|
2012-07-06 15:08:17 +02:00
|
|
|
@snippet = user_project.snippets.find(params[:snippet_id])
|
2012-08-11 00:07:50 +02:00
|
|
|
present @snippet, with: Entities::ProjectSnippet
|
2012-06-29 15:34:08 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Create a new project snippet
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 15:34:08 +02:00
|
|
|
# title (required) - The title of a snippet
|
|
|
|
# file_name (required) - The name of a snippet file
|
|
|
|
# lifetime (optional) - The expiration date of a snippet
|
|
|
|
# code (required) - The content of a snippet
|
|
|
|
# Example Request:
|
|
|
|
# POST /projects/:id/snippets
|
|
|
|
post ":id/snippets" do
|
2012-07-06 15:08:17 +02:00
|
|
|
@snippet = user_project.snippets.new(
|
2012-08-11 00:07:50 +02:00
|
|
|
title: params[:title],
|
|
|
|
file_name: params[:file_name],
|
|
|
|
expires_at: params[:lifetime],
|
|
|
|
content: params[:code]
|
2012-06-29 15:34:08 +02:00
|
|
|
)
|
|
|
|
@snippet.author = current_user
|
|
|
|
|
|
|
|
if @snippet.save
|
2012-08-11 00:07:50 +02:00
|
|
|
present @snippet, with: Entities::ProjectSnippet
|
2012-06-29 15:34:08 +02:00
|
|
|
else
|
2012-09-10 09:41:46 +02:00
|
|
|
not_found!
|
2012-06-29 15:34:08 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-07-04 11:03:32 +02:00
|
|
|
# Update an existing project snippet
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-07-04 11:03:32 +02:00
|
|
|
# snippet_id (required) - The ID of a project snippet
|
|
|
|
# title (optional) - The title of a snippet
|
|
|
|
# file_name (optional) - The name of a snippet file
|
|
|
|
# lifetime (optional) - The expiration date of a snippet
|
|
|
|
# code (optional) - The content of a snippet
|
|
|
|
# Example Request:
|
|
|
|
# PUT /projects/:id/snippets/:snippet_id
|
|
|
|
put ":id/snippets/:snippet_id" do
|
2012-07-06 15:08:17 +02:00
|
|
|
@snippet = user_project.snippets.find(params[:snippet_id])
|
2012-09-10 08:06:11 +02:00
|
|
|
authorize! :modify_snippet, @snippet
|
|
|
|
|
2012-07-04 11:03:32 +02:00
|
|
|
parameters = {
|
2012-08-11 00:07:50 +02:00
|
|
|
title: (params[:title] || @snippet.title),
|
|
|
|
file_name: (params[:file_name] || @snippet.file_name),
|
|
|
|
expires_at: (params[:lifetime] || @snippet.expires_at),
|
|
|
|
content: (params[:code] || @snippet.content)
|
2012-07-04 11:03:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if @snippet.update_attributes(parameters)
|
2012-08-11 00:07:50 +02:00
|
|
|
present @snippet, with: Entities::ProjectSnippet
|
2012-07-04 11:03:32 +02:00
|
|
|
else
|
2012-09-10 09:41:46 +02:00
|
|
|
not_found!
|
2012-07-04 11:03:32 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-29 15:34:08 +02:00
|
|
|
# Delete a project snippet
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-06-29 15:34:08 +02:00
|
|
|
# snippet_id (required) - The ID of a project snippet
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /projects/:id/snippets/:snippet_id
|
|
|
|
delete ":id/snippets/:snippet_id" do
|
2012-07-06 15:08:17 +02:00
|
|
|
@snippet = user_project.snippets.find(params[:snippet_id])
|
2012-09-10 08:06:11 +02:00
|
|
|
authorize! :modify_snippet, @snippet
|
|
|
|
|
2012-06-29 15:34:08 +02:00
|
|
|
@snippet.destroy
|
|
|
|
end
|
2012-07-04 11:03:32 +02:00
|
|
|
|
|
|
|
# Get a raw project snippet
|
|
|
|
#
|
|
|
|
# Parameters:
|
2012-07-25 11:35:41 +02:00
|
|
|
# id (required) - The ID or code name of a project
|
2012-07-04 11:03:32 +02:00
|
|
|
# snippet_id (required) - The ID of a project snippet
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/snippets/:snippet_id/raw
|
|
|
|
get ":id/snippets/:snippet_id/raw" do
|
2012-07-06 15:08:17 +02:00
|
|
|
@snippet = user_project.snippets.find(params[:snippet_id])
|
2012-08-01 14:57:56 +02:00
|
|
|
content_type 'text/plain'
|
2012-07-04 11:03:32 +02:00
|
|
|
present @snippet.content
|
|
|
|
end
|
2012-07-26 16:29:53 +02:00
|
|
|
|
|
|
|
# Get a raw file contents
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - The ID or code name of a project
|
2012-08-01 14:48:15 +02:00
|
|
|
# sha (required) - The commit or branch name
|
2012-07-26 16:29:53 +02:00
|
|
|
# filepath (required) - The path to the file to display
|
|
|
|
# Example Request:
|
|
|
|
# GET /projects/:id/repository/commits/:sha/blob
|
|
|
|
get ":id/repository/commits/:sha/blob" do
|
|
|
|
ref = params[:sha]
|
|
|
|
|
|
|
|
commit = user_project.commit ref
|
2012-09-10 09:41:46 +02:00
|
|
|
not_found! "Commit" unless commit
|
2012-08-01 14:48:15 +02:00
|
|
|
|
2012-07-26 16:29:53 +02:00
|
|
|
tree = Tree.new commit.tree, user_project, ref, params[:filepath]
|
2012-09-10 09:41:46 +02:00
|
|
|
not_found! "File" unless tree.try(:tree)
|
2012-08-01 14:48:15 +02:00
|
|
|
|
2012-07-26 16:29:53 +02:00
|
|
|
if tree.text?
|
|
|
|
encoding = Gitlab::Encode.detect_encoding(tree.data)
|
|
|
|
content_type encoding ? "text/plain; charset=#{encoding}" : "text/plain"
|
|
|
|
else
|
|
|
|
content_type tree.mime_type
|
|
|
|
end
|
|
|
|
|
|
|
|
present tree.data
|
|
|
|
end
|
|
|
|
|
2012-06-29 12:46:01 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|