lib/zendesk2/update_user.rb
# frozen_string_literal: true
class Zendesk2::UpdateUser
include Zendesk2::Request
request_method :put
request_path { |r| "/users/#{r.user_id}.json" }
request_body { |r| { 'user' => r.user_params } }
def user_params
Cistern::Hash.slice(params.fetch('user'), *Zendesk2::CreateUser.accepted_attributes)
end
def user_id
@_user_id ||= params.fetch('user').fetch('id').to_i
end
def mock
update_params = user_params
email = update_params['email']
other_users = cistern.data[:users].dup
other_users.delete(user_id)
external_id = update_params['external_id']
if external_id && other_users.values.find { |o| o['external_id'].to_s.casecmp(external_id.to_s.downcase).zero? }
error!(:invalid, details: { 'name' => [{ 'description' => 'External has already been taken' }] })
end
existing_identity = cistern.data[:identities].values.find { |i| i['type'] == 'email' && i['value'] == email }
if !email
# nvm
elsif existing_identity
# email not allowed to conflict across users
existing_identity['user_id'] != user_id &&
error!(:invalid, details: { 'email' => [{
'description' => "Email #{params['email']} is already being used by another user",
},], })
else
add_user_identity(email)
end
mock_response('user' => find!(:users, user_id).merge!(update_params))
end
private
def add_user_identity(email)
# add a new identity
user_identity_id = cistern.serial_id
user_identity = {
'id' => user_identity_id,
'url' => url_for("/users/#{user_id}/identities/#{user_identity_id}.json"),
'created_at' => timestamp,
'updated_at' => timestamp,
'type' => 'email',
'value' => email,
'verified' => false,
'primary' => false,
'user_id' => user_id,
}
cistern.data[:identities][user_identity_id] = user_identity
end
end