Class: AllscriptsUnityClient::JSONClientDriver

Inherits:
ClientDriver
  • Object
show all
Defined in:
lib/allscripts_unity_client/json_client_driver.rb

Overview

A ClientDriver that supports Unity’s JSON endpoints.

Constant Summary collapse

UNITY_JSON_ENDPOINT =
'/Unity/UnityService.svc/json'
UBIQUITY_JSON_ENDPOINT =
'/UnityService.svc/json'
TOKEN_REGEX =
/^"?(\w|-)+"?$/

Constants inherited from ClientDriver

ClientDriver::LOG_FILE

Instance Attribute Summary collapse

Attributes inherited from ClientDriver

#options

Instance Method Summary collapse

Methods inherited from ClientDriver

#security_token?

Constructor Details

#initialize(options) ⇒ JSONClientDriver

Returns a new instance of JSONClientDriver.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 14

def initialize(options)
  super

  @connection = Faraday.new do |conn|
    conn.request :json
    conn.adapter Faraday.default_adapter
    conn.options.timeout = @options.timeout || 90
    conn.options.open_timeout = @options.timeout || 90
    conn.proxy = @options.proxy if @options.proxy
  end

  @text_connection = Faraday.new do |conn|
    conn.request :json
    conn.adapter Faraday.default_adapter
    conn.options.timeout = @options.timeout || 90
    conn.options.open_timeout = @options.timeout || 90
    conn.proxy = @options.proxy if @options.proxy
  end
end

Instance Attribute Details

#connectionObject

Returns the value of attribute connection.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def connection
  @connection
end

#json_base_urlObject

Returns the value of attribute json_base_url.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def json_base_url
  @json_base_url
end

#security_tokenObject

Returns the value of attribute security_token.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def security_token
  @security_token
end

#ubiquity_client_idObject

Returns the value of attribute ubiquity_client_id.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def ubiquity_client_id
  @ubiquity_client_id
end

#ubiquity_idObject

Returns the value of attribute ubiquity_id.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def ubiquity_id
  @ubiquity_id
end

#use_ubiquityObject

Returns the value of attribute use_ubiquity.



8
9
10
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 8

def use_ubiquity
  @use_ubiquity
end

Instance Method Details

#build_uri(request_location) ⇒ Object



34
35
36
37
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 34

def build_uri(request_location)
  endpoint = @options.use_ubiquity ? UBIQUITY_JSON_ENDPOINT : UNITY_JSON_ENDPOINT
  "#{@options.base_unity_url}#{[endpoint, request_location].join('/')}"
end

#client_typeObject



39
40
41
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 39

def client_type
  :json
end

#get_security_token!(parameters = {}) ⇒ Object

See Client#get_security_token!.



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 88

def get_security_token!(parameters = {})
  username = get_username(parameters)
  password = parameters[:password] || @options.password
  appname = parameters[:appname] || @options.appname

  request_data = {
    'Username' => username,
    'Password' => password,
    'Appname' => appname
  }

  start_timer
  response = @text_connection.post(build_uri('GetToken'), MultiJson.dump(request_data.to_hash))
  end_timer

  log_get_security_token
  log_info("Response Status: #{response.status}")

  if response.status != 200 || TOKEN_REGEX.match(response.body).nil?
    raise make_get_security_token_error
  else
    raise_if_response_error(response.body)

    @security_token = response.body
  end
end

#get_user_authentication(parameters = {}) ⇒ Object

See Client#get_user_authentication.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 68

def get_user_authentication(parameters = {})
  response = magic({
                     action: 'GetUserAuthentication',
                     userid: parameters[:ehr_userid] || @options.ehr_userid,
                     parameter1: parameters[:ehr_password] || @options.ehr_password
                   })

  if response[:valid_user] == 'YES'
    @user_authentication = response
    log_info("allscripts_unity_client authentication attempt: success #{@options.base_unity_url}")
    return true
  elsif response[:valid_user] == 'NO'
    log_warn("allscripts_unity_client authentication attempt: failure #{@options.base_unity_url}")
    return false
  else
    raise StandardError.new('Unexpected response from the server')
  end
end

#magic(parameters = {}) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 43

def magic(parameters = {})
  request = JSONUnityRequest.new(parameters, @options.timezone, @options.appname, @security_token, @options.raw_dates)
  request_hash = request.to_hash
  request_data = MultiJson.dump(request_hash)

  start_timer
  response = @connection.post(build_uri('MagicJson'), request_data)
  end_timer

  # NOTE: ClientDriver#log_magic uses ClientDriver#log_info, which
  # appends timing info (if end_timer has been called previously),
  # and then resets the timer.
  #
  # It would be nice if future work made this less stateful.
  log_magic(request)
  log_info("Response Status: #{response.status}")

  response = MultiJson.load(response.body)
  raise_if_response_error(response)

  response = JSONUnityResponse.new(response, @options.timezone)
  response.to_hash
end

#retire_security_token!(parameters = {}) ⇒ Object

See Client#retire_security_token!.



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 116

def retire_security_token!(parameters = {})
  token = parameters[:token] || @security_token
  appname = parameters[:appname] || @options.appname

  request_data = {
    'Token' => token,
    'Appname' => appname
  }

  start_timer
  response = @connection.post(build_uri('RetireSecurityToken'), MultiJson.dump(request_data.to_hash))
  end_timer

  raise_if_response_error(response.body)
  log_retire_security_token

  @security_token = nil
  revoke_authentication
end

#revoke_authenticationObject



141
142
143
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 141

def revoke_authentication
  @user_authentication = nil
end

#user_authenticated?Boolean

Returns:

  • (Boolean)


136
137
138
139
# File 'lib/allscripts_unity_client/json_client_driver.rb', line 136

def user_authenticated?
  return false if @user_authentication.nil?
  @user_authentication.is_a?(Hash) && !@user_authentication.empty?
end