Skip to content
Snippets Groups Projects
projects.rb 7.37 KiB
Newer Older
  • Learn to ignore specific revisions
  •   # Projects API
      class Projects < Grape::API
        before { authenticate! }
    
        resource :projects do
    
          helpers do
            def handle_project_member_errors(errors)
              if errors[:project_access].any?
                error!(errors[:project_access], 422)
              end
              not_found!
            end
          end
    
    
          # Get a projects list for authenticated user
          #
          # Example Request:
          #   GET /projects
          get do
    
            @projects = paginate current_user.authorized_projects
    
            present @projects, with: Entities::Project
    
          # Get an owned projects list for authenticated user
          #
          # Example Request:
          #   GET /projects/owned
          get '/owned' do
            @projects = paginate current_user.owned_projects
            present @projects, with: Entities::Project
          end
    
    
          # Get a single project
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          # Example Request:
          #   GET /projects/:id
          get ":id" do
    
            present user_project, with: Entities::Project
    
    Dmitriy Zaporozhets's avatar
    Dmitriy Zaporozhets committed
          # Get a single project events
          #
          # Parameters:
          #   id (required) - The ID of a project
          # Example Request:
          #   GET /projects/:id
          get ":id/events" do
            limit = (params[:per_page] || 20).to_i
            offset = (params[:page] || 0).to_i * limit
            events = user_project.events.recent.limit(limit).offset(offset)
    
            present events, with: Entities::Event
          end
    
    
          # Create new project
          #
          # Parameters:
          #   name (required) - name for new project
    
          #   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
    
          #   namespace_id (optional) - defaults to user namespace
    
          # Example Request
          #   POST /projects
          post do
    
                                        :description,
                                        :default_branch,
                                        :issues_enabled,
                                        :wall_enabled,
                                        :merge_requests_enabled,
    
                                        :wiki_enabled,
                                        :namespace_id]
    
            @project = ::Projects::CreateContext.new(current_user, attrs).execute
    
            if @project.saved?
              present @project, with: Entities::Project
            else
    
              if @project.errors[:limit_reached].present?
                error!(@project.errors[:limit_reached], 403)
              end
    
              not_found!
    
    Angus MacArthur's avatar
    Angus MacArthur committed
          # Create new project for a specified user.  Only available to admin users.
          #
          # Parameters:
          #   user_id (required) - The ID of a user
          #   name (required) - name for new project
          #   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
          # Example Request
          #   POST /projects/user/:user_id
          post "user/:user_id" do
            authenticated_as_admin!
            user = User.find(params[:user_id])
            attrs = attributes_for_keys [:name,
                                        :description,
                                        :default_branch,
                                        :issues_enabled,
                                        :wall_enabled,
                                        :merge_requests_enabled,
                                        :wiki_enabled]
            @project = ::Projects::CreateContext.new(user, attrs).execute
            if @project.saved?
              present @project, with: Entities::Project
            else
              not_found!
            end
          end
    
    
    
          # Get a project team members
    
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          #   query         - Query string
    
          # Example Request:
    
          #   GET /projects/:id/members
          get ":id/members" do
    
            if params[:query].present?
              @members = paginate user_project.users.where("username LIKE ?", "%#{params[:query]}%")
            else
              @members = paginate user_project.users
            end
    
            present @members, with: Entities::ProjectMember, project: user_project
    
          # Get a project team members
    
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          #   user_id (required) - The ID of a user
    
          # Example Request:
    
          #   GET /projects/:id/members/:user_id
          get ":id/members/:user_id" do
            @member = user_project.users.find params[:user_id]
            present @member, with: Entities::ProjectMember, project: user_project
          end
    
          # Add a new project team member
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          #   user_id (required) - The ID of a user
          #   access_level (required) - Project access level
          # Example Request:
          #   POST /projects/:id/members
          post ":id/members" do
    
    randx's avatar
    randx committed
            authorize! :admin_project, user_project
    
            required_attributes! [:user_id, :access_level]
    
    
            # either the user is already a team member or a new one
            team_member = user_project.team_member_by_id(params[:user_id])
            if team_member.nil?
              team_member = user_project.users_projects.new(
                user_id: params[:user_id],
                project_access: params[:access_level]
              )
            end
    
            if team_member.save
              @member = team_member.user
    
              present @member, with: Entities::ProjectMember, project: user_project
            else
    
              handle_project_member_errors team_member.errors
    
          # Update project team member
    
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          #   user_id (required) - The ID of a team member
          #   access_level (required) - Project access level
    
          # Example Request:
    
          #   PUT /projects/:id/members/:user_id
          put ":id/members/:user_id" do
    
    randx's avatar
    randx committed
            authorize! :admin_project, user_project
    
            team_member = user_project.users_projects.find_by_user_id(params[:user_id])
    
            not_found!("User can not be found") if team_member.nil?
    
    
            if team_member.update_attributes(project_access: params[:access_level])
              @member = team_member.user
    
              present @member, with: Entities::ProjectMember, project: user_project
            else
    
              handle_project_member_errors team_member.errors
    
          # Remove a team member from project
    
          #
          # Parameters:
    
          #   id (required) - The ID of a project
    
          #   user_id (required) - The ID of a team member
    
          # Example Request:
    
          #   DELETE /projects/:id/members/:user_id
          delete ":id/members/:user_id" do
    
    randx's avatar
    randx committed
            authorize! :admin_project, user_project
    
            team_member = user_project.users_projects.find_by_user_id(params[:user_id])
            unless team_member.nil?
              team_member.destroy
    
              {message: "Access revoked", id: params[:user_id].to_i}