pokitdok-ruby 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +69 -51
- data/LICENSE.txt +1 -1
- data/VERSION +1 -1
- data/lib/pokitdok.rb +333 -97
- data/pokitdok-ruby.gemspec +9 -4
- data/spec/pokitdok_spec.rb +145 -37
- data/vcr_cassettes/activities.yml +30 -230
- data/vcr_cassettes/auth.yml +7 -7
- data/vcr_cassettes/authorizations.yml +11 -11
- data/vcr_cassettes/cash_prices.yml +13 -13
- data/vcr_cassettes/claims.yml +35 -34
- data/vcr_cassettes/claims_status.yml +12 -12
- data/vcr_cassettes/eligibility.yml +93 -70
- data/vcr_cassettes/enrollment.yml +40 -40
- data/vcr_cassettes/files.yml +57 -2
- data/vcr_cassettes/insurance_prices.yml +13 -13
- data/vcr_cassettes/payers.yml +463 -632
- data/vcr_cassettes/plans.yml +10 -10
- data/vcr_cassettes/plans_no_args.yml +10 -10
- data/vcr_cassettes/providers.yml +9 -9
- data/vcr_cassettes/referrals.yml +12 -12
- data/vcr_cassettes/scheduling.yml +182 -0
- data/vcr_cassettes/scheduling_scoped.yml +223 -0
- data/vcr_cassettes/trading_partners_get.yml +11 -12
- data/vcr_cassettes/trading_partners_index.yml +351 -420
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8d295a4e720cbc16c0760e1bd39f0458d2dbff0
|
4
|
+
data.tar.gz: 35fd84a68b5c6dd2e9e17d0e3afc3c02668679ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d167b436927487759778b7a40f43595ea29f06386389ad9f721a76e8f50bdff1cc53f99e6b663c844d2c916e9d76443af5fa02144fc28778590c60e797499133
|
7
|
+
data.tar.gz: 07387fa5e0f1959879ec98219c709b49073808dc7483eacfd5fe576aa616aa26e20fee638c14a90562dcfee2c5bb72df9bfa86c3c737aba5c1b8a9979ed86f7e
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
addressable (2.3.
|
5
|
-
ansi (1.
|
4
|
+
addressable (2.3.8)
|
5
|
+
ansi (1.5.0)
|
6
6
|
ast (2.0.0)
|
7
7
|
astrolabe (1.3.0)
|
8
8
|
parser (>= 2.2.0.pre.3, < 3.0)
|
@@ -10,45 +10,53 @@ GEM
|
|
10
10
|
celluloid (0.16.0)
|
11
11
|
timers (~> 4.0.0)
|
12
12
|
coderay (1.1.0)
|
13
|
-
coveralls (0.
|
14
|
-
|
15
|
-
rest-client
|
16
|
-
simplecov (
|
17
|
-
term-ansicolor
|
18
|
-
thor
|
13
|
+
coveralls (0.8.1)
|
14
|
+
json (~> 1.8)
|
15
|
+
rest-client (>= 1.6.8, < 2)
|
16
|
+
simplecov (~> 0.10.0)
|
17
|
+
term-ansicolor (~> 1.3)
|
18
|
+
thor (~> 0.19.1)
|
19
19
|
crack (0.4.2)
|
20
20
|
safe_yaml (~> 1.0.0)
|
21
21
|
descendants_tracker (0.0.4)
|
22
22
|
thread_safe (~> 0.3, >= 0.3.1)
|
23
23
|
docile (1.1.5)
|
24
|
-
|
24
|
+
domain_name (0.5.24)
|
25
|
+
unf (>= 0.0.5, < 1.0.0)
|
26
|
+
faraday (0.9.1)
|
25
27
|
multipart-post (>= 1.2, < 3)
|
26
|
-
ffi (1.9.
|
28
|
+
ffi (1.9.8)
|
27
29
|
formatador (0.2.5)
|
28
|
-
git (1.2.
|
29
|
-
github_api (0.12.
|
30
|
+
git (1.2.9.1)
|
31
|
+
github_api (0.12.3)
|
30
32
|
addressable (~> 2.3)
|
31
33
|
descendants_tracker (~> 0.0.4)
|
32
34
|
faraday (~> 0.8, < 0.10)
|
33
|
-
hashie (>= 3.
|
35
|
+
hashie (>= 3.3)
|
34
36
|
multi_json (>= 1.7.5, < 2.0)
|
35
37
|
nokogiri (~> 1.6.3)
|
36
38
|
oauth2
|
37
|
-
guard (2.
|
39
|
+
guard (2.12.5)
|
38
40
|
formatador (>= 0.2.4)
|
39
41
|
listen (~> 2.7)
|
40
42
|
lumberjack (~> 1.0)
|
43
|
+
nenv (~> 0.1)
|
44
|
+
notiffany (~> 0.0)
|
41
45
|
pry (>= 0.9.12)
|
46
|
+
shellany (~> 0.0)
|
42
47
|
thor (>= 0.18.1)
|
43
|
-
guard-
|
44
|
-
|
48
|
+
guard-compat (1.2.1)
|
49
|
+
guard-minitest (2.4.4)
|
50
|
+
guard-compat (~> 1.2)
|
45
51
|
minitest (>= 3.0)
|
46
|
-
guard-rubocop (1.
|
52
|
+
guard-rubocop (1.2.0)
|
47
53
|
guard (~> 2.0)
|
48
54
|
rubocop (~> 0.20)
|
49
|
-
hashie (3.
|
50
|
-
highline (1.
|
55
|
+
hashie (3.4.1)
|
56
|
+
highline (1.7.2)
|
51
57
|
hitimes (1.2.2)
|
58
|
+
http-cookie (1.0.2)
|
59
|
+
domain_name (~> 0.5)
|
52
60
|
jeweler (2.0.1)
|
53
61
|
builder
|
54
62
|
bundler (>= 1.0)
|
@@ -58,80 +66,89 @@ GEM
|
|
58
66
|
nokogiri (>= 1.5.10)
|
59
67
|
rake
|
60
68
|
rdoc
|
61
|
-
json (1.8.
|
62
|
-
jwt (1.
|
63
|
-
listen (2.
|
64
|
-
celluloid (
|
69
|
+
json (1.8.2)
|
70
|
+
jwt (1.5.0)
|
71
|
+
listen (2.10.0)
|
72
|
+
celluloid (~> 0.16.0)
|
65
73
|
rb-fsevent (>= 0.9.3)
|
66
74
|
rb-inotify (>= 0.9)
|
67
75
|
lumberjack (1.0.9)
|
68
76
|
metaclass (0.0.4)
|
69
77
|
method_source (0.8.2)
|
70
|
-
mime-types (2.
|
71
|
-
mini_portile (0.6.
|
72
|
-
minitest (5.
|
73
|
-
minitest-reporters (1.0.
|
78
|
+
mime-types (2.5)
|
79
|
+
mini_portile (0.6.2)
|
80
|
+
minitest (5.6.1)
|
81
|
+
minitest-reporters (1.0.16)
|
74
82
|
ansi
|
75
83
|
builder
|
76
84
|
minitest (>= 5.0)
|
77
85
|
ruby-progressbar
|
78
86
|
mocha (1.1.0)
|
79
87
|
metaclass (~> 0.0.1)
|
80
|
-
multi_json (1.
|
88
|
+
multi_json (1.11.0)
|
81
89
|
multi_xml (0.5.5)
|
82
90
|
multipart-post (2.0.0)
|
83
|
-
|
84
|
-
|
85
|
-
|
91
|
+
nenv (0.2.0)
|
92
|
+
netrc (0.10.3)
|
93
|
+
nokogiri (1.6.6.2)
|
94
|
+
mini_portile (~> 0.6.0)
|
95
|
+
notiffany (0.0.6)
|
96
|
+
nenv (~> 0.1)
|
97
|
+
shellany (~> 0.0)
|
86
98
|
oauth2 (0.9.4)
|
87
99
|
faraday (>= 0.8, < 0.10)
|
88
100
|
jwt (~> 1.0)
|
89
101
|
multi_json (~> 1.3)
|
90
102
|
multi_xml (~> 0.5)
|
91
103
|
rack (~> 1.2)
|
92
|
-
parser (2.2.
|
104
|
+
parser (2.2.2.3)
|
93
105
|
ast (>= 1.1, < 3.0)
|
94
|
-
|
95
|
-
powerpack (0.0.9)
|
106
|
+
powerpack (0.1.1)
|
96
107
|
pry (0.10.1)
|
97
108
|
coderay (~> 1.1.0)
|
98
109
|
method_source (~> 0.8.1)
|
99
110
|
slop (~> 3.4)
|
100
|
-
rack (1.
|
111
|
+
rack (1.6.1)
|
101
112
|
rainbow (2.0.0)
|
102
|
-
rake (10.
|
103
|
-
rb-fsevent (0.9.
|
113
|
+
rake (10.4.2)
|
114
|
+
rb-fsevent (0.9.5)
|
104
115
|
rb-inotify (0.9.5)
|
105
116
|
ffi (>= 0.5.0)
|
106
|
-
rdoc (4.
|
117
|
+
rdoc (4.2.0)
|
107
118
|
json (~> 1.4)
|
108
|
-
rest-client (1.
|
119
|
+
rest-client (1.8.0)
|
120
|
+
http-cookie (>= 1.0.2, < 2.0)
|
109
121
|
mime-types (>= 1.16, < 3.0)
|
110
122
|
netrc (~> 0.7)
|
111
|
-
rubocop (0.
|
123
|
+
rubocop (0.31.0)
|
112
124
|
astrolabe (~> 1.3)
|
113
|
-
parser (>= 2.2.
|
114
|
-
powerpack (~> 0.
|
125
|
+
parser (>= 2.2.2.1, < 3.0)
|
126
|
+
powerpack (~> 0.1)
|
115
127
|
rainbow (>= 1.99.1, < 3.0)
|
116
128
|
ruby-progressbar (~> 1.4)
|
117
|
-
ruby-progressbar (1.
|
129
|
+
ruby-progressbar (1.7.5)
|
118
130
|
safe_yaml (1.0.4)
|
119
|
-
|
131
|
+
shellany (0.0.1)
|
132
|
+
simplecov (0.10.0)
|
120
133
|
docile (~> 1.1.0)
|
121
|
-
|
122
|
-
simplecov-html (~> 0.
|
123
|
-
simplecov-html (0.
|
134
|
+
json (~> 1.8)
|
135
|
+
simplecov-html (~> 0.10.0)
|
136
|
+
simplecov-html (0.10.0)
|
124
137
|
slop (3.6.0)
|
125
138
|
term-ansicolor (1.3.0)
|
126
139
|
tins (~> 1.0)
|
127
|
-
terminal-notifier
|
140
|
+
terminal-notifier (1.6.3)
|
141
|
+
terminal-notifier-guard (1.6.4)
|
128
142
|
thor (0.19.1)
|
129
|
-
thread_safe (0.3.
|
143
|
+
thread_safe (0.3.5)
|
130
144
|
timers (4.0.1)
|
131
145
|
hitimes
|
132
|
-
tins (1.
|
146
|
+
tins (1.5.1)
|
147
|
+
unf (0.1.4)
|
148
|
+
unf_ext
|
149
|
+
unf_ext (0.0.7.1)
|
133
150
|
vcr (2.9.3)
|
134
|
-
webmock (1.
|
151
|
+
webmock (1.21.0)
|
135
152
|
addressable (>= 2.3.6)
|
136
153
|
crack (>= 0.3.2)
|
137
154
|
|
@@ -154,6 +171,7 @@ DEPENDENCIES
|
|
154
171
|
rdoc (~> 4.1)
|
155
172
|
rubocop (~> 0.20)
|
156
173
|
simplecov (~> 0.8)
|
174
|
+
terminal-notifier
|
157
175
|
terminal-notifier-guard (~> 1.5)
|
158
176
|
vcr (~> 2.9)
|
159
177
|
webmock (~> 1.17)
|
data/LICENSE.txt
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.2
|
data/lib/pokitdok.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2014, All Rights Reserved, PokitDok, Inc.
|
3
|
+
# Copyright (C) 2014-2015, All Rights Reserved, PokitDok, Inc.
|
4
4
|
# https://www.pokitdok.com
|
5
5
|
#
|
6
6
|
# Please see the LICENSE.txt file for more information.
|
@@ -20,7 +20,6 @@ module PokitDok
|
|
20
20
|
POKITDOK_URL_BASE = 'https://platform.pokitdok.com' # :nodoc:
|
21
21
|
|
22
22
|
attr_reader :client # :nodoc:
|
23
|
-
attr_reader :token # :nodoc:
|
24
23
|
attr_reader :api_url
|
25
24
|
attr_reader :version
|
26
25
|
|
@@ -37,123 +36,109 @@ module PokitDok
|
|
37
36
|
@version = version
|
38
37
|
|
39
38
|
@api_url = "#{url_base}/api/#{version}"
|
40
|
-
|
41
39
|
@client = OAuth2::Client.new(@client_id, @client_secret,
|
42
40
|
site: @api_url, token_url: '/oauth2/token')
|
43
|
-
refresh_token
|
44
|
-
end
|
45
41
|
|
46
|
-
def url_base
|
47
|
-
POKITDOK_URL_BASE
|
48
|
-
end
|
49
42
|
|
50
|
-
|
51
|
-
|
43
|
+
@scopes = {}
|
44
|
+
@scopes['default'] = { scope: refresh_token }
|
45
|
+
scope 'default'
|
52
46
|
end
|
53
47
|
|
54
|
-
#
|
55
|
-
def
|
56
|
-
|
48
|
+
# Accessor for the PokitDok Platform URL, overridable for testing.
|
49
|
+
def url_base
|
50
|
+
POKITDOK_URL_BASE
|
57
51
|
end
|
58
52
|
|
59
|
-
#
|
53
|
+
# Adds an authorization code for a given OAuth2 scope.
|
54
|
+
#
|
55
|
+
# +name+ the scope name
|
56
|
+
# +code+ the authorization code
|
60
57
|
#
|
61
|
-
|
62
|
-
|
63
|
-
@token = client.client_credentials.get_token(
|
64
|
-
headers: { 'Authorization' => 'Basic' })
|
58
|
+
def scope_code(name, code)
|
59
|
+
@scopes[name] = { code: code }
|
65
60
|
end
|
66
61
|
|
67
|
-
# Invokes the
|
62
|
+
# Invokes the appointments endpoint, to query for open appointment slots
|
63
|
+
# (using pd_provider_uuid and location) or booked appointments (using
|
64
|
+
# patient_uuid).
|
65
|
+
#
|
66
|
+
# +params+ an optional Hash of parameters
|
67
|
+
#
|
68
68
|
def activities(params = {})
|
69
|
-
|
70
|
-
|
71
|
-
params: params)
|
72
|
-
JSON.parse(response.body)
|
69
|
+
scope 'default'
|
70
|
+
get('activities/', params)
|
73
71
|
end
|
74
72
|
|
75
|
-
# Invokes the authorizations endpoint
|
73
|
+
# Invokes the authorizations endpoint.
|
74
|
+
#
|
75
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
76
|
+
#
|
76
77
|
def authorizations(params = {})
|
77
|
-
|
78
|
-
|
79
|
-
body: params.to_json) do |request|
|
80
|
-
request.headers['Content-Type'] = 'application/json'
|
81
|
-
end
|
82
|
-
JSON.parse(response.body)
|
78
|
+
scope 'default'
|
79
|
+
post('authorizations/', params)
|
83
80
|
end
|
84
81
|
|
85
|
-
# Invokes the cash prices endpoint
|
82
|
+
# Invokes the cash prices endpoint.
|
83
|
+
#
|
84
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
85
|
+
#
|
86
86
|
def cash_prices(params = {})
|
87
|
-
|
88
|
-
|
89
|
-
params: params)
|
90
|
-
JSON.parse(response.body)
|
87
|
+
scope 'default'
|
88
|
+
get('prices/cash', params)
|
91
89
|
end
|
92
90
|
|
93
|
-
# Invokes the
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
params: params)
|
98
|
-
JSON.parse(response.body)
|
99
|
-
end
|
100
|
-
|
101
|
-
# Invokes the claims endpoint, with an optional Hash of parameters.
|
91
|
+
# Invokes the claims endpoint.
|
92
|
+
#
|
93
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
94
|
+
#
|
102
95
|
def claims(params = {})
|
103
|
-
|
104
|
-
|
105
|
-
body: params.to_json) do |request|
|
106
|
-
request.headers['Content-Type'] = 'application/json'
|
107
|
-
end
|
108
|
-
JSON.parse(response.body)
|
96
|
+
scope 'default'
|
97
|
+
post('claims/', params)
|
109
98
|
end
|
110
99
|
|
111
|
-
# Invokes the claims status endpoint
|
100
|
+
# Invokes the claims status endpoint.
|
101
|
+
#
|
102
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
103
|
+
#
|
112
104
|
def claims_status(params = {})
|
113
|
-
|
114
|
-
|
115
|
-
body: params.to_json) do |request|
|
116
|
-
request.headers['Content-Type'] = 'application/json'
|
117
|
-
end
|
118
|
-
JSON.parse(response.body)
|
105
|
+
scope 'default'
|
106
|
+
post('claims/status', params)
|
119
107
|
end
|
120
108
|
|
121
|
-
|
122
|
-
#
|
109
|
+
# Invokes the eligibility endpoint.
|
110
|
+
#
|
111
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
112
|
+
#
|
123
113
|
def eligibility(params = {})
|
124
|
-
|
125
|
-
|
126
|
-
body: params.to_json) do |request|
|
127
|
-
request.headers['Content-Type'] = 'application/json'
|
128
|
-
end
|
129
|
-
JSON.parse(response.body)
|
114
|
+
scope 'default'
|
115
|
+
post('eligibility/', params)
|
130
116
|
end
|
131
117
|
|
132
|
-
# Invokes the enrollment endpoint
|
118
|
+
# Invokes the enrollment endpoint.
|
119
|
+
#
|
120
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
121
|
+
#
|
133
122
|
def enrollment(params = {})
|
134
|
-
|
135
|
-
|
136
|
-
body: params.to_json) do |request|
|
137
|
-
request.headers['Content-Type'] = 'application/json'
|
138
|
-
end
|
139
|
-
JSON.parse(response.body)
|
123
|
+
scope 'default'
|
124
|
+
post('enrollment/', params)
|
140
125
|
end
|
141
126
|
|
142
127
|
# Uploads an EDI file to the files endpoint.
|
143
128
|
# Uses the multipart-post gem, since oauth2 doesn't support multipart.
|
144
129
|
#
|
145
130
|
# +trading_partner_id+ the trading partner to transmit to
|
146
|
-
#
|
147
131
|
# +filename+ the path to the file to transmit
|
148
132
|
#
|
149
133
|
def files(trading_partner_id, filename)
|
134
|
+
scope 'default'
|
150
135
|
url = URI.parse(@api_url + '/files/')
|
151
136
|
|
152
137
|
File.open(filename) do |f|
|
153
138
|
req = Net::HTTP::Post::Multipart.new url.path,
|
154
139
|
'file' => UploadIO.new(f, 'application/EDI-X12', filename),
|
155
140
|
'trading_partner_id' => trading_partner_id
|
156
|
-
req['Authorization'] = "Bearer #{
|
141
|
+
req['Authorization'] = "Bearer #{default_scope.token}"
|
157
142
|
req['User-Agent'] = user_agent
|
158
143
|
|
159
144
|
@response = Net::HTTP.start(url.host, url.port) do |http|
|
@@ -164,54 +149,305 @@ module PokitDok
|
|
164
149
|
JSON.parse(@response.body)
|
165
150
|
end
|
166
151
|
|
167
|
-
# Invokes the
|
152
|
+
# Invokes the insurance prices endpoint.
|
153
|
+
#
|
154
|
+
# +params+ an optional hash of parameters
|
155
|
+
#
|
156
|
+
def insurance_prices(params = {})
|
157
|
+
scope 'default'
|
158
|
+
get('prices/insurance', params)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Invokes the payers endpoint.
|
162
|
+
#
|
163
|
+
# +params+ an optional hash of parameters
|
164
|
+
#
|
168
165
|
def payers(params = {})
|
169
|
-
|
170
|
-
|
166
|
+
scope 'default'
|
167
|
+
get('payers/', params)
|
171
168
|
end
|
172
169
|
|
173
|
-
# Invokes the plans endpoint
|
170
|
+
# Invokes the plans endpoint.
|
171
|
+
#
|
172
|
+
# +params+ an optional Hash of parameters
|
173
|
+
#
|
174
174
|
def plans(params = {})
|
175
|
-
|
176
|
-
|
175
|
+
scope 'default'
|
176
|
+
get('plans/', params)
|
177
177
|
end
|
178
178
|
|
179
|
-
# Invokes the providers endpoint
|
179
|
+
# Invokes the providers endpoint.
|
180
|
+
#
|
181
|
+
# +params+ an optional Hash of parameters
|
182
|
+
#
|
180
183
|
def providers(params = {})
|
181
|
-
response =
|
184
|
+
response = default_scope.get('providers/') do |request|
|
182
185
|
request.params = params
|
183
186
|
end
|
184
187
|
JSON.parse(response.body)
|
185
188
|
end
|
186
189
|
|
187
|
-
# Invokes the referrals endpoint
|
190
|
+
# Invokes the referrals endpoint.
|
191
|
+
#
|
192
|
+
# +params+ an optional Hash of parameters
|
193
|
+
#
|
188
194
|
def referrals(params = {})
|
189
|
-
|
190
|
-
|
191
|
-
body: params.to_json) do |request|
|
192
|
-
request.headers['Content-Type'] = 'application/json'
|
193
|
-
end
|
194
|
-
JSON.parse(response.body)
|
195
|
+
scope 'default'
|
196
|
+
post('referrals/', params)
|
195
197
|
end
|
196
198
|
|
197
|
-
# Invokes the trading partners endpoint
|
198
|
-
#
|
199
|
+
# Invokes the trading partners endpoint.
|
200
|
+
#
|
201
|
+
# +params+ an optional Hash of parameters
|
202
|
+
#
|
199
203
|
def trading_partners(params = {})
|
200
204
|
trading_partner_id = params.delete :trading_partner_id
|
201
205
|
|
202
206
|
response =
|
203
|
-
|
204
|
-
|
205
|
-
|
207
|
+
default_scope.get("tradingpartners/#{trading_partner_id}") do |request|
|
208
|
+
request.params = params
|
209
|
+
end
|
206
210
|
JSON.parse(response.body)
|
207
211
|
end
|
208
212
|
|
209
|
-
#
|
210
|
-
|
211
|
-
|
213
|
+
# Scheduling endpoints
|
214
|
+
|
215
|
+
# Invokes the appointments endpoint to query for an open appointment
|
216
|
+
# slot or a booked appointment given a specific pd_appointment_uuid,
|
217
|
+
# the PokitDok unique appointment identifier.
|
218
|
+
#
|
219
|
+
# +params+ an optional Hash of parameters
|
220
|
+
#
|
221
|
+
def appointment(params = {})
|
222
|
+
@appointment_id = params.delete :appointment_id
|
223
|
+
scope 'user_schedule'
|
224
|
+
|
225
|
+
get_one('schedule/appointmenttypes/', @appointment_id, params)
|
226
|
+
end
|
227
|
+
|
228
|
+
# Invokes the activities endpoint.
|
229
|
+
#
|
230
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
231
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
232
|
+
# authorization code you received into
|
233
|
+
# scope_code('user_schedule', '(the authorization code)')
|
234
|
+
#
|
235
|
+
# +params+ an optional Hash of parameters
|
236
|
+
#
|
237
|
+
def appointments(params = {})
|
238
|
+
scope 'user_schedule'
|
239
|
+
get('schedule/appointments/', params)
|
240
|
+
end
|
241
|
+
|
242
|
+
# Invokes the appointment_types endpoint, to get information on a specific
|
243
|
+
# appointment type.
|
244
|
+
#
|
245
|
+
# +params+ an optional Hash of parameters
|
246
|
+
#
|
247
|
+
def appointment_type(params = {})
|
248
|
+
appointment_type = params.delete :uuid
|
249
|
+
|
250
|
+
response =
|
251
|
+
default_scope.get("schedule/appointmenttypes/#{appointment_type}") do |request|
|
212
252
|
request.params = params
|
213
253
|
end
|
254
|
+
|
255
|
+
JSON.parse(response.body)
|
256
|
+
end
|
257
|
+
|
258
|
+
# Invokes the appointment_types endpoint.
|
259
|
+
#
|
260
|
+
# +params+ an optional hash of parameters
|
261
|
+
#
|
262
|
+
def appointment_types(params = {})
|
263
|
+
scope 'default'
|
264
|
+
get('schedule/appointmenttypes/', params)
|
265
|
+
end
|
266
|
+
|
267
|
+
# Books an appointment.
|
268
|
+
#
|
269
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
270
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
271
|
+
# authorization code you received into
|
272
|
+
# scope_code('user_schedule', '(the authorization code)')
|
273
|
+
#
|
274
|
+
# +params+ an optional hash of parameters that will be sent in the POST body
|
275
|
+
#
|
276
|
+
def book_appointment(appointment_uuid, params = {})
|
277
|
+
scope 'user_schedule'
|
278
|
+
|
279
|
+
put_one("schedule/appointments", appointment_uuid, params)
|
280
|
+
end
|
281
|
+
|
282
|
+
# Cancels the specified appointment.
|
283
|
+
#
|
284
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
285
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
286
|
+
# authorization code you received into
|
287
|
+
# scope_code('user_schedule', '(the authorization code)')
|
288
|
+
#
|
289
|
+
# +params+ an optional Hash of parameters
|
290
|
+
#
|
291
|
+
def cancel_appointment(appointment_uuid, params={})
|
292
|
+
scope 'user_schedule'
|
293
|
+
|
294
|
+
delete_one("schedule/appointments", appointment_uuid, params)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Invokes the schedule/appointments endpoint.
|
298
|
+
#
|
299
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
300
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
301
|
+
# authorization code you received into
|
302
|
+
# scope_code('user_schedule', '(the authorization code)')
|
303
|
+
#
|
304
|
+
# +params+ an optional hash of parameters
|
305
|
+
#
|
306
|
+
def open_appointment_slots(params = {})
|
307
|
+
scope 'user_schedule'
|
308
|
+
get('schedule/appointments', params)
|
309
|
+
end
|
310
|
+
|
311
|
+
# Invokes the schedulers endpoint.
|
312
|
+
#
|
313
|
+
# +params an optional Hash of parameters
|
314
|
+
#
|
315
|
+
def schedulers(params = {})
|
316
|
+
scope 'default'
|
317
|
+
get('schedule/schedulers/', params)
|
318
|
+
end
|
319
|
+
|
320
|
+
# Invokes the schedulers endpoint, to get information about a specific
|
321
|
+
# scheduler.
|
322
|
+
#
|
323
|
+
# +params+ an optional Hash of parameters
|
324
|
+
#
|
325
|
+
def scheduler(params = {})
|
326
|
+
scheduler_id = params.delete :uuid
|
327
|
+
|
328
|
+
response =
|
329
|
+
default_scope.get("schedule/schedulers/#{scheduler_id}") do |request|
|
330
|
+
request.params = params
|
331
|
+
end
|
214
332
|
JSON.parse(response.body)
|
215
333
|
end
|
334
|
+
|
335
|
+
# Invokes the slots endpoint.
|
336
|
+
#
|
337
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
338
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
339
|
+
# authorization code you received into
|
340
|
+
# scope_code('user_schedule', '(the authorization code)')
|
341
|
+
#
|
342
|
+
# +params+ an optional Hash of parameters
|
343
|
+
#
|
344
|
+
def slots(params = {})
|
345
|
+
scope 'user_schedule'
|
346
|
+
end
|
347
|
+
|
348
|
+
# Updates the specified appointment.
|
349
|
+
#
|
350
|
+
# This endpoint uses the user_schedule OAuth2 scope. You'll need to
|
351
|
+
# get the user's authorization via our OAuth2 provider, and pass the
|
352
|
+
# authorization code you received into
|
353
|
+
# scope_code('user_schedule', '(the authorization code)')
|
354
|
+
#
|
355
|
+
# +params+ an optional Hash of parameters
|
356
|
+
#
|
357
|
+
def update_appointment(appointment_uuid, params={})
|
358
|
+
scope 'user_schedule'
|
359
|
+
|
360
|
+
put_one("schedule/appointments", appointment_uuid, params)
|
361
|
+
end
|
362
|
+
|
363
|
+
private
|
364
|
+
# Returns a standard User-Agent string to be passed along with all requests
|
365
|
+
def user_agent
|
366
|
+
"pokitdok-ruby 0.8 #{RUBY_DESCRIPTION}"
|
367
|
+
end
|
368
|
+
|
369
|
+
# Returns a standard set of headers to be passed along with all requests
|
370
|
+
def headers
|
371
|
+
{ 'User-Agent' => user_agent }
|
372
|
+
end
|
373
|
+
|
374
|
+
def get(endpoint, params = {})
|
375
|
+
response = current_scope.get(endpoint, headers: headers, params: params)
|
376
|
+
|
377
|
+
JSON.parse(response.body)
|
378
|
+
end
|
379
|
+
|
380
|
+
def get_one(endpoint, id, params = {})
|
381
|
+
response = current_scope.get("#{endpoint}/#{id}", headers: headers,
|
382
|
+
body: params.to_json) do |request|
|
383
|
+
request.headers['Content-Type'] = 'application/json'
|
384
|
+
end
|
385
|
+
|
386
|
+
JSON.parse(response.body)
|
387
|
+
end
|
388
|
+
|
389
|
+
def post(endpoint, params = {})
|
390
|
+
response = current_scope.post(endpoint, headers: headers,
|
391
|
+
body: params.to_json) do |request|
|
392
|
+
request.headers['Content-Type'] = 'application/json'
|
393
|
+
end
|
394
|
+
|
395
|
+
JSON.parse(response.body)
|
396
|
+
end
|
397
|
+
|
398
|
+
def put_one(endpoint, id, params = {})
|
399
|
+
response = current_scope.put("#{endpoint}/#{id}", headers: headers,
|
400
|
+
body: params.to_json) do |request|
|
401
|
+
request.headers['Content-Type'] = 'application/json'
|
402
|
+
end
|
403
|
+
|
404
|
+
JSON.parse(response.body)
|
405
|
+
end
|
406
|
+
|
407
|
+
def delete_one(endpoint, id, params = {})
|
408
|
+
response = current_scope.delete("#{endpoint}/#{id}", headers: headers,
|
409
|
+
body: params.to_json) do |request|
|
410
|
+
request.headers['Content-Type'] = 'application/json'
|
411
|
+
end
|
412
|
+
|
413
|
+
if response.body.empty?
|
414
|
+
response.status == 204
|
415
|
+
else
|
416
|
+
JSON.parse(response.body)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
# Refreshes the client token associated with this PokitDok connection
|
421
|
+
#
|
422
|
+
# FIXME: automatic refresh on expiration
|
423
|
+
#
|
424
|
+
def refresh_token(code=nil)
|
425
|
+
body = {}
|
426
|
+
body[:code] = code unless code.nil?
|
427
|
+
|
428
|
+
@client.client_credentials.get_token(
|
429
|
+
headers: { 'Authorization' => 'Basic' })
|
430
|
+
end
|
431
|
+
|
432
|
+
def scope(name)
|
433
|
+
raise ArgumentError, "You need to provide an authorization code for " \
|
434
|
+
"the scope #{name} with the scope_code method" if @scopes[name].nil?
|
435
|
+
|
436
|
+
@current_scope = name
|
437
|
+
|
438
|
+
if @scopes[name][:scope].nil?
|
439
|
+
@scopes[name][:scope] = refresh_token(@scopes[name][:code])
|
440
|
+
end
|
441
|
+
|
442
|
+
@scopes[name][:scope]
|
443
|
+
end
|
444
|
+
|
445
|
+
def current_scope
|
446
|
+
@scopes[@current_scope][:scope]
|
447
|
+
end
|
448
|
+
|
449
|
+
def default_scope
|
450
|
+
@scopes['default'][:scope]
|
451
|
+
end
|
216
452
|
end
|
217
453
|
end
|