athena_health 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/athena_health.gemspec +7 -6
- data/lib/athena_health/appointment.rb +1 -0
- 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 +42 -10
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.'
|
@@ -18,11 +17,13 @@ Gem::Specification.new do |spec|
|
|
18
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
18
|
spec.require_paths = ['lib']
|
20
19
|
|
21
|
-
spec.add_dependency 'typhoeus'
|
22
|
-
spec.add_dependency 'virtus'
|
20
|
+
spec.add_dependency 'typhoeus', '~> 1.4'
|
21
|
+
spec.add_dependency 'virtus', '~> 2.0'
|
23
22
|
|
24
23
|
spec.add_development_dependency 'bundler', '~> 2.2.24'
|
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,43 +1,44 @@
|
|
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:
|
12
|
+
date: 2023-01-20 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: typhoeus
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- - "
|
18
|
+
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
+
version: '1.4'
|
20
21
|
type: :runtime
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- - "
|
25
|
+
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
+
version: '1.4'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: virtus
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- - "
|
32
|
+
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
+
version: '2.0'
|
34
35
|
type: :runtime
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- - "
|
39
|
+
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
+
version: '2.0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: bundler
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -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
|