pokitdok-ruby 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e5fc97ed93ded2d7833c84d29c18d063bb981d7
4
- data.tar.gz: 91f2ccc9591cb8d70c291beb809b67be1213c055
3
+ metadata.gz: b39ac044a97e9ac83136372927fe6c5bfa6870b9
4
+ data.tar.gz: 21f88737cc7b018516557e852a0e4442592907cc
5
5
  SHA512:
6
- metadata.gz: b43e6fd5e7fe7769c281944a0a9590abab65851ea1f8cb9cecdec1b704616b5600cbf53e9a647c3c8ff6d1d4602565c759fd0e60ac5c23afc3ffc83a34090139
7
- data.tar.gz: 3dea34981e2c905a08e9fe87bf851019e5f145ef804128d79ad61ef9559140e882e2b7d317840e3365211113b3cce98bb05461063c55ac7c0d3389d520cd7b31
6
+ metadata.gz: 729e896046445e051c1f85592df8d7a53d084f2639cf7cb800ba3350140b242d5814f133a6b8209b4265e8ebad4ac818aeab0a2c3e658ca8d685b12a8625ce1b
7
+ data.tar.gz: 9ba4038b4f3c01de58be59952063e80b292feb62228c366689dd66e0b1f3c82c84f3935b01b4f16888073865c5c6878d0961c503c9744e160883918dbcc80ffe
@@ -0,0 +1,2 @@
1
+ FROM ruby:1.9-onbuild
2
+ RUN bundle exec rake spec
@@ -0,0 +1,2 @@
1
+ FROM ruby:2.0-onbuild
2
+ RUN bundle exec rake spec
@@ -0,0 +1,2 @@
1
+ FROM ruby:2.1-onbuild
2
+ RUN bundle exec rake spec
@@ -0,0 +1,2 @@
1
+ FROM ruby:2.2-onbuild
2
+ RUN bundle exec rake spec
@@ -0,0 +1,2 @@
1
+ FROM ruby:2.3-onbuild
2
+ RUN bundle exec rake spec
@@ -0,0 +1,2 @@
1
+ FROM jruby:9.1-onbuild
2
+ RUN bundle exec rake spec
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
  gem 'oauth2', '~> 1.0', require: 'oauth2'
3
3
  gem 'multipart-post', '~> 2.0'
4
+ gem 'dotenv-rails', groups: [:development, :test]
4
5
 
5
6
  group :development do
6
7
  gem 'bundler', '~> 1.0'
@@ -12,7 +13,6 @@ group :development do
12
13
  gem 'jeweler', '~> 2.0'
13
14
  gem 'ansi', '~> 1.4'
14
15
  gem 'minitest-reporters', '~> 1.0'
15
- gem 'webmock', '~> 1.17'
16
16
  gem 'guard', '~> 2.6'
17
17
  gem 'guard-minitest', '~> 2.2'
18
18
  gem 'terminal-notifier'
@@ -1,6 +1,25 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
+ actionpack (4.2.7.1)
5
+ actionview (= 4.2.7.1)
6
+ activesupport (= 4.2.7.1)
7
+ rack (~> 1.6)
8
+ rack-test (~> 0.6.2)
9
+ rails-dom-testing (~> 1.0, >= 1.0.5)
10
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
11
+ actionview (4.2.7.1)
12
+ activesupport (= 4.2.7.1)
13
+ builder (~> 3.1)
14
+ erubis (~> 2.7.0)
15
+ rails-dom-testing (~> 1.0, >= 1.0.5)
16
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
17
+ activesupport (4.2.7.1)
18
+ i18n (~> 0.7)
19
+ json (~> 1.7, >= 1.7.7)
20
+ minitest (~> 5.1)
21
+ thread_safe (~> 0.3, >= 0.3.4)
22
+ tzinfo (~> 1.1)
4
23
  addressable (2.4.0)
5
24
  ansi (1.5.0)
6
25
  ast (2.0.0)
@@ -16,13 +35,16 @@ GEM
16
35
  simplecov (~> 0.10.0)
17
36
  term-ansicolor (~> 1.3)
18
37
  thor (~> 0.19.1)
19
- crack (0.4.2)
20
- safe_yaml (~> 1.0.0)
21
38
  descendants_tracker (0.0.4)
22
39
  thread_safe (~> 0.3, >= 0.3.1)
23
40
  docile (1.1.5)
24
41
  domain_name (0.5.24)
25
42
  unf (>= 0.0.5, < 1.0.0)
43
+ dotenv (2.2.0)
44
+ dotenv-rails (2.2.0)
45
+ dotenv (= 2.2.0)
46
+ railties (>= 3.2, < 5.1)
47
+ erubis (2.7.0)
26
48
  faraday (0.9.2)
27
49
  multipart-post (>= 1.2, < 3)
28
50
  ffi (1.9.8)
@@ -57,6 +79,7 @@ GEM
57
79
  hitimes (1.2.2-java)
58
80
  http-cookie (1.0.2)
59
81
  domain_name (~> 0.5)
82
+ i18n (0.8.0)
60
83
  jeweler (2.1.1)
61
84
  builder
62
85
  bundler (>= 1.0)
@@ -74,6 +97,8 @@ GEM
74
97
  celluloid (~> 0.16.0)
75
98
  rb-fsevent (>= 0.9.3)
76
99
  rb-inotify (>= 0.9)
100
+ loofah (2.0.3)
101
+ nokogiri (>= 1.5.9)
77
102
  lumberjack (1.0.9)
78
103
  metaclass (0.0.4)
79
104
  method_source (0.8.2)
@@ -119,6 +144,21 @@ GEM
119
144
  slop (~> 3.4)
120
145
  spoon (~> 0.0)
121
146
  rack (1.6.4)
147
+ rack-test (0.6.3)
148
+ rack (>= 1.0)
149
+ rails-deprecated_sanitizer (1.0.3)
150
+ activesupport (>= 4.2.0.alpha)
151
+ rails-dom-testing (1.0.8)
152
+ activesupport (>= 4.2.0.beta, < 5.0)
153
+ nokogiri (~> 1.6)
154
+ rails-deprecated_sanitizer (>= 1.0.1)
155
+ rails-html-sanitizer (1.0.3)
156
+ loofah (~> 2.0)
157
+ railties (4.2.7.1)
158
+ actionpack (= 4.2.7.1)
159
+ activesupport (= 4.2.7.1)
160
+ rake (>= 0.8.7)
161
+ thor (>= 0.18.1, < 2.0)
122
162
  rainbow (2.0.0)
123
163
  rake (11.2.2)
124
164
  rb-fsevent (0.9.5)
@@ -137,7 +177,6 @@ GEM
137
177
  rainbow (>= 1.99.1, < 3.0)
138
178
  ruby-progressbar (~> 1.4)
139
179
  ruby-progressbar (1.7.5)
140
- safe_yaml (1.0.4)
141
180
  semver (1.0.1)
142
181
  shellany (0.0.1)
143
182
  simplecov (0.10.0)
@@ -158,13 +197,12 @@ GEM
158
197
  timers (4.0.1)
159
198
  hitimes
160
199
  tins (1.5.1)
200
+ tzinfo (1.2.2)
201
+ thread_safe (~> 0.1)
161
202
  unf (0.1.4)
162
203
  unf_ext
163
204
  unf (0.1.4-java)
164
205
  unf_ext (0.0.7.1)
165
- webmock (1.21.0)
166
- addressable (>= 2.3.6)
167
- crack (>= 0.3.2)
168
206
 
169
207
  PLATFORMS
170
208
  java
@@ -174,6 +212,7 @@ DEPENDENCIES
174
212
  ansi (~> 1.4)
175
213
  bundler (~> 1.0)
176
214
  coveralls
215
+ dotenv-rails
177
216
  guard (~> 2.6)
178
217
  guard-minitest (~> 2.2)
179
218
  guard-rubocop (~> 1.0)
@@ -188,7 +227,6 @@ DEPENDENCIES
188
227
  simplecov (~> 0.8)
189
228
  terminal-notifier
190
229
  terminal-notifier-guard (~> 1.5)
191
- webmock (~> 1.17)
192
230
 
193
231
  BUNDLED WITH
194
- 1.12.5
232
+ 1.14.3
data/README.md CHANGED
@@ -1,4 +1,3 @@
1
- [![Build Status](https://travis-ci.org/pokitdok/pokitdok-ruby.svg?branch=master)](https://travis-ci.org/pokitdok/pokitdok-ruby)
2
1
  [![Gem Version](https://badge.fury.io/rb/pokitdok-ruby.svg)](http://badge.fury.io/rb/pokitdok-ruby)
3
2
  [![Dependency Freshness](https://www.versioneye.com/user/projects/538e498b46c4739edd0000ee/badge.svg)](https://www.versioneye.com/user/projects/538e498b46c4739edd0000ee)
4
3
 
@@ -19,11 +18,44 @@ PokitDok Platform API Client for Ruby
19
18
 
20
19
  ## Installation
21
20
  gem install pokitdok-ruby
21
+
22
+ ## Client ID and Secret Keys
23
+ Always use environment variables to store your PokitDok client and secret keys. To do so,
24
+ we recommmend either using `dotenv` or setting plain old Linux OS environment variables. The dotenv gem is very
25
+ similar to Figaro, except it loads environment variables from .env, and it doesn't use YAML.
26
+
27
+ To use `dotenv`, just install the gem by adding to your Gemfile:
28
+ ```
29
+ gem 'dotenv-rails', groups: [:development, :test]
30
+ ```
31
+
32
+ And add your configuration values to a `.env` file. Make sure you git ignore the file so that you don't
33
+ accidentally publish it to github:
34
+ ```
35
+ POKITDOK_CLIENT_ID=your_client_id
36
+ POKITDOK_CLIENT_SECRET=your_secret_id
37
+ ```
38
+ You can then access the values in your Ruby ENV hash
39
+ ```
40
+ require 'dotenv'
41
+ Dotenv.load
42
+ client_id = ENV["POKITDOK_CLIENT_ID"]
43
+ client_secret = ENV["POKITDOK_CLIENT_SECRET"]
44
+ ```
45
+
46
+ It's also possible to maintain unique sets of environment variables per app using basic linux commands.
47
+ One approach is to have each app running on your server be owned by a different user. You can then use the user's `.bashrc`
48
+ to store application-specific values.
22
49
 
23
50
  ## Quick Start
24
51
  ```ruby
25
52
  require 'pokitdok'
26
- pd = PokitDok::PokitDok.new("your_client_id", "your_client_secret")
53
+ require 'dotenv'
54
+ Dotenv.load
55
+
56
+ client_id = ENV["POKITDOK_CLIENT_ID"]
57
+ client_secret = ENV["POKITDOK_CLIENT_SECRET"]
58
+ pd = PokitDok::PokitDok.new(client_id, client_secret)
27
59
 
28
60
  # Retrieve provider information by NPI
29
61
  pd.providers(npi: '1467560003')
@@ -126,14 +158,21 @@ pd.request('/ssl/')
126
158
  ```
127
159
 
128
160
  ## Supported Ruby Versions
129
- This library aims to support and is tested against these Ruby versions,
130
- using travis-ci:
131
-
132
- * 2.2.3
133
- * 2.1.1
134
- * 2.0.0
135
- * 1.9.3
136
- * JRuby in 1.9 mode
161
+ This library aims to support and is tested against these Ruby versions using the official [Docker Image packing for Ruby](https://github.com/docker-library/ruby).
162
+ To use the Dockerfile within this project to run the tests, please head over to the [Docker Install Guide](https://docs.docker.com/engine/installation/)
163
+
164
+ * 2.3
165
+ * 2.2
166
+ * 2.1
167
+ * 2.0
168
+ * 1.9
169
+ * JRuby 9.1 (which is running Ruby 2.3.1)
170
+
171
+ To execute the tests against those versions within a Docker Container, build the image and the tests will execute on build:
172
+ ```shell
173
+
174
+ docker build .
175
+ ```
137
176
 
138
177
  You may have luck with other interpreters - let us know how it goes.
139
178
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.9.0
@@ -0,0 +1,45 @@
1
+ require 'pokitdok'
2
+ require 'dotenv'
3
+ Dotenv.load
4
+
5
+ ########################
6
+ # make a .env file at the top of your project with
7
+ # POKITDOK_CLIENT_ID=your_client_id
8
+ # POKITDOK_CLIENT_SECRET=your_secret_id
9
+ ########################
10
+
11
+ client_id = ENV["POKITDOK_CLIENT_ID"]
12
+ client_secret = ENV["POKITDOK_CLIENT_SECRET"]
13
+ pd = PokitDok::PokitDok.new(client_id, client_secret)
14
+
15
+ # Retrieve provider information by NPI
16
+ pd.providers(npi: '1467560003')
17
+
18
+ # Search providers by name (individuals)
19
+ pd.providers(first_name: 'JEROME', last_name: 'AYA-AY')
20
+
21
+ # Search providers by name (organizations)
22
+ pd.providers(name: 'Qliance')
23
+
24
+ # Search providers by location and/or specialty
25
+ pd.providers(zipcode: '29307', radius: '10mi')
26
+ pd.providers(zipcode: '29307', radius: '10mi', specialty: 'RHEUMATOLOGY')
27
+
28
+ # Eligibility
29
+ @eligibility_query = {
30
+ member: {
31
+ birth_date: '1970-01-01',
32
+ first_name: 'Jane',
33
+ last_name: 'Doe',
34
+ id: 'W000000000'
35
+ },
36
+ provider: {
37
+ first_name: 'JEROME',
38
+ last_name: 'AYA-AY',
39
+ npi: '1467560003'
40
+ },
41
+ service_types: ['health_benefit_plan_coverage'],
42
+ trading_partner_id: 'MOCKPAYER'
43
+ }
44
+
45
+ pd.eligibility @eligibility_query
@@ -77,17 +77,16 @@ class OAuthApplicationClient
77
77
  fetch_access_token()
78
78
  end
79
79
  url = URI.parse(@api_url + endpoint)
80
-
81
80
  File.open(file) do |f|
82
81
  additional_params = params.merge({'file' => UploadIO.new(f, 'application/EDI-X12', file)})
83
82
  req = Net::HTTP::Post::Multipart.new(url.path, additional_params)
84
-
85
83
  req['Authorization'] = "Bearer #{self.token.token}"
86
84
  req['User-Agent'] = @user_agent
87
85
 
88
- @response = Net::HTTP.start(url.host, url.port) do |http|
86
+ @response = Net::HTTP.start(url.host, url.port, :use_ssl => true) do |http|
89
87
  http.request(req)
90
88
  end
89
+ @status_code = @response.code.to_i
91
90
  JSON.parse(@response.body)
92
91
  end
93
92
  end
@@ -20,6 +20,7 @@ module PokitDok
20
20
  attr_reader :api_client # :nodoc:
21
21
  attr_reader :api_url
22
22
  attr_reader :version
23
+ attr_reader :status_code
23
24
 
24
25
  # Connect to the PokitDok API with the specified Client ID and Client
25
26
  # Secret.
@@ -35,35 +36,109 @@ module PokitDok
35
36
  redirect_uri=nil, scope= nil, code=nil, token= nil)
36
37
  @version = version
37
38
  @api_url = "#{base}/api/#{version}"
38
- @user_agent = "pokitdok-ruby 0.8 #{RUBY_DESCRIPTION}"
39
-
39
+ @user_agent = "pokitdok-ruby#0.9.0##{Gem::Platform.local.os}##{Gem::Platform.local.version}"
40
40
  super(client_id, client_secret, '/oauth2/token', redirect_uri, scope, code, token, user_agent)
41
41
  end
42
42
 
43
- # Invokes the appointments endpoint, to query for open appointment slots
44
- # (using pd_provider_uuid and location) or booked appointments (using
45
- # patient_uuid).
43
+ #
44
+ # ******************************
45
+ # General Use APIs
46
+ # ******************************
47
+ #
48
+
49
+ # Invokes the the general request method for submitting API request.
50
+ #
51
+ # +endpoint+ the API request path
52
+ # +method+ the http request method that should be used
53
+ # +file+ file when the API accepts file uploads as input
54
+ # +params+ an optional Hash of parameters
55
+ #
56
+ # NOTE: There might be a better way of achieving the seperation of get/get_request
57
+ # but currently using the "send" method will go down the ancestor chain until the correct
58
+ # method is found. In this case the 'httpMethod'_request
59
+ def request(endpoint, method='get', file=nil, params={})
60
+ method = method.downcase
61
+ if file
62
+ self.send("post_file", endpoint, file)
63
+ else
64
+ if endpoint[0] == '/'
65
+ endpoint[0] = ''
66
+ end
67
+ # Work around to delete the leading slash on the request endpoint
68
+ # Currently the module we're using appends a slash to the base url
69
+ # so an additional url will break the request.
70
+ # Refer to ...faraday/connection.rb L#404
71
+ self.send("#{method}_request", endpoint, params)
72
+ end
73
+ end
74
+
75
+ public
76
+ def get(endpoint, params = {})
77
+ response = request(endpoint, 'GET', nil, params)
78
+ @status_code = response.status
79
+ JSON.parse(response.body)
80
+ end
81
+
82
+ def post(endpoint, params = {})
83
+ response = request(endpoint, 'POST', nil, params)
84
+ @status_code = response.status
85
+ JSON.parse(response.body)
86
+ end
87
+
88
+ def put(endpoint, params = {})
89
+ response = request(endpoint, 'PUT', nil, params)
90
+ @status_code = response.status
91
+ JSON.parse(response.body)
92
+ end
93
+
94
+ def delete(endpoint, params = {})
95
+ response = request(endpoint, 'DELETE', nil, params)
96
+ @status_code = response.status
97
+ if response.body.empty?
98
+ response.status == 204
99
+ else
100
+ JSON.parse(response.body)
101
+ end
102
+ end
103
+
104
+ # Invokes the activities endpoint.
105
+ #
106
+ # This endpoint uses the user_schedule OAuth2 scope. You'll need to
107
+ # get the user's authorization via our OAuth2 provider
46
108
  #
47
109
  # +params+ an optional Hash of parameters
48
110
  #
49
- def activities(params = {})
50
- get('activities/', params)
111
+ def activities(activity_id = nil, params = {})
112
+ activities_endpoint = 'activities/'
113
+ if activity_id
114
+ activities_endpoint = "activities/#{activity_id}" + activity_id.to_s
115
+ end
116
+ get(activities_endpoint, params)
51
117
  end
52
118
 
53
- # Invokes the authorizations endpoint.
119
+ # Invokes the trading partners endpoint.
54
120
  #
55
- # +params+ an optional hash of parameters that will be sent in the POST body
121
+ # +params+ an optional Hash of parameters
56
122
  #
57
- def authorizations(params = {})
58
- post('authorizations/', params)
123
+ def trading_partners(trading_partner_id = nil, params = {})
124
+ if params
125
+ trading_partner_id = params.delete :trading_partner_id
126
+ end
127
+ get("tradingpartners/#{trading_partner_id}")
59
128
  end
60
129
 
61
- # Invokes the cash prices endpoint.
130
+ #
131
+ # ******************************
132
+ # X12 API Convenience Functions
133
+ # ******************************
134
+ #
135
+
136
+ # Invokes the authorizations endpoint: Submit an authorization request
62
137
  #
63
138
  # +params+ an optional hash of parameters that will be sent in the POST body
64
139
  #
65
- def cash_prices(params = {})
66
- get('prices/cash', params)
140
+ def authorizations(params = {})
141
+ post('authorizations/', params)
67
142
  end
68
143
 
69
144
  # Invokes the claims endpoint.
@@ -82,24 +157,8 @@ module PokitDok
82
157
  post('claims/status', params)
83
158
  end
84
159
 
85
- # Invokes the ICD convert endpoint.
86
- #
87
- # +params+ an optional hash of parameters
88
- #
89
- def icd_convert(params = {})
90
- get("icd/convert/#{params[:code]}")
91
- end
92
-
93
- # Invokes the mpc endpoint.
94
- #
95
- # +params+ an optional hash of parameters
96
- #
97
- def mpc(params = {})
98
- get('mpc/', params)
99
- end
100
-
101
160
  # Uploads an .837 file to the claims convert endpoint.
102
- # Uses the multipart-post gem, since oauth2 doesn't support multipart.
161
+ # Uses the multipart-post gem, since oauth2 adoesn't support multipart.
103
162
  #
104
163
  # +x12_claims_file+ the path to the file to transmit
105
164
  #
@@ -120,6 +179,7 @@ module PokitDok
120
179
  # +params+ an optional hash of parameters that will be sent in the POST body
121
180
  #
122
181
  def enrollment(params = {})
182
+ warn "[DEPRECATION] ` enrollment will be removed in the next release"
123
183
  post('enrollment/', params)
124
184
  end
125
185
 
@@ -130,6 +190,7 @@ module PokitDok
130
190
  # +x12_file+ the path to the file to transmit
131
191
  #
132
192
  def enrollment_snapshot(trading_partner_id, x12_file)
193
+ warn "[DEPRECATION] ` enrollment_snapshot will be removed in the next release"
133
194
  request("/enrollment/snapshot/#{trading_partner_id}", "POST", x12_file)
134
195
  end
135
196
 
@@ -138,6 +199,7 @@ module PokitDok
138
199
  # +params+ an optional Hash of parameters
139
200
  #
140
201
  def enrollment_snapshots(params = {})
202
+ warn "[DEPRECATION] ` enrollment_snapshots will be removed in the next release"
141
203
  snapshot_id = params.delete :snapshot_id
142
204
  get("enrollment/snapshot" + (snapshot_id ? "/#{snapshot_id}" : ''), params)
143
205
  end
@@ -147,9 +209,48 @@ module PokitDok
147
209
  # +params+ an optional Hash of parameters
148
210
  #
149
211
  def enrollment_snapshot_data(params = {})
212
+ warn "[DEPRECATION] ` enrollment_snapshot_data will be removed in the next release"
150
213
  get("enrollment/snapshot/#{params[:snapshot_id]}/data")
151
214
  end
152
215
 
216
+ # Invokes the referrals endpoint.
217
+ #
218
+ # +params+ an optional Hash of parameters
219
+ #
220
+ def referrals(params = {})
221
+ post('referrals/', params)
222
+ end
223
+
224
+
225
+ #
226
+ # ******************************
227
+ # DATA API Convenience Functions
228
+ # ******************************
229
+ #
230
+
231
+ # Invokes the cash prices endpoint.
232
+ #
233
+ # +params+ an optional hash of parameters that will be sent in the POST body
234
+ #
235
+ def cash_prices(params = {})
236
+ get('prices/cash', params)
237
+ end
238
+
239
+ # Invokes the ICD convert endpoint.
240
+ #
241
+ # +params+ an optional hash of parameters
242
+ #
243
+ def icd_convert(params = {})
244
+ get("icd/convert/#{params[:code]}")
245
+ end
246
+
247
+ # Invokes the mpc endpoint.
248
+ #
249
+ # +params+ an optional hash of parameters
250
+ #
251
+ def mpc(params = {})
252
+ get('mpc/', params)
253
+ end
153
254
  # Invokes the insurance prices endpoint.
154
255
  #
155
256
  # +params+ an optional hash of parameters
@@ -158,11 +259,30 @@ module PokitDok
158
259
  get('prices/insurance', params)
159
260
  end
160
261
 
262
+ # Invokes the insurance price estimate endpoint
263
+ # Returns estimated out of pocket cost and eligibility information for a given procedure
264
+ #
265
+ # +params+ an optional hash of parameters
266
+ #
267
+ def oop_insurance_estimate(params = {})
268
+ post("/oop/insurance-estimate", params)
269
+ end
270
+
271
+ # Invokes the insurance load price endpoint
272
+ # Loads procedure prices for a specific trading partner
273
+ #
274
+ # +params+ an optional hash of parameters
275
+ #
276
+ def oop_insurance_prices(params = {})
277
+ post("/oop/insurance-load-price", params)
278
+ end
279
+
161
280
  # Invokes the payers endpoint.
162
281
  #
163
282
  # +params+ an optional hash of parameters
164
283
  #
165
284
  def payers(params = {})
285
+ warn "[DEPRECATION] `payers` will be deprecated in the next release. Please use `trading_partners` instead."
166
286
  get('payers/', params)
167
287
  end
168
288
 
@@ -182,25 +302,43 @@ module PokitDok
182
302
  get('providers/', params)
183
303
  end
184
304
 
185
- # Invokes the referrals endpoint.
305
+ #
306
+ # ******************************
307
+ # Pharmacy API Convenience Functions
308
+ # ******************************
309
+ #
310
+
311
+ # Invokes the pharmacy plans endpoint.
186
312
  #
187
313
  # +params+ an optional Hash of parameters
188
314
  #
189
- def referrals(params = {})
190
- post('referrals/', params)
315
+ def pharmacy_plans(params = {})
316
+ get('pharmacy/plans', params)
191
317
  end
192
318
 
193
- # Invokes the trading partners endpoint.
319
+ # Invokes the pharmacy formulary endpoint.
194
320
  #
195
321
  # +params+ an optional Hash of parameters
196
322
  #
197
- def trading_partners(params = {})
198
- trading_partner_id = params.delete :trading_partner_id
199
- get("tradingpartners/#{trading_partner_id}")
323
+ def pharmacy_formulary(params = {})
324
+ get('pharmacy/formulary', params)
200
325
  end
201
326
 
202
- # Scheduling endpoints
327
+ # Invokes the pharmacy network cost endpoint.
328
+ #
329
+ # +params+ an optional Hash of parameters
330
+ #
331
+ def pharmacy_network(params = {})
332
+ npi = params.delete :npi
333
+ endpoint = npi ? "pharmacy/network/#{npi}" : "pharmacy/network"
334
+ get(endpoint, params)
335
+ end
203
336
 
337
+ #
338
+ # ******************************
339
+ # Scheduling API Convenience Functions
340
+ # ******************************
341
+ #
204
342
  # Invokes the appointments endpoint to query for an open appointment
205
343
  # slot or a booked appointment given a specific pd_appointment_uuid,
206
344
  # the PokitDok unique appointment identifier.
@@ -208,19 +346,34 @@ module PokitDok
208
346
  # +params+ an optional Hash of parameters
209
347
  #
210
348
  def appointment(params = {})
349
+ warn "[DEPRECATION] `appointment` will be deprecated in the next release. Please use `appointment_types` instead."
211
350
  appointment_id = params.delete :appointment_id
212
351
  get("schedule/appointmenttypes/#{appointment_id}", params)
213
352
  end
214
353
 
215
- # Invokes the activities endpoint.
354
+ # Invokes the appointments endpoint, to query for open appointment slots
355
+ # (using pd_provider_uuid and location) or booked appointments (using
356
+ # patient_uuid).
216
357
  #
217
- # This endpoint uses the user_schedule OAuth2 scope. You'll need to
218
- # get the user's authorization via our OAuth2 provider
358
+ # +params+ an optional Hash of parameters
359
+ #
360
+ def get_appointments(appointment_uuid=nil, params = {})
361
+ endpoint = "schedule/appointments/"
362
+ if appointment_uuid
363
+ endpoint = "schedule/appointments/#{appointment_uuid}"
364
+ end
365
+ get(endpoint, params)
366
+ end
367
+
368
+ # Invokes the appointments endpoint, to query for open appointment slots
369
+ # (using pd_provider_uuid and location) or booked appointments (using
370
+ # patient_uuid).
219
371
  #
220
372
  # +params+ an optional Hash of parameters
221
373
  #
222
- def appointments(params = {})
223
- get('schedule/appointments/', params)
374
+ def appointments(appointment_uuid=nil, params = {})
375
+ warn "[DEPRECATION] `appointments` will be deprecated in the next release. Please use `get_appointments` instead."
376
+ get_appointments(params, appointment_uuid)
224
377
  end
225
378
 
226
379
  # Invokes the appointment_types endpoint, to get information on a specific
@@ -229,16 +382,22 @@ module PokitDok
229
382
  # +params+ an optional Hash of parameters
230
383
  #
231
384
  def appointment_type(params = {})
385
+ warn "[DEPRECATION] `appointment_type` will be deprecated in the next release. Please use `appointment_types` instead."
232
386
  appointment_type = params.delete :uuid
233
387
  get("schedule/appointmenttypes/#{appointment_type}")
234
388
  end
235
389
 
236
390
  # Invokes the appointment_types endpoint.
391
+ # Get information about appointment types or fetch data about a specific appointment type
237
392
  #
238
393
  # +params+ an optional hash of parameters
239
394
  #
240
- def appointment_types(params = {})
241
- get('schedule/appointmenttypes/', params)
395
+ def appointment_types(appointment_type_uuid=nil, params = {})
396
+ endpoint = "schedule/appointmenttypes/"
397
+ if appointment_type_uuid
398
+ endpoint = "schedule/appointmenttypes/#{appointment_type_uuid}"
399
+ end
400
+ get(endpoint, params)
242
401
  end
243
402
 
244
403
  # Books an appointment.
@@ -256,7 +415,7 @@ module PokitDok
256
415
  #
257
416
  # This endpoint uses the user_schedule OAuth2 scope. You'll need to
258
417
  # get the user's authorization via our OAuth2 provider
259
- #
418
+ #
260
419
  # +params+ an optional Hash of parameters
261
420
  #
262
421
  def cancel_appointment(appointment_uuid, params={})
@@ -264,13 +423,15 @@ module PokitDok
264
423
  end
265
424
 
266
425
  # Invokes the schedule/appointments endpoint.
426
+ # Query for open appointment slots or retrieve information for a specific appointment
267
427
  #
268
428
  # This endpoint uses the user_schedule OAuth2 scope. You'll need to
269
429
  # get the user's authorization via our OAuth2 provider
270
- #
430
+ #
271
431
  # +params+ an optional hash of parameters
272
432
  #
273
433
  def open_appointment_slots(params = {})
434
+ warn "[DEPRECATION] `open_appointment_slots` will be deprecated in the next release. Please use `get_appointments` instead."
274
435
  get('schedule/appointments', params)
275
436
  end
276
437
 
@@ -278,8 +439,12 @@ module PokitDok
278
439
  #
279
440
  # +params an optional Hash of parameters
280
441
  #
281
- def schedulers(params = {})
282
- get('schedule/schedulers/', params)
442
+ def schedulers(scheduler_uuid = nil, params = {})
443
+ endpoint = "schedule/schedulers/"
444
+ if scheduler_uuid
445
+ endpoint = "schedule/schedulers/#{scheduler_uuid}"
446
+ end
447
+ get(endpoint, params)
283
448
  end
284
449
 
285
450
  # Invokes the schedulers endpoint, to get information about a specific
@@ -288,6 +453,7 @@ module PokitDok
288
453
  # +params+ an optional Hash of parameters
289
454
  #
290
455
  def scheduler(params = {})
456
+ warn "[DEPRECATION] `scheduler` will be deprecated in the next release. Please use `schedulers` instead."
291
457
  scheduler_id = params.delete :uuid
292
458
  get("schedule/schedulers/#{scheduler_id}")
293
459
  end
@@ -296,48 +462,48 @@ module PokitDok
296
462
  #
297
463
  # This endpoint uses the user_schedule OAuth2 scope. You'll need to
298
464
  # get the user's authorization via our OAuth2 provider
299
- #
465
+ #
300
466
  # +params+ an optional Hash of parameters
301
467
  #
302
468
  def schedule_slots(params = {})
303
469
  post('/schedule/slots/', params)
304
470
  end
305
471
 
306
- # Invokes the pharmacy plans endpoint.
472
+ # Updates the specified appointment.
473
+ #
474
+ # This endpoint uses the user_schedule OAuth2 scope. You'll need to
475
+ # get the user's authorization via our OAuth2 provider
307
476
  #
308
477
  # +params+ an optional Hash of parameters
309
478
  #
310
- def pharmacy_plans(params = {})
311
- get('pharmacy/plans', params)
479
+ def update_appointment(appointment_uuid, params={})
480
+ put("schedule/appointments/#{appointment_uuid}", params)
312
481
  end
313
482
 
314
- # Invokes the pharmacy formulary endpoint.
315
483
  #
316
- # +params+ an optional Hash of parameters
484
+ # ******************************
485
+ # Identity API Convenience Functions
486
+ # ******************************
317
487
  #
318
- def pharmacy_formulary(params = {})
319
- get('pharmacy/formulary', params)
320
- end
321
488
 
322
- # Invokes the pharmacy network cost endpoint.
489
+ # Invokes the identity proof question endpoint
490
+ # Submit a user’s response to a knowledge based authentication question
323
491
  #
324
- # +params+ an optional Hash of parameters
492
+ # +params+ a hash of parameters that will be sent in the POST body
325
493
  #
326
- def pharmacy_network(params = {})
327
- npi = params.delete :npi
328
- endpoint = npi ? "pharmacy/network/#{npi}" : "pharmacy/network"
329
- get(endpoint, params)
494
+ def answer_proof_question(params = {})
495
+ post("/identity/proof/questions/score/", params)
330
496
  end
331
497
 
332
- # Updates the specified appointment.
498
+
499
+ # Invokes the identity proof questionnaire endpoint
500
+ # Validates an identity proof request and generates a
501
+ # Knowledge Based Authentication questionnaire if possible
333
502
  #
334
- # This endpoint uses the user_schedule OAuth2 scope. You'll need to
335
- # get the user's authorization via our OAuth2 provider
336
- #
337
- # +params+ an optional Hash of parameters
503
+ # +params+ a hash of parameters that will be sent in the POST body
338
504
  #
339
- def update_appointment(appointment_uuid, params={})
340
- put("schedule/appointments/#{appointment_uuid}", params)
505
+ def create_proof_questionnaire(params = {})
506
+ post("/identity/proof/questions/generate/", params)
341
507
  end
342
508
 
343
509
  # Invokes the identity endpoint for creation
@@ -345,7 +511,7 @@ module PokitDok
345
511
  # +params+ a hash of parameters that will be sent in the POST body
346
512
  #
347
513
  def create_identity(params = {})
348
- post('identity/', params)
514
+ post("identity/", params)
349
515
  end
350
516
 
351
517
  # Invokes the identity endpoint for updating
@@ -361,9 +527,21 @@ module PokitDok
361
527
  #
362
528
  # +params+ an optional hash of parameters that will be sent in the GET body
363
529
  #
364
- def identity(params = {})
365
- identity_uuid = params.delete :identity_uuid
366
- get("identity" + (identity_uuid ? "/#{identity_uuid}" : ''), params)
530
+ def get_identity(identity_uuid=nil, params = {})
531
+ endpoint = "/identity"
532
+ if identity_uuid
533
+ endpoint = "/identity#{identity_uuid}"
534
+ end
535
+ get(endpoint, params)
536
+ end
537
+
538
+ # Invokes the identity endpoint for querying
539
+ #
540
+ # +params+ an optional hash of parameters that will be sent in the GET body
541
+ #
542
+ def identity(identity_uuid=nil, params = {})
543
+ warn "[DEPRECATION] `identity` will be deprecated in the next release. Please use `get_identity` instead."
544
+ get_identity(params, identity_uuid)
367
545
  end
368
546
 
369
547
  # Invokes the identity history endpoint
@@ -383,59 +561,14 @@ module PokitDok
383
561
  post("identity/match", params)
384
562
  end
385
563
 
386
- # Invokes the the general request method for submitting API request.
564
+ # Invokes the validate identity endpoint
565
+ # Tests the validity of an identity through the Identity Proof api
566
+ # (our knowledge based authentication solution)
387
567
  #
388
- # +endpoint+ the API request path
389
- # +method+ the http request method that should be used
390
- # +file+ file when the API accepts file uploads as input
391
- # +params+ an optional Hash of parameters
392
568
  #
393
- # NOTE: There might be a better way of achieving the seperation of get/get_request
394
- # but currently using the "send" method will go down the ancestor chain until the correct
395
- # method is found. In this case the 'httpMethod'_request
396
- def request(endpoint, method='get', file=nil, params={})
397
- method = method.downcase
398
- if file
399
- self.send('post_file', endpoint, file, params)
400
- else
401
- # Work around to delete the leading slash on the request endpoint
402
- # Currently the module we're using appends a slash to the base url
403
- # so an additional url will break the request.
404
- # Refer to ...faraday/connection.rb L#404
405
- if endpoint[0] == '/'
406
- endpoint[0] = ''
407
- end
408
- self.send("#{method}_request", endpoint, params)
409
- end
569
+ def validate_identity(params = {})
570
+ post("/identity/proof/valid/", params)
410
571
  end
411
572
 
412
- private
413
- def get(endpoint, params = {})
414
- response = request(endpoint, 'GET', nil, params)
415
-
416
- JSON.parse(response.body)
417
- end
418
-
419
- def post(endpoint, params = {})
420
- response = request(endpoint, 'POST', nil, params)
421
-
422
- JSON.parse(response.body)
423
- end
424
-
425
- def put(endpoint, params = {})
426
- response = request(endpoint, 'PUT', nil, params)
427
-
428
- JSON.parse(response.body)
429
- end
430
-
431
- def delete(endpoint, params = {})
432
- response = request(endpoint, 'DELETE', nil, params)
433
-
434
- if response.body.empty?
435
- response.status == 204
436
- else
437
- JSON.parse(response.body)
438
- end
439
- end
440
573
  end
441
574
  end