projects.rb 7.4 KB
Newer Older
1
module API
N
Nihad Abbasov 已提交
2 3 4 5 6
  # Projects API
  class Projects < Grape::API
    before { authenticate! }

    resource :projects do
7 8 9 10 11 12 13 14 15
      helpers do
        def handle_project_member_errors(errors)
          if errors[:project_access].any?
            error!(errors[:project_access], 422)
          end
          not_found!
        end
      end

N
Nihad Abbasov 已提交
16 17 18 19 20
      # Get a projects list for authenticated user
      #
      # Example Request:
      #   GET /projects
      get do
21
        @projects = paginate current_user.authorized_projects
22
        present @projects, with: Entities::Project
N
Nihad Abbasov 已提交
23 24
      end

25 26 27 28 29 30 31 32 33
      # 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

N
Nihad Abbasov 已提交
34 35 36
      # Get a single project
      #
      # Parameters:
37
      #   id (required) - The ID of a project
N
Nihad Abbasov 已提交
38 39 40
      # Example Request:
      #   GET /projects/:id
      get ":id" do
41
        present user_project, with: Entities::Project
N
Nihad Abbasov 已提交
42 43
      end

D
Dmitriy Zaporozhets 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57
      # 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

58 59 60 61
      # Create new project
      #
      # Parameters:
      #   name (required) - name for new project
62 63 64 65 66 67
      #   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
68
      #   namespace_id (optional) - defaults to user namespace
69 70 71
      # Example Request
      #   POST /projects
      post do
72
        required_attributes! [:name]
73
        attrs = attributes_for_keys [:name,
74 75 76 77 78
                                    :description,
                                    :default_branch,
                                    :issues_enabled,
                                    :wall_enabled,
                                    :merge_requests_enabled,
79 80
                                    :wiki_enabled,
                                    :namespace_id]
81
        @project = ::Projects::CreateContext.new(current_user, attrs).execute
82 83 84
        if @project.saved?
          present @project, with: Entities::Project
        else
85 86 87
          if @project.errors[:limit_reached].present?
            error!(@project.errors[:limit_reached], 403)
          end
88
          not_found!
89 90 91
        end
      end

A
Angus MacArthur 已提交
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
      # 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


N
Nihad Abbasov 已提交
124
      # Get a project team members
M
miks 已提交
125 126
      #
      # Parameters:
127
      #   id (required) - The ID of a project
V
Valeriy Sizov 已提交
128
      #   query         - Query string
M
miks 已提交
129
      # Example Request:
N
Nihad Abbasov 已提交
130 131
      #   GET /projects/:id/members
      get ":id/members" do
V
Valeriy Sizov 已提交
132 133 134 135 136
        if params[:query].present?
          @members = paginate user_project.users.where("username LIKE ?", "%#{params[:query]}%")
        else
          @members = paginate user_project.users
        end
N
Nihad Abbasov 已提交
137
        present @members, with: Entities::ProjectMember, project: user_project
M
miks 已提交
138 139
      end

N
Nihad Abbasov 已提交
140
      # Get a project team members
141 142
      #
      # Parameters:
143
      #   id (required) - The ID of a project
N
Nihad Abbasov 已提交
144
      #   user_id (required) - The ID of a user
145
      # Example Request:
N
Nihad Abbasov 已提交
146 147 148 149 150 151 152 153 154
      #   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:
155
      #   id (required) - The ID of a project
N
Nihad Abbasov 已提交
156 157 158 159 160
      #   user_id (required) - The ID of a user
      #   access_level (required) - Project access level
      # Example Request:
      #   POST /projects/:id/members
      post ":id/members" do
R
randx 已提交
161
        authorize! :admin_project, user_project
162
        required_attributes! [:user_id, :access_level]
163 164 165 166 167 168 169 170 171 172 173 174

        # 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
N
Nihad Abbasov 已提交
175 176
          present @member, with: Entities::ProjectMember, project: user_project
        else
177
          handle_project_member_errors team_member.errors
N
Nihad Abbasov 已提交
178
        end
179 180
      end

N
Nihad Abbasov 已提交
181
      # Update project team member
M
miks 已提交
182 183
      #
      # Parameters:
184
      #   id (required) - The ID of a project
N
Nihad Abbasov 已提交
185 186
      #   user_id (required) - The ID of a team member
      #   access_level (required) - Project access level
M
miks 已提交
187
      # Example Request:
N
Nihad Abbasov 已提交
188 189
      #   PUT /projects/:id/members/:user_id
      put ":id/members/:user_id" do
R
randx 已提交
190
        authorize! :admin_project, user_project
191
        required_attributes! [:access_level]
N
Nihad Abbasov 已提交
192

193
        team_member = user_project.users_projects.find_by_user_id(params[:user_id])
194
        not_found!("User can not be found") if team_member.nil?
195 196 197

        if team_member.update_attributes(project_access: params[:access_level])
          @member = team_member.user
N
Nihad Abbasov 已提交
198 199
          present @member, with: Entities::ProjectMember, project: user_project
        else
200
          handle_project_member_errors team_member.errors
N
Nihad Abbasov 已提交
201
        end
M
miks 已提交
202 203
      end

N
Nihad Abbasov 已提交
204
      # Remove a team member from project
M
miks 已提交
205 206
      #
      # Parameters:
207
      #   id (required) - The ID of a project
N
Nihad Abbasov 已提交
208
      #   user_id (required) - The ID of a team member
M
miks 已提交
209
      # Example Request:
N
Nihad Abbasov 已提交
210 211
      #   DELETE /projects/:id/members/:user_id
      delete ":id/members/:user_id" do
R
randx 已提交
212
        authorize! :admin_project, user_project
213 214 215
        team_member = user_project.users_projects.find_by_user_id(params[:user_id])
        unless team_member.nil?
          team_member.destroy
216
        else
217
          {message: "Access revoked", id: params[:user_id].to_i}
218
        end
M
miks 已提交
219
      end
N
Nihad Abbasov 已提交
220 221 222
    end
  end
end