lifen_fhir 0.1.1
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 +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +74 -0
- data/License.txt +22 -0
- data/README.md +131 -0
- data/lib/lifen_fhir/app_authenticated_client.rb +38 -0
- data/lib/lifen_fhir/attachment.rb +26 -0
- data/lib/lifen_fhir/base.rb +7 -0
- data/lib/lifen_fhir/binary.rb +29 -0
- data/lib/lifen_fhir/category.rb +26 -0
- data/lib/lifen_fhir/channel.rb +31 -0
- data/lib/lifen_fhir/client.rb +107 -0
- data/lib/lifen_fhir/communication_request.rb +67 -0
- data/lib/lifen_fhir/configuration.rb +22 -0
- data/lib/lifen_fhir/content_string.rb +15 -0
- data/lib/lifen_fhir/error.rb +27 -0
- data/lib/lifen_fhir/medium.rb +15 -0
- data/lib/lifen_fhir/patient.rb +27 -0
- data/lib/lifen_fhir/practitioner.rb +97 -0
- data/lib/lifen_fhir/user_authenticated_client.rb +39 -0
- data/lib/lifen_fhir/version.rb +3 -0
- data/lib/lifen_fhir.rb +29 -0
- data/lifen_fhir.gemspec +30 -0
- data/spec/binary_spec.rb +29 -0
- data/spec/cassettes/binary/download/invalid.yml +65 -0
- data/spec/cassettes/binary/download/valid.yml +1320 -0
- data/spec/cassettes/communication_request/send/invalid_medium.yml +69 -0
- data/spec/cassettes/communication_request/send/valid_attributes.yml +75 -0
- data/spec/cassettes/communication_request/send/valid_attributes_binary.yml +74 -0
- data/spec/cassettes/practitionner/create_channel/address/old_valid_attributes.yml +71 -0
- data/spec/cassettes/practitionner/create_channel/address/valid_attributes.yml +71 -0
- data/spec/cassettes/practitionner/create_channel/telecom/valid_attributes.yml +70 -0
- data/spec/cassettes/practitionner/find_by_rpps/existing_rpps.yml +125 -0
- data/spec/cassettes/practitionner/find_by_rpps/missing_line_attribute.yml +122 -0
- data/spec/cassettes/practitionner/find_by_rpps/wrong_rpps.yml +68 -0
- data/spec/category_spec.rb +21 -0
- data/spec/communication_request_spec.rb +64 -0
- data/spec/practitionner_spec.rb +76 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/master_plan.pdf +0 -0
- metadata +232 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module LifenFhir
|
2
|
+
class Patient < Base
|
3
|
+
|
4
|
+
attribute :first_name, String
|
5
|
+
attribute :last_name, String
|
6
|
+
attribute :birthdate, Date
|
7
|
+
|
8
|
+
def fhir_payload
|
9
|
+
{
|
10
|
+
id: "patient",
|
11
|
+
resourceType: "Patient",
|
12
|
+
name: [
|
13
|
+
{
|
14
|
+
family: [
|
15
|
+
last_name
|
16
|
+
],
|
17
|
+
given: [
|
18
|
+
first_name
|
19
|
+
]
|
20
|
+
}
|
21
|
+
],
|
22
|
+
birthDate: birthdate.to_s
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module LifenFhir
|
2
|
+
class Practitioner < Base
|
3
|
+
|
4
|
+
attribute :channels, [LifenFhir::Channel]
|
5
|
+
|
6
|
+
attribute :uuid, String
|
7
|
+
attribute :last_name, String
|
8
|
+
attribute :first_name, String
|
9
|
+
attribute :rpps, String
|
10
|
+
|
11
|
+
def fhir_payload
|
12
|
+
{ reference: "Practitioner/#{uuid}" }
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_by_rpps(rpps)
|
16
|
+
json = application_client.get("fhir/Practitioner/?identifier=#{rpps}")
|
17
|
+
|
18
|
+
raise "Practitioner not found" if Array(json["entry"]).size != 1
|
19
|
+
|
20
|
+
user_json = Array(json["entry"]).first.fetch("resource") { {} }
|
21
|
+
|
22
|
+
user_json[:uuid] = user_json["id"]
|
23
|
+
|
24
|
+
user = new(user_json)
|
25
|
+
|
26
|
+
Array(user_json["telecom"]).each do |telecom_json|
|
27
|
+
user.channels << LifenFhir::Channel.from_json(telecom_json, "telecom")
|
28
|
+
end
|
29
|
+
|
30
|
+
Array(user_json["address"]).each do |address_json|
|
31
|
+
user.channels << LifenFhir::Channel.from_json(address_json, "address")
|
32
|
+
end
|
33
|
+
|
34
|
+
user
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_address(params)
|
38
|
+
filtered_params = {"resourceType" => "Practitioner"}
|
39
|
+
|
40
|
+
address = {
|
41
|
+
"line": Array(params[:lines]),
|
42
|
+
"city": params[:city],
|
43
|
+
"postalCode": params[:postal_code],
|
44
|
+
"country": params[:country]
|
45
|
+
}
|
46
|
+
|
47
|
+
filtered_params[params[:type]] = address
|
48
|
+
|
49
|
+
json = application_client.post("fhir/Practitioner/#{uuid}/$add-address", filtered_params)
|
50
|
+
|
51
|
+
channel = Channel.new(uuid: json["issue"][0]["id"], type: params[:type], value: "#{Array(params[:lines]).join(", ")}, #{params[:postal_code]} #{params[:city]}")
|
52
|
+
|
53
|
+
self.channels << channel
|
54
|
+
|
55
|
+
channel
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.from_json(json)
|
59
|
+
reference = json["reference"]
|
60
|
+
|
61
|
+
uuid = reference.gsub("Practitioner/", "")
|
62
|
+
|
63
|
+
new(uuid: uuid)
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_telecom(params)
|
67
|
+
filtered_params = {"resourceType" => "Practitioner"}
|
68
|
+
|
69
|
+
telecom = {
|
70
|
+
"system": params[:system],
|
71
|
+
"value": params[:value]
|
72
|
+
}
|
73
|
+
|
74
|
+
filtered_params[params[:type]] = telecom
|
75
|
+
|
76
|
+
json = application_client.post("fhir/Practitioner/#{uuid}/$add-telecom", filtered_params)
|
77
|
+
|
78
|
+
channel = Channel.new(uuid: json["issue"][0]["id"], type: params[:type], value: params[:value])
|
79
|
+
|
80
|
+
self.channels << channel
|
81
|
+
|
82
|
+
channel
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
def application_client
|
89
|
+
@application_client ||= AppAuthenticatedClient.new
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.application_client
|
93
|
+
@application_client ||= AppAuthenticatedClient.new
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module LifenFhir
|
2
|
+
class UserAuthenticatedClient < Client
|
3
|
+
|
4
|
+
def initialize(token)
|
5
|
+
@token = token
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :token
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def handle_errors(response, params)
|
13
|
+
super(response, params)
|
14
|
+
|
15
|
+
case response.status
|
16
|
+
when 400
|
17
|
+
raise InvalidParamsError, "Error 400, Invalid params, #{response_error(response, params)}"
|
18
|
+
when 401
|
19
|
+
raise UnauthorizedError, "Error 401, Token is not valid, #{response_error(response, params)}"
|
20
|
+
when 403
|
21
|
+
raise Error, "Error 403, Action is forbidden, #{response_error(response, params)}"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def response_error(response, params)
|
27
|
+
"User Client, #{super(response, params)}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def bearer
|
31
|
+
token.value
|
32
|
+
end
|
33
|
+
|
34
|
+
def before_request
|
35
|
+
token.refresh_once_if_needed
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/lifen_fhir.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module LifenFhir
|
2
|
+
|
3
|
+
require 'virtus'
|
4
|
+
require 'faraday'
|
5
|
+
require 'inflecto'
|
6
|
+
require 'base64'
|
7
|
+
|
8
|
+
require "lifen_fhir/version"
|
9
|
+
|
10
|
+
require 'lifen_fhir/error'
|
11
|
+
require 'lifen_fhir/client'
|
12
|
+
require 'lifen_fhir/user_authenticated_client'
|
13
|
+
require 'lifen_fhir/app_authenticated_client'
|
14
|
+
require 'lifen_fhir/configuration'
|
15
|
+
require 'lifen_fhir/base'
|
16
|
+
|
17
|
+
require 'lifen_fhir/channel'
|
18
|
+
require 'lifen_fhir/practitioner'
|
19
|
+
require 'lifen_fhir/category'
|
20
|
+
require 'lifen_fhir/medium'
|
21
|
+
require 'lifen_fhir/attachment'
|
22
|
+
require 'lifen_fhir/binary'
|
23
|
+
require 'lifen_fhir/patient'
|
24
|
+
require 'lifen_fhir/content_string'
|
25
|
+
require 'lifen_fhir/communication_request'
|
26
|
+
|
27
|
+
Virtus.finalize
|
28
|
+
|
29
|
+
end
|
data/lifen_fhir.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'lifen_fhir/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "lifen_fhir"
|
7
|
+
spec.version = LifenFhir::VERSION
|
8
|
+
spec.authors = ["Leonard Sellam", "Etienne Depaulis"]
|
9
|
+
spec.email = ["leonard@lifen.fr", "etienne@lifen.fr"]
|
10
|
+
spec.homepage = "https://github.com/honestica/lifen-fhir"
|
11
|
+
spec.description = %q{Lifen FHIR API Ruby client}
|
12
|
+
spec.summary = %q{Lifen FHIR API Ruby client}
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", '~> 1.12'
|
21
|
+
spec.add_development_dependency "rake", '~> 10.5'
|
22
|
+
spec.add_development_dependency "rspec", '~> 3.5'
|
23
|
+
spec.add_development_dependency "vcr", '~> 3.0'
|
24
|
+
spec.add_development_dependency "webmock", '~> 1.24'
|
25
|
+
spec.add_development_dependency "awesome_print"
|
26
|
+
|
27
|
+
spec.add_runtime_dependency "virtus", '>= 1.0'
|
28
|
+
spec.add_runtime_dependency "inflecto"
|
29
|
+
spec.add_runtime_dependency "faraday", '>= 0.9'
|
30
|
+
end
|
data/spec/binary_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe LifenFhir::Binary do
|
4
|
+
|
5
|
+
describe ':download with right uuid' do
|
6
|
+
|
7
|
+
let(:binary) { LifenFhir::Binary.new(uuid: "valid_binary_id") }
|
8
|
+
|
9
|
+
it 'works' do
|
10
|
+
|
11
|
+
VCR.use_cassette "binary/download/valid" do
|
12
|
+
expect(Digest::MD5.hexdigest(binary.download)).to eq("2285abb032c5e9054a518690b4701ab6")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ':download with right uuid' do
|
18
|
+
|
19
|
+
let(:binary) { LifenFhir::Binary.new(uuid: "wrong-binary-uuid") }
|
20
|
+
|
21
|
+
it 'fails with wrong uuid' do
|
22
|
+
|
23
|
+
VCR.use_cassette "binary/download/invalid" do
|
24
|
+
expect{ binary.download }.to raise_error LifenFhir::Error
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://develop.lifen.fr/fhir/Binary/wrong-binary-uuid
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "{}"
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.11.0
|
12
|
+
Authorization:
|
13
|
+
- Bearer valid_application_access_token
|
14
|
+
Accept:
|
15
|
+
- application/pdf
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 404
|
21
|
+
message: Not Found
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- nginx/1.6.2
|
25
|
+
Date:
|
26
|
+
- Wed, 05 Apr 2017 12:08:41 GMT
|
27
|
+
Content-Type:
|
28
|
+
- application/xml+fhir;charset=UTF-8
|
29
|
+
Transfer-Encoding:
|
30
|
+
- chunked
|
31
|
+
Connection:
|
32
|
+
- keep-alive
|
33
|
+
X-B3-Sampled:
|
34
|
+
- '1'
|
35
|
+
X-B3-Spanid:
|
36
|
+
- fb30b5b1b27d94fe
|
37
|
+
X-B3-Traceid:
|
38
|
+
- fb30b5b1b27d94fe
|
39
|
+
X-Content-Type-Options:
|
40
|
+
- nosniff
|
41
|
+
X-Xss-Protection:
|
42
|
+
- 1; mode=block
|
43
|
+
Cache-Control:
|
44
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
45
|
+
Pragma:
|
46
|
+
- no-cache
|
47
|
+
Expires:
|
48
|
+
- '0'
|
49
|
+
X-Powered-By:
|
50
|
+
- HAPI FHIR 2.2 REST Server (FHIR Server; FHIR 1.0.2/DSTU2)
|
51
|
+
Access-Control-Allow-Credentials:
|
52
|
+
- 'true'
|
53
|
+
body:
|
54
|
+
encoding: UTF-8
|
55
|
+
string: |-
|
56
|
+
<OperationOutcome xmlns="http://hl7.org/fhir">
|
57
|
+
<issue>
|
58
|
+
<severity value="error"/>
|
59
|
+
<code value="not-found"/>
|
60
|
+
<diagnostics value="Unknown Resource id=wrong-binary-uuid"/>
|
61
|
+
</issue>
|
62
|
+
</OperationOutcome>
|
63
|
+
http_version:
|
64
|
+
recorded_at: Wed, 05 Apr 2017 12:08:41 GMT
|
65
|
+
recorded_with: VCR 3.0.3
|