users.rb 7.0 KB
Newer Older
1
module API
N
Nihad Abbasov 已提交
2 3 4 5 6 7 8 9 10 11
  # Users API
  class Users < Grape::API
    before { authenticate! }

    resource :users do
      # Get a users list
      #
      # Example Request:
      #  GET /users
      get do
S
skv 已提交
12
        @users = User.all
13
        @users = @users.active if params[:active].present?
14
        @users = @users.search(params[:search]) if params[:search].present?
15
        @users = paginate @users
16
        present @users, with: Entities::User
N
Nihad Abbasov 已提交
17 18 19 20 21 22 23 24 25 26
      end

      # Get a single user
      #
      # Parameters:
      #   id (required) - The ID of a user
      # Example Request:
      #   GET /users/:id
      get ":id" do
        @user = User.find(params[:id])
27
        present @user, with: Entities::User
N
Nihad Abbasov 已提交
28
      end
29

30 31 32 33 34
      # Create user. Available only for admin
      #
      # Parameters:
      #   email (required)                  - Email
      #   password (required)               - Password
35
      #   name                              - Name
36
      #   skype                             - Skype ID
V
Valeriy Sizov 已提交
37
      #   linkedin                          - Linkedin
38
      #   twitter                           - Twitter account
J
Jerome Dalbert 已提交
39
      #   website_url                       - Website url
40
      #   projects_limit                    - Number of projects user can create
41 42 43
      #   extern_uid                        - External authentication provider UID
      #   provider                          - External provider
      #   bio                               - Bio
44 45
      #   admin                             - User is admin - true or false (default)
      #   can_create_group                  - User can create groups - true or false
46 47 48 49
      # Example Request:
      #   POST /users
      post do
        authenticated_as_admin!
50
        required_attributes! [:email, :password, :name, :username]
51
        attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
52
        user = User.build_user(attrs, as: :admin)
53 54
        admin = attrs.delete(:admin)
        user.admin = admin unless admin.nil?
55 56 57 58 59 60
        if user.save
          present user, with: Entities::User
        else
          not_found!
        end
      end
61 62 63 64 65 66 67 68 69 70

      # Update user. Available only for admin
      #
      # Parameters:
      #   email                             - Email
      #   name                              - Name
      #   password                          - Password
      #   skype                             - Skype ID
      #   linkedin                          - Linkedin
      #   twitter                           - Twitter account
J
Jerome Dalbert 已提交
71
      #   website_url                       - Website url
K
Kevin Lyda 已提交
72
      #   projects_limit                    - Limit projects each user can create
73 74 75
      #   extern_uid                        - External authentication provider UID
      #   provider                          - External provider
      #   bio                               - Bio
76 77
      #   admin                             - User is admin - true or false (default)
      #   can_create_group                  - User can create groups - true or false
78 79 80 81
      # Example Request:
      #   PUT /users/:id
      put ":id" do
        authenticated_as_admin!
82

J
Jerome Dalbert 已提交
83
        attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :website_url, :projects_limit, :username, :extern_uid, :provider, :bio, :can_create_group, :admin]
84 85
        user = User.find(params[:id])
        not_found!("User not found") unless user
86

87 88 89
        admin = attrs.delete(:admin)
        user.admin = admin unless admin.nil?
        if user.update_attributes(attrs, as: :admin)
90 91 92 93 94 95
          present user, with: Entities::User
        else
          not_found!
        end
      end

A
Angus MacArthur 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
      # Add ssh key to a specified user. Only available to admin users.
      #
      # Parameters:
      # id (required) - The ID of a user
      # key (required) - New SSH Key
      # title (required) - New SSH Key's title
      # Example Request:
      # POST /users/:id/keys
      post ":id/keys" do
        authenticated_as_admin!
        user = User.find(params[:id])
        attrs = attributes_for_keys [:title, :key]
        key = user.keys.new attrs
        if key.save
          present key, with: Entities::SSHKey
        else
          not_found!
        end
      end

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
      # Get ssh keys of a specified user. Only available to admin users.
      #
      # Parameters:
      # uid (required) - The ID of a user
      # Example Request:
      # GET /users/:uid/keys
      get ':uid/keys' do
        authenticated_as_admin!
        user = User.find_by(id: params[:uid])
        if user
          present user.keys, with: Entities::SSHKey
        else
          not_found!
        end
      end

      # Delete existing ssh key of a specified user. Only available to admin
      # users.
      #
      # Parameters:
      #   uid (required) - The ID of a user
      #   id (required) - SSH Key ID
      # Example Request:
      #   DELETE /users/:uid/keys/:id
      delete ':uid/keys/:id' do
        authenticated_as_admin!
        user = User.find_by(id: params[:uid])
        if user
          begin
            key = user.keys.find params[:id]
            key.destroy
          rescue ActiveRecord::RecordNotFound
            not_found!
          end
        else
          not_found!
        end
      end

155 156 157 158 159 160
      # Delete user. Available only for admin
      #
      # Example Request:
      #   DELETE /users/:id
      delete ":id" do
        authenticated_as_admin!
S
skv 已提交
161
        user = User.find_by(id: params[:id])
162 163 164 165 166 167 168

        if user
          user.destroy
        else
          not_found!
        end
      end
N
Nihad Abbasov 已提交
169 170
    end

171 172 173 174 175 176
    resource :user do
      # Get currently authenticated user
      #
      # Example Request:
      #   GET /user
      get do
177
        present @current_user, with: Entities::UserLogin
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
      end

      # Get currently authenticated user's keys
      #
      # Example Request:
      #   GET /user/keys
      get "keys" do
        present current_user.keys, with: Entities::SSHKey
      end

      # Get single key owned by currently authenticated user
      #
      # Example Request:
      #   GET /user/keys/:id
      get "keys/:id" do
        key = current_user.keys.find params[:id]
        present key, with: Entities::SSHKey
      end

      # Add new ssh key to currently authenticated user
      #
      # Parameters:
      #   key (required) - New SSH Key
      #   title (required) - New SSH Key's title
      # Example Request:
      #   POST /user/keys
      post "keys" do
205
        required_attributes! [:title, :key]
206

207 208 209 210 211 212 213 214 215
        attrs = attributes_for_keys [:title, :key]
        key = current_user.keys.new attrs
        if key.save
          present key, with: Entities::SSHKey
        else
          not_found!
        end
      end

216
      # Delete existing ssh key of currently authenticated user
217 218 219 220 221 222
      #
      # Parameters:
      #   id (required) - SSH Key ID
      # Example Request:
      #   DELETE /user/keys/:id
      delete "keys/:id" do
223 224
        begin
          key = current_user.keys.find params[:id]
225
          key.destroy
226 227
        rescue
        end
228
      end
N
Nihad Abbasov 已提交
229 230 231
    end
  end
end