gitlabhq/lib/api/projects.rb

199 lines
6.4 KiB
Ruby
Raw Normal View History

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
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
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-08-31 09:15:37 +02:00
# Example Request
# POST /projects
post do
project = {}
project[:name] = params[:name]
project[:code] = params[:code] || project[:name]
project[:path] = params[:path] || project[:name]
@project = Project.create_by_user(project, current_user)
if @project.saved?
present @project, with: Entities::Project
else
error!({'message' => '404 Not found'}, 404)
end
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
present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject
2012-06-29 12:46:01 +02:00
end
# 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
# 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] }
present @branch, with: Entities::RepoObject
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
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])
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(
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
present @snippet, with: Entities::ProjectSnippet
2012-06-29 15:34:08 +02:00
else
error!({'message' => '404 Not found'}, 404)
end
end
# Update an existing project snippet
#
# Parameters:
2012-07-25 11:35:41 +02:00
# id (required) - The ID or code name of a project
# 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])
parameters = {
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)
}
if @snippet.update_attributes(parameters)
present @snippet, with: Entities::ProjectSnippet
else
error!({'message' => '404 Not found'}, 404)
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-06-29 15:34:08 +02:00
@snippet.destroy
end
# Get a raw project snippet
#
# Parameters:
2012-07-25 11:35:41 +02:00
# id (required) - The ID or code name of a project
# 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'
present @snippet.content
end
# 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
# 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
error!('404 Commit Not Found', 404) unless commit
2012-08-01 14:48:15 +02:00
tree = Tree.new commit.tree, user_project, ref, params[:filepath]
error!('404 File Not Found', 404) unless tree.try(:tree)
2012-08-01 14:48:15 +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