2013-05-14 08:33:31 -04:00
|
|
|
module API
|
2012-06-29 06:46:01 -04:00
|
|
|
# Users API
|
|
|
|
class Users < Grape::API
|
|
|
|
before { authenticate! }
|
|
|
|
|
2015-08-13 09:35:42 -04:00
|
|
|
resource :users, requirements: { uid: /[0-9]*/, id: /[0-9]*/ } do
|
2012-06-29 06:46:01 -04:00
|
|
|
# Get a users list
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# GET /users
|
2015-12-13 01:02:05 -05:00
|
|
|
# GET /users?search=Admin
|
|
|
|
# GET /users?username=root
|
2012-06-29 06:46:01 -04:00
|
|
|
get do
|
2016-04-12 11:04:33 -04:00
|
|
|
unless can?(current_user, :read_users_list, nil)
|
2016-04-06 17:09:24 -04:00
|
|
|
render_api_error!("Not authorized.", 403)
|
|
|
|
end
|
|
|
|
|
2015-12-13 01:02:05 -05:00
|
|
|
if params[:username].present?
|
|
|
|
@users = User.where(username: params[:username])
|
|
|
|
else
|
|
|
|
@users = User.all
|
|
|
|
@users = @users.active if params[:active].present?
|
|
|
|
@users = @users.search(params[:search]) if params[:search].present?
|
|
|
|
@users = paginate @users
|
|
|
|
end
|
2014-06-13 10:46:48 -04:00
|
|
|
|
|
|
|
if current_user.is_admin?
|
|
|
|
present @users, with: Entities::UserFull
|
|
|
|
else
|
|
|
|
present @users, with: Entities::UserBasic
|
|
|
|
end
|
2012-06-29 06:46:01 -04:00
|
|
|
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])
|
2014-06-13 10:46:48 -04:00
|
|
|
|
2016-04-13 14:37:17 -04:00
|
|
|
if current_user && current_user.is_admin?
|
2014-06-13 10:46:48 -04:00
|
|
|
present @user, with: Entities::UserFull
|
2016-04-06 17:09:24 -04:00
|
|
|
elsif can?(current_user, :read_user, @user)
|
2015-12-28 09:50:44 -05:00
|
|
|
present @user, with: Entities::User
|
2016-04-06 17:09:24 -04:00
|
|
|
else
|
|
|
|
render_api_error!("User not found.", 404)
|
2014-06-13 10:46:48 -04:00
|
|
|
end
|
2012-06-29 06:46:01 -04:00
|
|
|
end
|
2012-10-19 06:23:10 -04:00
|
|
|
|
2012-10-02 05:46:01 -04:00
|
|
|
# Create user. Available only for admin
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# email (required) - Email
|
|
|
|
# password (required) - Password
|
2014-08-18 14:09:09 -04:00
|
|
|
# name (required) - Name
|
|
|
|
# username (required) - Name
|
2012-10-02 05:46:01 -04:00
|
|
|
# skype - Skype ID
|
2012-10-02 09:34:20 -04:00
|
|
|
# linkedin - Linkedin
|
2012-10-02 05:46:01 -04:00
|
|
|
# twitter - Twitter account
|
2014-01-18 14:07:00 -05:00
|
|
|
# website_url - Website url
|
2016-09-26 13:33:00 -04:00
|
|
|
# organization - Organization
|
2012-10-19 06:34:18 -04:00
|
|
|
# projects_limit - Number of projects user can create
|
2012-12-18 14:24:31 -05:00
|
|
|
# extern_uid - External authentication provider UID
|
|
|
|
# provider - External provider
|
|
|
|
# bio - Bio
|
2016-04-05 19:57:21 -04:00
|
|
|
# location - Location of the user
|
2013-07-31 06:52:23 -04:00
|
|
|
# admin - User is admin - true or false (default)
|
|
|
|
# can_create_group - User can create groups - true or false
|
2014-06-18 13:49:39 -04:00
|
|
|
# confirm - Require user confirmation - true (default) or false
|
2016-03-17 06:21:12 -04:00
|
|
|
# external - Flags the user as external - true or false(default)
|
2012-10-02 05:46:01 -04:00
|
|
|
# Example Request:
|
|
|
|
# POST /users
|
|
|
|
post do
|
|
|
|
authenticated_as_admin!
|
2013-02-27 11:50:30 -05:00
|
|
|
required_attributes! [:email, :password, :name, :username]
|
2016-09-26 13:33:00 -04:00
|
|
|
attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :bio, :location, :can_create_group, :admin, :confirm, :external, :organization]
|
2013-07-31 06:52:23 -04:00
|
|
|
admin = attrs.delete(:admin)
|
2016-05-30 09:07:18 -04:00
|
|
|
confirm = !(attrs.delete(:confirm) =~ /(false|f|no|0)$/i)
|
2015-03-24 11:52:26 -04:00
|
|
|
user = User.build_user(attrs)
|
|
|
|
user.admin = admin unless admin.nil?
|
2014-06-18 13:49:39 -04:00
|
|
|
user.skip_confirmation! unless confirm
|
2014-11-27 06:34:39 -05:00
|
|
|
identity_attrs = attributes_for_keys [:provider, :extern_uid]
|
2016-03-10 16:08:11 -05:00
|
|
|
|
2014-11-27 06:34:39 -05:00
|
|
|
if identity_attrs.any?
|
|
|
|
user.identities.build(identity_attrs)
|
|
|
|
end
|
|
|
|
|
2012-10-02 05:46:01 -04:00
|
|
|
if user.save
|
2014-06-13 10:46:48 -04:00
|
|
|
present user, with: Entities::UserFull
|
2012-10-02 05:46:01 -04:00
|
|
|
else
|
2014-08-18 14:09:09 -04:00
|
|
|
conflict!('Email has already been taken') if User.
|
|
|
|
where(email: user.email).
|
|
|
|
count > 0
|
|
|
|
|
|
|
|
conflict!('Username has already been taken') if User.
|
|
|
|
where(username: user.username).
|
|
|
|
count > 0
|
|
|
|
|
|
|
|
render_validation_error!(user)
|
2012-10-02 05:46:01 -04:00
|
|
|
end
|
|
|
|
end
|
2012-12-18 14:24:31 -05:00
|
|
|
|
|
|
|
# Update user. Available only for admin
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# email - Email
|
|
|
|
# name - Name
|
|
|
|
# password - Password
|
|
|
|
# skype - Skype ID
|
|
|
|
# linkedin - Linkedin
|
|
|
|
# twitter - Twitter account
|
2014-01-18 14:07:00 -05:00
|
|
|
# website_url - Website url
|
2016-09-26 13:33:00 -04:00
|
|
|
# organization - Organization
|
2013-03-17 15:46:54 -04:00
|
|
|
# projects_limit - Limit projects each user can create
|
2012-12-18 14:24:31 -05:00
|
|
|
# bio - Bio
|
2016-04-05 19:57:21 -04:00
|
|
|
# location - Location of the user
|
2013-07-31 06:52:23 -04:00
|
|
|
# admin - User is admin - true or false (default)
|
|
|
|
# can_create_group - User can create groups - true or false
|
2016-03-17 06:21:12 -04:00
|
|
|
# external - Flags the user as external - true or false(default)
|
2012-12-18 14:24:31 -05:00
|
|
|
# Example Request:
|
|
|
|
# PUT /users/:id
|
|
|
|
put ":id" do
|
|
|
|
authenticated_as_admin!
|
2013-02-20 06:10:51 -05:00
|
|
|
|
2016-09-26 13:33:00 -04:00
|
|
|
attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :website_url, :projects_limit, :username, :bio, :location, :can_create_group, :admin, :external, :organization]
|
2013-02-20 06:10:51 -05:00
|
|
|
user = User.find(params[:id])
|
2014-08-18 14:09:09 -04:00
|
|
|
not_found!('User') unless user
|
2012-12-18 14:24:31 -05:00
|
|
|
|
2013-07-31 06:52:23 -04:00
|
|
|
admin = attrs.delete(:admin)
|
|
|
|
user.admin = admin unless admin.nil?
|
2014-08-18 14:09:09 -04:00
|
|
|
|
|
|
|
conflict!('Email has already been taken') if attrs[:email] &&
|
|
|
|
User.where(email: attrs[:email]).
|
|
|
|
where.not(id: user.id).count > 0
|
|
|
|
|
|
|
|
conflict!('Username has already been taken') if attrs[:username] &&
|
|
|
|
User.where(username: attrs[:username]).
|
|
|
|
where.not(id: user.id).count > 0
|
|
|
|
|
2015-09-22 17:26:59 -04:00
|
|
|
identity_attrs = attributes_for_keys [:provider, :extern_uid]
|
|
|
|
if identity_attrs.any?
|
|
|
|
identity = user.identities.find_by(provider: identity_attrs[:provider])
|
|
|
|
if identity
|
|
|
|
identity.update_attributes(identity_attrs)
|
|
|
|
else
|
|
|
|
identity = user.identities.build(identity_attrs)
|
|
|
|
identity.save
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-30 09:43:32 -04:00
|
|
|
if user.update_attributes(attrs)
|
2014-06-13 10:46:48 -04:00
|
|
|
present user, with: Entities::UserFull
|
2012-12-18 14:24:31 -05:00
|
|
|
else
|
2014-08-18 14:09:09 -04:00
|
|
|
render_validation_error!(user)
|
2012-12-18 14:24:31 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-11-14 15:37:52 -05:00
|
|
|
# Add ssh key to a specified user. Only available to admin users.
|
|
|
|
#
|
|
|
|
# Parameters:
|
2015-07-31 08:35:32 -04:00
|
|
|
# id (required) - The ID of a user
|
|
|
|
# key (required) - New SSH Key
|
|
|
|
# title (required) - New SSH Key's title
|
2012-11-14 15:37:52 -05:00
|
|
|
# Example Request:
|
2015-07-31 08:35:32 -04:00
|
|
|
# POST /users/:id/keys
|
2012-11-14 15:37:52 -05:00
|
|
|
post ":id/keys" do
|
|
|
|
authenticated_as_admin!
|
2014-08-18 14:09:09 -04:00
|
|
|
required_attributes! [:title, :key]
|
|
|
|
|
2012-11-14 15:37:52 -05:00
|
|
|
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
|
2014-08-18 14:09:09 -04:00
|
|
|
render_validation_error!(key)
|
2012-11-14 15:37:52 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-04-15 10:39:46 -04:00
|
|
|
# Get ssh keys of a specified user. Only available to admin users.
|
|
|
|
#
|
|
|
|
# Parameters:
|
2015-07-31 08:35:32 -04:00
|
|
|
# uid (required) - The ID of a user
|
2014-04-15 10:39:46 -04:00
|
|
|
# Example Request:
|
2015-07-31 08:35:32 -04:00
|
|
|
# GET /users/:uid/keys
|
2014-04-15 10:39:46 -04:00
|
|
|
get ':uid/keys' do
|
|
|
|
authenticated_as_admin!
|
|
|
|
user = User.find_by(id: params[:uid])
|
2014-08-18 14:09:09 -04:00
|
|
|
not_found!('User') unless user
|
|
|
|
|
|
|
|
present user.keys, with: Entities::SSHKey
|
2014-04-15 10:39:46 -04:00
|
|
|
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])
|
2014-08-18 14:09:09 -04:00
|
|
|
not_found!('User') unless user
|
|
|
|
|
|
|
|
begin
|
|
|
|
key = user.keys.find params[:id]
|
|
|
|
key.destroy
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
not_found!('Key')
|
2014-04-15 10:39:46 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-07-29 09:40:08 -04:00
|
|
|
# Add email to a specified user. Only available to admin users.
|
|
|
|
#
|
|
|
|
# Parameters:
|
2015-07-31 08:35:32 -04:00
|
|
|
# id (required) - The ID of a user
|
|
|
|
# email (required) - Email address
|
2015-07-29 09:40:08 -04:00
|
|
|
# Example Request:
|
2015-07-31 08:35:32 -04:00
|
|
|
# POST /users/:id/emails
|
2015-07-29 09:40:08 -04:00
|
|
|
post ":id/emails" do
|
|
|
|
authenticated_as_admin!
|
|
|
|
required_attributes! [:email]
|
|
|
|
|
|
|
|
user = User.find(params[:id])
|
|
|
|
attrs = attributes_for_keys [:email]
|
|
|
|
email = user.emails.new attrs
|
|
|
|
if email.save
|
|
|
|
NotificationService.new.new_email(email)
|
|
|
|
present email, with: Entities::Email
|
|
|
|
else
|
|
|
|
render_validation_error!(email)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Get emails of a specified user. Only available to admin users.
|
|
|
|
#
|
|
|
|
# Parameters:
|
2015-07-31 08:35:32 -04:00
|
|
|
# uid (required) - The ID of a user
|
2015-07-29 09:40:08 -04:00
|
|
|
# Example Request:
|
2015-07-31 08:35:32 -04:00
|
|
|
# GET /users/:uid/emails
|
2015-07-29 09:40:08 -04:00
|
|
|
get ':uid/emails' do
|
|
|
|
authenticated_as_admin!
|
|
|
|
user = User.find_by(id: params[:uid])
|
|
|
|
not_found!('User') unless user
|
|
|
|
|
|
|
|
present user.emails, with: Entities::Email
|
|
|
|
end
|
|
|
|
|
|
|
|
# Delete existing email of a specified user. Only available to admin
|
|
|
|
# users.
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# uid (required) - The ID of a user
|
|
|
|
# id (required) - Email ID
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /users/:uid/emails/:id
|
|
|
|
delete ':uid/emails/:id' do
|
|
|
|
authenticated_as_admin!
|
|
|
|
user = User.find_by(id: params[:uid])
|
|
|
|
not_found!('User') unless user
|
|
|
|
|
|
|
|
begin
|
|
|
|
email = user.emails.find params[:id]
|
|
|
|
email.destroy
|
|
|
|
|
|
|
|
user.update_secondary_emails!
|
|
|
|
rescue ActiveRecord::RecordNotFound
|
|
|
|
not_found!('Email')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-12-18 14:24:31 -05:00
|
|
|
# Delete user. Available only for admin
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /users/:id
|
|
|
|
delete ":id" do
|
|
|
|
authenticated_as_admin!
|
2014-01-19 13:55:59 -05:00
|
|
|
user = User.find_by(id: params[:id])
|
2012-12-18 14:24:31 -05:00
|
|
|
|
|
|
|
if user
|
2015-06-22 18:08:02 -04:00
|
|
|
DeleteUserService.new(current_user).execute(user)
|
2012-12-18 14:24:31 -05:00
|
|
|
else
|
2014-08-18 14:09:09 -04:00
|
|
|
not_found!('User')
|
2012-12-18 14:24:31 -05:00
|
|
|
end
|
|
|
|
end
|
2015-04-28 12:02:44 -04:00
|
|
|
|
|
|
|
# Block user. Available only for admin
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# PUT /users/:id/block
|
|
|
|
put ':id/block' do
|
|
|
|
authenticated_as_admin!
|
|
|
|
user = User.find_by(id: params[:id])
|
|
|
|
|
2015-12-30 13:52:02 -05:00
|
|
|
if !user
|
|
|
|
not_found!('User')
|
|
|
|
elsif !user.ldap_blocked?
|
2015-04-28 12:02:44 -04:00
|
|
|
user.block
|
|
|
|
else
|
2015-12-30 13:52:02 -05:00
|
|
|
forbidden!('LDAP blocked users cannot be modified by the API')
|
2015-04-28 12:02:44 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Unblock user. Available only for admin
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# PUT /users/:id/unblock
|
|
|
|
put ':id/unblock' do
|
|
|
|
authenticated_as_admin!
|
|
|
|
user = User.find_by(id: params[:id])
|
|
|
|
|
2015-12-30 13:52:02 -05:00
|
|
|
if !user
|
|
|
|
not_found!('User')
|
2016-01-12 09:29:10 -05:00
|
|
|
elsif user.ldap_blocked?
|
2015-12-30 13:52:02 -05:00
|
|
|
forbidden!('LDAP blocked users cannot be unblocked by the API')
|
2016-01-12 09:29:10 -05:00
|
|
|
else
|
|
|
|
user.activate
|
2015-04-28 12:02:44 -04:00
|
|
|
end
|
|
|
|
end
|
2012-06-29 06:46:01 -04:00
|
|
|
end
|
|
|
|
|
2012-09-21 07:49:28 -04:00
|
|
|
resource :user do
|
|
|
|
# Get currently authenticated user
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# GET /user
|
|
|
|
get do
|
2016-08-26 00:07:57 -04:00
|
|
|
present @current_user, with: Entities::UserFull
|
2012-09-21 07:49:28 -04:00
|
|
|
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
|
2013-02-27 11:50:30 -05:00
|
|
|
required_attributes! [:title, :key]
|
2013-02-20 06:10:51 -05:00
|
|
|
|
2012-09-21 07:49:28 -04:00
|
|
|
attrs = attributes_for_keys [:title, :key]
|
|
|
|
key = current_user.keys.new attrs
|
|
|
|
if key.save
|
|
|
|
present key, with: Entities::SSHKey
|
|
|
|
else
|
2014-08-18 14:09:09 -04:00
|
|
|
render_validation_error!(key)
|
2012-09-21 07:49:28 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-20 06:10:51 -05:00
|
|
|
# Delete existing ssh key of currently authenticated user
|
2012-09-21 07:49:28 -04:00
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - SSH Key ID
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /user/keys/:id
|
|
|
|
delete "keys/:id" do
|
2013-02-20 06:10:51 -05:00
|
|
|
begin
|
|
|
|
key = current_user.keys.find params[:id]
|
2013-05-06 09:24:58 -04:00
|
|
|
key.destroy
|
2013-02-20 06:10:51 -05:00
|
|
|
rescue
|
|
|
|
end
|
2012-09-21 07:49:28 -04:00
|
|
|
end
|
2015-07-29 09:40:08 -04:00
|
|
|
|
|
|
|
# Get currently authenticated user's emails
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# GET /user/emails
|
|
|
|
get "emails" do
|
|
|
|
present current_user.emails, with: Entities::Email
|
|
|
|
end
|
|
|
|
|
|
|
|
# Get single email owned by currently authenticated user
|
|
|
|
#
|
|
|
|
# Example Request:
|
|
|
|
# GET /user/emails/:id
|
|
|
|
get "emails/:id" do
|
|
|
|
email = current_user.emails.find params[:id]
|
|
|
|
present email, with: Entities::Email
|
|
|
|
end
|
|
|
|
|
|
|
|
# Add new email to currently authenticated user
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# email (required) - Email address
|
|
|
|
# Example Request:
|
|
|
|
# POST /user/emails
|
|
|
|
post "emails" do
|
|
|
|
required_attributes! [:email]
|
|
|
|
|
|
|
|
attrs = attributes_for_keys [:email]
|
|
|
|
email = current_user.emails.new attrs
|
|
|
|
if email.save
|
|
|
|
NotificationService.new.new_email(email)
|
|
|
|
present email, with: Entities::Email
|
|
|
|
else
|
|
|
|
render_validation_error!(email)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Delete existing email of currently authenticated user
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# id (required) - EMail ID
|
|
|
|
# Example Request:
|
|
|
|
# DELETE /user/emails/:id
|
|
|
|
delete "emails/:id" do
|
|
|
|
begin
|
|
|
|
email = current_user.emails.find params[:id]
|
|
|
|
email.destroy
|
|
|
|
|
|
|
|
current_user.update_secondary_emails!
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
end
|
2012-06-29 06:46:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|