Skip to content
Snippets Groups Projects
projects.rb 6.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @projects = paginate current_user.projects
    
            present @projects, with: Entities::Project
    
          end
    
          # Get a single project
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
          # Example Request:
          #   GET /projects/:id
          get ":id" do
    
            present user_project, with: Entities::Project
    
          # Create new project
          #
          # Parameters:
          #   name (required) - name for new project
    
    Alex Denisov's avatar
    Alex Denisov committed
          #   code (optional) - code for new project, uses project name if not set
          #   path (optional) - path for new project, uses project name if not set
    
          # 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
    
    
          # Get a project repository branches
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
          # Example Request:
          #   GET /projects/:id/repository/branches
          get ":id/repository/branches" do
    
            present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject
    
          # Get a single branch
          #
          # Parameters:
          #   id (required) - The ID or code name of a project
    
          #   branch (required) - The name of the branch
    
          #   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
    
          # Get a project repository tags
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
          # Example Request:
          #   GET /projects/:id/repository/tags
          get ":id/repository/tags" do
    
            present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
    
          # Get a project snippet
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   snippet_id (required) - The ID of a project snippet
          # Example Request:
          #   GET /projects/:id/snippets/:snippet_id
          get ":id/snippets/:snippet_id" do
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet = user_project.snippets.find(params[:snippet_id])
    
            present @snippet, with: Entities::ProjectSnippet
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          end
    
          # Create a new project snippet
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   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
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet = user_project.snippets.new(
    
              title: params[:title],
              file_name: params[:file_name],
              expires_at: params[:lifetime],
              content: params[:code]
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            )
            @snippet.author = current_user
    
            if @snippet.save
    
              present @snippet, with: Entities::ProjectSnippet
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            else
              error!({'message' => '404 Not found'}, 404)
            end
          end
    
    
          # Update an existing project snippet
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   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
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet = user_project.snippets.find(params[:snippet_id])
    
              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
    
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          # Delete a project snippet
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   id (required) - The ID or code name of a project
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   snippet_id (required) - The ID of a project snippet
          # Example Request:
          #   DELETE /projects/:id/snippets/:snippet_id
          delete ":id/snippets/:snippet_id" do
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet = user_project.snippets.find(params[:snippet_id])
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet.destroy
          end
    
    
          # Get a raw project snippet
          #
          # Parameters:
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
          #   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
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
            @snippet = user_project.snippets.find(params[:snippet_id])
    
            content_type 'text/plain'
    
            present @snippet.content
          end
    
    
          # Get a raw file contents
          #
          # Parameters:
          #   id (required) - The ID or code name of a project
    
          #   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
    
            tree = Tree.new commit.tree, user_project, ref, params[:filepath]
            error!('404 File Not Found', 404) unless tree.try(:tree)
    
            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