athena_health 2.0.2 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/athena_health.gemspec +5 -4
- data/lib/athena_health/auth_token.rb +69 -0
- data/lib/athena_health/client.rb +21 -4
- data/lib/athena_health/connection.rb +8 -36
- data/lib/athena_health/endpoints/configurations.rb +17 -3
- data/lib/athena_health/gender_identity_field_collection.rb +5 -0
- data/lib/athena_health/provider.rb +1 -0
- data/lib/athena_health/version.rb +1 -1
- data/lib/athena_health.rb +2 -0
- metadata +34 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72d528a701d5b4e4495d1e37121779dc39e6940e7dd761e199478e269c955f2e
|
4
|
+
data.tar.gz: 5849da85a6822b0a5f92f5c333ab51eb2cb75a8b9ea823a37282447b91651b0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1209d763734ae0fed0e659d87841215a3db81da08abae384d7e50abfaea8c8d66dfc55901dee7de408958df04fad37273b9f57236dcdf4172de946b249819a96
|
7
|
+
data.tar.gz: d327001b2902eb318b97bd3b3d294809c77b6b06d20ceb9614a7608ee63e412314c80f992d5518637ff540a2b2cea051d7388b80586582e704f577f8822c6a17
|
data/.gitignore
CHANGED
data/athena_health.gemspec
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'athena_health/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
6
|
spec.name = 'athena_health'
|
8
7
|
spec.version = AthenaHealth::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = ['mateuszurbanski@yahoo.pl']
|
8
|
+
spec.authors = ['Mateusz Urbański', 'Ben Jones']
|
9
|
+
spec.email = ['mateuszurbanski@yahoo.pl', 'ben@benjones.io']
|
11
10
|
|
12
11
|
spec.summary = 'Ruby wrapper for Athenahealth API.'
|
13
12
|
spec.description = 'Ruby wrapper for Athenahealth API. See https://developer.athenahealth.com/io-docs for more details.'
|
@@ -25,4 +24,6 @@ Gem::Specification.new do |spec|
|
|
25
24
|
spec.add_development_dependency 'rake', '~> 10.0'
|
26
25
|
spec.add_development_dependency 'rspec', '~> 3.2'
|
27
26
|
spec.add_development_dependency 'vcr', '~> 3.0'
|
27
|
+
spec.add_development_dependency 'timecop', '~> 0.9.6'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 1.42'
|
28
29
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module AthenaHealth
|
4
|
+
class AuthToken
|
5
|
+
def initialize(client_id:, secret:, base_url:, api_version:, auth_token_hash: nil)
|
6
|
+
@base_url = base_url
|
7
|
+
@api_version = api_version
|
8
|
+
@client_id = client_id
|
9
|
+
@secret = secret
|
10
|
+
reset!
|
11
|
+
parse_auth_token_hash!(auth_token_hash) unless auth_token_hash.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def auth_header
|
15
|
+
{ 'Authorization' => "Bearer #{token}" }
|
16
|
+
end
|
17
|
+
|
18
|
+
def reset!
|
19
|
+
@access_token = nil
|
20
|
+
@expires_at = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def serialized_token
|
24
|
+
{
|
25
|
+
'access_token' => token,
|
26
|
+
'expires_at' => @expires_at.to_i
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def token
|
33
|
+
fetch_token! unless valid?
|
34
|
+
@access_token
|
35
|
+
end
|
36
|
+
|
37
|
+
def valid?
|
38
|
+
!@access_token.nil? &&
|
39
|
+
!@expires_at.nil? &&
|
40
|
+
@expires_at > Time.now
|
41
|
+
end
|
42
|
+
|
43
|
+
def parse_auth_token_hash!(auth_token_hash)
|
44
|
+
# make sure it has the right parts
|
45
|
+
return unless auth_token_hash['access_token'].instance_of? String
|
46
|
+
return unless auth_token_hash['expires_at'].instance_of? Integer
|
47
|
+
|
48
|
+
@access_token = auth_token_hash['access_token']
|
49
|
+
@expires_at = Time.at(auth_token_hash['expires_at'])
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch_token!
|
53
|
+
reset!
|
54
|
+
initiated_at = Time.now
|
55
|
+
response = Typhoeus.post(
|
56
|
+
"#{@base_url}/oauth2/#{@api_version}/token",
|
57
|
+
userpwd: "#{@client_id}:#{@secret}",
|
58
|
+
body: {
|
59
|
+
grant_type: 'client_credentials',
|
60
|
+
scope: 'athena/service/Athenanet.MDP.*'
|
61
|
+
}
|
62
|
+
)
|
63
|
+
token_hash = JSON.parse(response.response_body)
|
64
|
+
expires_in = token_hash['expires_in'].to_i
|
65
|
+
@access_token = token_hash['access_token']
|
66
|
+
@expires_at = initiated_at + expires_in
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/athena_health/client.rb
CHANGED
@@ -1,14 +1,27 @@
|
|
1
1
|
module AthenaHealth
|
2
2
|
class Client
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
PRODUCTION_BASE_URL = 'https://api.platform.athenahealth.com'.freeze
|
4
|
+
PREVIEW_BASE_URL = 'https://api.preview.platform.athenahealth.com'.freeze
|
5
|
+
API_VERSION = 'v1'.freeze
|
6
|
+
|
7
|
+
def initialize(client_id:, secret:, production: false, auth_token_hash: nil)
|
8
|
+
base_url = Client.base_url(production: production)
|
9
|
+
@token = AthenaHealth::AuthToken.new(
|
6
10
|
client_id: client_id,
|
7
11
|
secret: secret,
|
8
|
-
|
12
|
+
auth_token_hash: auth_token_hash,
|
13
|
+
base_url: base_url,
|
14
|
+
api_version: API_VERSION
|
15
|
+
)
|
16
|
+
@api = AthenaHealth::Connection.new(
|
17
|
+
base_url: base_url, api_version: API_VERSION, token: @token
|
9
18
|
)
|
10
19
|
end
|
11
20
|
|
21
|
+
def serialized_token
|
22
|
+
@token.serialized_token
|
23
|
+
end
|
24
|
+
|
12
25
|
include Endpoints::Practices
|
13
26
|
include Endpoints::Departments
|
14
27
|
include Endpoints::Patients
|
@@ -20,5 +33,9 @@ module AthenaHealth
|
|
20
33
|
include Endpoints::Subscriptions
|
21
34
|
include Endpoints::Claims
|
22
35
|
include Endpoints::CustomFields
|
36
|
+
|
37
|
+
def self.base_url(production:)
|
38
|
+
production ? PRODUCTION_BASE_URL : PREVIEW_BASE_URL
|
39
|
+
end
|
23
40
|
end
|
24
41
|
end
|
@@ -2,43 +2,23 @@ require 'json'
|
|
2
2
|
|
3
3
|
module AthenaHealth
|
4
4
|
class Connection
|
5
|
-
|
6
|
-
PREVIEW_BASE_URL = 'https://api.preview.platform.athenahealth.com'.freeze
|
7
|
-
API_VERSION = 'v1'.freeze
|
8
|
-
|
9
|
-
def initialize(client_id:, secret:, token: nil, production: )
|
10
|
-
@client_id = client_id
|
11
|
-
@secret = secret
|
5
|
+
def initialize(base_url:, api_version:, token:)
|
12
6
|
@token = token
|
13
|
-
@
|
14
|
-
|
15
|
-
|
16
|
-
def authenticate
|
17
|
-
response = Typhoeus.post(
|
18
|
-
"#{base_url}/oauth2/#{API_VERSION}/token",
|
19
|
-
userpwd: "#{@client_id}:#{@secret}",
|
20
|
-
body: {
|
21
|
-
grant_type: 'client_credentials',
|
22
|
-
scope: 'athena/service/Athenanet.MDP.*'
|
23
|
-
}
|
24
|
-
).response_body
|
25
|
-
|
26
|
-
@token = JSON.parse(response)['access_token']
|
7
|
+
@api_version = api_version
|
8
|
+
@base_url = base_url
|
27
9
|
end
|
28
10
|
|
29
11
|
def call(endpoint:, method:, params: {}, body: {}, second_call: false)
|
30
|
-
authenticate if @token.nil?
|
31
|
-
|
32
12
|
response = Typhoeus::Request.new(
|
33
|
-
"#{base_url}/#{
|
13
|
+
"#{@base_url}/#{@api_version}/#{endpoint}",
|
34
14
|
method: method,
|
35
|
-
headers:
|
15
|
+
headers: @token.auth_header,
|
36
16
|
params: params,
|
37
17
|
body: body
|
38
18
|
).run
|
39
19
|
|
40
20
|
if response.response_code == 401 && !second_call
|
41
|
-
|
21
|
+
@token.reset!
|
42
22
|
return call(endpoint: endpoint, method: method, second_call: true, body: body, params: params)
|
43
23
|
end
|
44
24
|
|
@@ -48,13 +28,9 @@ module AthenaHealth
|
|
48
28
|
|
49
29
|
body = response.response_body
|
50
30
|
|
51
|
-
if [400, 409].include? response.response_code
|
52
|
-
fail AthenaHealth::ValidationError.new(json_response(body))
|
53
|
-
end
|
31
|
+
raise AthenaHealth::ValidationError, json_response(body) if [400, 409].include? response.response_code
|
54
32
|
|
55
|
-
if response.response_code != 200
|
56
|
-
AthenaHealth::Error.new(code: response.response_code).render
|
57
|
-
end
|
33
|
+
AthenaHealth::Error.new(code: response.response_code).render if response.response_code != 200
|
58
34
|
|
59
35
|
json_response(body)
|
60
36
|
end
|
@@ -64,9 +40,5 @@ module AthenaHealth
|
|
64
40
|
def json_response(body)
|
65
41
|
JSON.parse(body)
|
66
42
|
end
|
67
|
-
|
68
|
-
def base_url
|
69
|
-
@base_url ||= @production ? PRODUCTION_BASE_URL : PREVIEW_BASE_URL
|
70
|
-
end
|
71
43
|
end
|
72
44
|
end
|
@@ -8,7 +8,7 @@ module AthenaHealth
|
|
8
8
|
params: params.merge!(departmentid: department_id, ordertype: order_type)
|
9
9
|
)
|
10
10
|
|
11
|
-
response.map {|facility| AthenaHealth::Facility.new(facility) }
|
11
|
+
response.map { |facility| AthenaHealth::Facility.new(facility) }
|
12
12
|
end
|
13
13
|
|
14
14
|
def all_medications(practice_id:, search_value:)
|
@@ -18,7 +18,7 @@ module AthenaHealth
|
|
18
18
|
params: { searchvalue: search_value }
|
19
19
|
)
|
20
20
|
|
21
|
-
response.map {|medication| AthenaHealth::Medication.new(medication) }
|
21
|
+
response.map { |medication| AthenaHealth::Medication.new(medication) }
|
22
22
|
end
|
23
23
|
|
24
24
|
def all_allergies(practice_id:, search_value:)
|
@@ -28,7 +28,7 @@ module AthenaHealth
|
|
28
28
|
params: { searchvalue: search_value }
|
29
29
|
)
|
30
30
|
|
31
|
-
response.map {|allergy| AthenaHealth::Allergy.new(allergy) }
|
31
|
+
response.map { |allergy| AthenaHealth::Allergy.new(allergy) }
|
32
32
|
end
|
33
33
|
|
34
34
|
def all_insurances(practice_id:, plan_name:, member_id:, state:, params: {})
|
@@ -54,6 +54,20 @@ module AthenaHealth
|
|
54
54
|
|
55
55
|
response.map { |ordertype| AthenaHealth::OrderType.new(ordertype) }
|
56
56
|
end
|
57
|
+
|
58
|
+
def all_gender_identities(practice_id:, show2015edcehrtvalues: nil, limit: nil, offset: nil)
|
59
|
+
params = {
|
60
|
+
show2015edcehrtvalues: show2015edcehrtvalues, limit: limit, offset: offset
|
61
|
+
}.reject { |_k, v| v.nil? }
|
62
|
+
|
63
|
+
GenderIdentityFieldCollection.new(
|
64
|
+
@api.call(
|
65
|
+
endpoint: "#{practice_id}/configuration/patients/genderidentity",
|
66
|
+
method: :get,
|
67
|
+
params: params
|
68
|
+
)
|
69
|
+
)
|
70
|
+
end
|
57
71
|
end
|
58
72
|
end
|
59
73
|
end
|
data/lib/athena_health.rb
CHANGED
@@ -3,6 +3,7 @@ require 'virtus'
|
|
3
3
|
|
4
4
|
require 'athena_health/version'
|
5
5
|
require 'athena_health/connection'
|
6
|
+
require 'athena_health/auth_token'
|
6
7
|
require 'athena_health/error'
|
7
8
|
require 'athena_health/endpoints/practices'
|
8
9
|
require 'athena_health/endpoints/departments'
|
@@ -37,6 +38,7 @@ require 'athena_health/appointment_type_collection'
|
|
37
38
|
require 'athena_health/appointment'
|
38
39
|
require 'athena_health/appointment_waitlist'
|
39
40
|
require 'athena_health/appointment_collection'
|
41
|
+
require 'athena_health/gender_identity_field_collection'
|
40
42
|
require 'athena_health/insurance_package'
|
41
43
|
require 'athena_health/insurance_package_collection'
|
42
44
|
require 'athena_health/patient_appointment_reason'
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: athena_health
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mateusz Urbański
|
8
|
+
- Ben Jones
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
12
|
+
date: 2023-01-20 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: typhoeus
|
@@ -94,10 +95,39 @@ dependencies:
|
|
94
95
|
- - "~>"
|
95
96
|
- !ruby/object:Gem::Version
|
96
97
|
version: '3.0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: timecop
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.9.6
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 0.9.6
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rubocop
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '1.42'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '1.42'
|
97
126
|
description: Ruby wrapper for Athenahealth API. See https://developer.athenahealth.com/io-docs
|
98
127
|
for more details.
|
99
128
|
email:
|
100
129
|
- mateuszurbanski@yahoo.pl
|
130
|
+
- ben@benjones.io
|
101
131
|
executables: []
|
102
132
|
extensions: []
|
103
133
|
extra_rdoc_files: []
|
@@ -123,6 +153,7 @@ files:
|
|
123
153
|
- lib/athena_health/appointment_type.rb
|
124
154
|
- lib/athena_health/appointment_type_collection.rb
|
125
155
|
- lib/athena_health/appointment_waitlist.rb
|
156
|
+
- lib/athena_health/auth_token.rb
|
126
157
|
- lib/athena_health/balance.rb
|
127
158
|
- lib/athena_health/base_collection.rb
|
128
159
|
- lib/athena_health/base_model.rb
|
@@ -156,6 +187,7 @@ files:
|
|
156
187
|
- lib/athena_health/error.rb
|
157
188
|
- lib/athena_health/event.rb
|
158
189
|
- lib/athena_health/facility.rb
|
190
|
+
- lib/athena_health/gender_identity_field_collection.rb
|
159
191
|
- lib/athena_health/insurance.rb
|
160
192
|
- lib/athena_health/insurance_collection.rb
|
161
193
|
- lib/athena_health/insurance_package.rb
|