lifen 2.4.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile.lock +1 -1
- data/README.md +16 -16
- data/lib/lifen.rb +2 -2
- data/lib/lifen/communication_request.rb +2 -2
- data/lib/lifen/practitioner.rb +97 -0
- data/lib/lifen/user.rb +0 -78
- data/lib/lifen/version.rb +1 -1
- 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/{communication/find/invalid_uuid.yml → practitionner/find_by_rpps/wrong_rpps.yml} +8 -10
- data/spec/communication_request_spec.rb +3 -3
- data/spec/practitionner_spec.rb +76 -0
- data/spec/user_spec.rb +0 -66
- metadata +17 -15
- data/lib/lifen/communication.rb +0 -92
- data/spec/cassettes/communication/find/valid_uuid.yml +0 -96
- data/spec/cassettes/communication/send/binary_and_content_string.yml +0 -75
- data/spec/cassettes/communication/send/binary_valid_attributes.yml +0 -74
- data/spec/cassettes/communication/send/valid_attributes.yml +0 -75
- data/spec/communication_spec.rb +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79deed444977cb5560f104a1507ad85d3f7066fa
|
4
|
+
data.tar.gz: ca4895e8cf1356a51d01661e18acfd3d4e52e8a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9a0a0d34c22b03898a17af6b078693e31d5d512073c1d7c35874d931d0c64e94743d3a8d584d8e388b8f597c03b9abfc333d3e2e5e82d831a2a33f17997b7f6
|
7
|
+
data.tar.gz: 813dc3995c10b1d70f4bf9fccb3190cd7dc2b0757ca1d401bc312552c835ff929160af47467dd2eee0b55be2079eea33ae1180f56df3706c08066c0ad9b2e62c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
3.0.0
|
2
|
+
-----
|
3
|
+
|
4
|
+
- Major refactoring to separate the private and public use of the gem
|
5
|
+
- Added `Practitioner`
|
6
|
+
- Extracts some business and methods from `User` to `Practitioner`
|
7
|
+
- Deleted `Communication`. Use `CommunicationRequest` from now on
|
8
|
+
|
1
9
|
2.4.0
|
2
10
|
-----
|
3
11
|
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -140,9 +140,9 @@ binary.download
|
|
140
140
|
#### Communications with an Attachment
|
141
141
|
|
142
142
|
```ruby
|
143
|
-
sender = Lifen::
|
143
|
+
sender = Lifen::Practitioner.find_by_rpps("899900018483")
|
144
144
|
|
145
|
-
recipient = Lifen::
|
145
|
+
recipient = Lifen::Practitioner.find_by_rpps("899900018484")
|
146
146
|
channel = recipient.channels.first
|
147
147
|
|
148
148
|
category = Lifen::Category.new(code: "MEDICAL_REPORT") # default case, optionnal element
|
@@ -151,52 +151,52 @@ attachment = Lifen::Attachment.new(title: "Test document", path: "path/to/file")
|
|
151
151
|
|
152
152
|
patient = Lifen::Patient.new(first_name: "Jean", last_name: "Dupond", birthdate: Date.new(2000,1,1))
|
153
153
|
|
154
|
-
|
155
|
-
|
154
|
+
communication_request = Lifen::CommunicationRequest.new(sender: sender, recipient: recipient, channel: channel, attachment: attachment, patient: patient, category: category)
|
155
|
+
communication_request.send
|
156
156
|
|
157
|
-
|
158
|
-
|
157
|
+
communication_request = Lifen::CommunicationRequest.find("valid-communication_request-uuid")
|
158
|
+
communication_request.status
|
159
159
|
```
|
160
160
|
|
161
161
|
### Communications with a Binary
|
162
162
|
|
163
163
|
```ruby
|
164
|
-
sender = Lifen::
|
164
|
+
sender = Lifen::Practitioner.find_by_rpps("899900018483")
|
165
165
|
|
166
|
-
recipient = Lifen::
|
166
|
+
recipient = Lifen::Practitioner.find_by_rpps("899900018484")
|
167
167
|
channel = recipient.channels.first
|
168
168
|
|
169
169
|
binary = Lifen::Binary.new(uuid: "b7c7dae671b93e951ce6a4f530736276")
|
170
170
|
|
171
|
-
|
171
|
+
communication_request = Lifen::CommunicationRequest.new(sender: sender, recipient: recipient, channel: channel, binary: binary, patient: patient, category: category)
|
172
172
|
|
173
|
-
|
173
|
+
communication_request.send
|
174
174
|
|
175
175
|
```
|
176
176
|
|
177
177
|
#### Communication requets with multiple recipients
|
178
178
|
|
179
179
|
```ruby
|
180
|
-
sender = Lifen::
|
180
|
+
sender = Lifen::Practitioner.find_by_rpps("899900018483")
|
181
181
|
|
182
|
-
recipient = Lifen::
|
182
|
+
recipient = Lifen::Practitioner.find_by_rpps("899900018484")
|
183
183
|
medium = Lifen::Medium(uuid: recipient.channels.first.uuid)
|
184
184
|
|
185
|
-
other_recipient = Lifen::
|
185
|
+
other_recipient = Lifen::Practitioner.find_by_rpps("899900018484")
|
186
186
|
other_medium = Lifen::Medium(uuid: other_recipient.channels.first.uuid)
|
187
187
|
|
188
188
|
binary = Lifen::Binary.new(uuid: "b7c7dae671b93e951ce6a4f530736276")
|
189
189
|
|
190
|
-
|
190
|
+
communication_request_request = Lifen::CommunicationRequest.new(sender: sender, recipients: [recipient, other_recipient], medium: [medium, other_medium], binary: binary, patient: patient, category: category)
|
191
191
|
|
192
|
-
|
192
|
+
communication_request_request.send
|
193
193
|
|
194
194
|
```
|
195
195
|
|
196
196
|
#### Custom Channels management
|
197
197
|
|
198
198
|
```ruby
|
199
|
-
recipient = Lifen::
|
199
|
+
recipient = Lifen::Practitioner.new(uuid: "valid-user-uuid")
|
200
200
|
|
201
201
|
# To create a new mailing address channel
|
202
202
|
channel = recipient.create_address(type: "address", lines: ["39 rue Aboukir"], city: "Paris", postal_code: "75002", country: "France")
|
data/lib/lifen.rb
CHANGED
@@ -22,14 +22,14 @@ module Lifen
|
|
22
22
|
require 'lifen/flows'
|
23
23
|
require 'lifen/message'
|
24
24
|
|
25
|
+
require 'lifen/channel'
|
26
|
+
require 'lifen/practitioner'
|
25
27
|
require 'lifen/category'
|
26
28
|
require 'lifen/medium'
|
27
29
|
require 'lifen/attachment'
|
28
30
|
require 'lifen/binary'
|
29
|
-
require 'lifen/channel'
|
30
31
|
require 'lifen/patient'
|
31
32
|
require 'lifen/content_string'
|
32
|
-
require 'lifen/communication'
|
33
33
|
require 'lifen/communication_request'
|
34
34
|
|
35
35
|
Virtus.finalize
|
@@ -4,8 +4,8 @@ module Lifen
|
|
4
4
|
attribute :uuid, String
|
5
5
|
attribute :number_communications, Integer
|
6
6
|
|
7
|
-
attribute :sender, Lifen::
|
8
|
-
attribute :recipients, [Lifen::
|
7
|
+
attribute :sender, Lifen::Practitioner
|
8
|
+
attribute :recipients, [Lifen::Practitioner]
|
9
9
|
|
10
10
|
attribute :category, Lifen::Category, default: Lifen::Category.new
|
11
11
|
attribute :medium, [Lifen::Medium]
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Lifen
|
2
|
+
class Practitioner < Base
|
3
|
+
|
4
|
+
attribute :channels, [Lifen::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 << Lifen::Channel.from_json(telecom_json, "telecom")
|
28
|
+
end
|
29
|
+
|
30
|
+
Array(user_json["address"]).each do |address_json|
|
31
|
+
user.channels << Lifen::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
|
data/lib/lifen/user.rb
CHANGED
@@ -101,10 +101,6 @@ module Lifen
|
|
101
101
|
UserAuthenticatedClient.new(token)
|
102
102
|
end
|
103
103
|
|
104
|
-
def fhir_payload
|
105
|
-
{ reference: "Practitioner/#{uuid}" }
|
106
|
-
end
|
107
|
-
|
108
104
|
# def self.where(params)
|
109
105
|
# json = application_client.get("fhir/Practitioner/", params)
|
110
106
|
|
@@ -115,80 +111,6 @@ module Lifen
|
|
115
111
|
# users
|
116
112
|
# end
|
117
113
|
|
118
|
-
def self.find_by_rpps(rpps)
|
119
|
-
json = application_client.get("fhir/Practitioner/?identifier=#{rpps}")
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
raise "User not found" if Array(json["entry"]).size != 1
|
124
|
-
|
125
|
-
user_json = Array(json["entry"]).first.fetch("resource") { {} }
|
126
|
-
|
127
|
-
user_json[:uuid] = user_json["id"]
|
128
|
-
|
129
|
-
user = new(user_json)
|
130
|
-
|
131
|
-
Array(user_json["telecom"]).each do |telecom_json|
|
132
|
-
user.channels << Lifen::Channel.from_json(telecom_json, "telecom")
|
133
|
-
end
|
134
|
-
|
135
|
-
Array(user_json["address"]).each do |address_json|
|
136
|
-
user.channels << Lifen::Channel.from_json(address_json, "address")
|
137
|
-
end
|
138
|
-
|
139
|
-
user
|
140
|
-
end
|
141
|
-
|
142
|
-
def create_address(params)
|
143
|
-
filtered_params = {"resourceType" => "Practitioner"}
|
144
|
-
|
145
|
-
address = {
|
146
|
-
"line": Array(params[:lines]),
|
147
|
-
"city": params[:city],
|
148
|
-
"postalCode": params[:postal_code],
|
149
|
-
"country": params[:country]
|
150
|
-
}
|
151
|
-
|
152
|
-
filtered_params[params[:type]] = address
|
153
|
-
|
154
|
-
json = application_client.post("fhir/Practitioner/#{uuid}/$add-address", filtered_params)
|
155
|
-
|
156
|
-
channel = Channel.new(uuid: json["issue"][0]["id"], type: params[:type], value: "#{Array(params[:lines]).join(", ")}, #{params[:postal_code]} #{params[:city]}")
|
157
|
-
|
158
|
-
self.channels << channel
|
159
|
-
|
160
|
-
channel
|
161
|
-
end
|
162
|
-
|
163
|
-
alias_method :create_channel, :create_address
|
164
|
-
|
165
|
-
def self.from_json(json)
|
166
|
-
reference = json["reference"]
|
167
|
-
|
168
|
-
uuid = reference.gsub("Practitioner/", "")
|
169
|
-
|
170
|
-
new(uuid: uuid)
|
171
|
-
end
|
172
|
-
|
173
|
-
def create_telecom(params)
|
174
|
-
filtered_params = {"resourceType" => "Practitioner"}
|
175
|
-
|
176
|
-
telecom = {
|
177
|
-
"system": params[:system],
|
178
|
-
"value": params[:value]
|
179
|
-
}
|
180
|
-
|
181
|
-
filtered_params[params[:type]] = telecom
|
182
|
-
|
183
|
-
json = application_client.post("fhir/Practitioner/#{uuid}/$add-telecom", filtered_params)
|
184
|
-
|
185
|
-
channel = Channel.new(uuid: json["issue"][0]["id"], type: params[:type], value: params[:value])
|
186
|
-
|
187
|
-
self.channels << channel
|
188
|
-
|
189
|
-
channel
|
190
|
-
|
191
|
-
end
|
192
114
|
|
193
115
|
private
|
194
116
|
|
data/lib/lifen/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://develop.lifen.fr/fhir/Practitioner/11e5c85e-9bc0-4c6e-9b29-deb9993a92c0/$add-address
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"resourceType":"Practitioner","address":{"line":["Honestica","39 rue
|
9
|
+
d''Aboukir"],"city":"Paris","postalCode":"75002","country":"France"}}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.11.0
|
13
|
+
Authorization:
|
14
|
+
- Bearer valid_application_access_token
|
15
|
+
Accept:
|
16
|
+
- application/json
|
17
|
+
Content-Type:
|
18
|
+
- application/json
|
19
|
+
Accept-Encoding:
|
20
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
21
|
+
response:
|
22
|
+
status:
|
23
|
+
code: 200
|
24
|
+
message: OK
|
25
|
+
headers:
|
26
|
+
Server:
|
27
|
+
- Apache-Coyote/1.1
|
28
|
+
X-B3-Sampled:
|
29
|
+
- '1'
|
30
|
+
X-B3-Spanid:
|
31
|
+
- 1471c2eb1e86756b
|
32
|
+
X-B3-Traceid:
|
33
|
+
- 1471c2eb1e86756b
|
34
|
+
X-Content-Type-Options:
|
35
|
+
- nosniff
|
36
|
+
X-Xss-Protection:
|
37
|
+
- 1; mode=block
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
40
|
+
Pragma:
|
41
|
+
- no-cache
|
42
|
+
Expires:
|
43
|
+
- '0'
|
44
|
+
X-Powered-By:
|
45
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
46
|
+
Content-Type:
|
47
|
+
- application/json+fhir;charset=UTF-8
|
48
|
+
Transfer-Encoding:
|
49
|
+
- chunked
|
50
|
+
Date:
|
51
|
+
- Fri, 19 May 2017 15:07:35 GMT
|
52
|
+
Connection:
|
53
|
+
- close
|
54
|
+
Access-Control-Allow-Credentials:
|
55
|
+
- 'true'
|
56
|
+
body:
|
57
|
+
encoding: UTF-8
|
58
|
+
string: |-
|
59
|
+
{
|
60
|
+
"resourceType": "OperationOutcome",
|
61
|
+
"issue": [
|
62
|
+
{
|
63
|
+
"id": "11e73ca4-e3d4-8c5f-b5c5-0242ac110002",
|
64
|
+
"severity": "information",
|
65
|
+
"diagnostics": "Address created."
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
http_version:
|
70
|
+
recorded_at: Fri, 19 May 2017 15:07:06 GMT
|
71
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,71 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://develop.lifen.fr/fhir/Practitioner/11e5c85e-9bc0-4c6e-9b29-deb9993a92c0/$add-address
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: '{"resourceType":"Practitioner","address":{"line":["Honestica","39 rue
|
9
|
+
d''Aboukir"],"city":"Paris","postalCode":"75002","country":"France"}}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.11.0
|
13
|
+
Authorization:
|
14
|
+
- Bearer valid_application_access_token
|
15
|
+
Accept:
|
16
|
+
- application/json
|
17
|
+
Content-Type:
|
18
|
+
- application/json
|
19
|
+
Accept-Encoding:
|
20
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
21
|
+
response:
|
22
|
+
status:
|
23
|
+
code: 200
|
24
|
+
message: OK
|
25
|
+
headers:
|
26
|
+
Server:
|
27
|
+
- Apache-Coyote/1.1
|
28
|
+
X-B3-Sampled:
|
29
|
+
- '1'
|
30
|
+
X-B3-Spanid:
|
31
|
+
- 6bdba43c90ff2827
|
32
|
+
X-B3-Traceid:
|
33
|
+
- 6bdba43c90ff2827
|
34
|
+
X-Content-Type-Options:
|
35
|
+
- nosniff
|
36
|
+
X-Xss-Protection:
|
37
|
+
- 1; mode=block
|
38
|
+
Cache-Control:
|
39
|
+
- no-cache, no-store, max-age=0, must-revalidate
|
40
|
+
Pragma:
|
41
|
+
- no-cache
|
42
|
+
Expires:
|
43
|
+
- '0'
|
44
|
+
X-Powered-By:
|
45
|
+
- HAPI FHIR 2.4 REST Server (FHIR Server; FHIR 3.0.1/DSTU3)
|
46
|
+
Content-Type:
|
47
|
+
- application/json+fhir;charset=UTF-8
|
48
|
+
Transfer-Encoding:
|
49
|
+
- chunked
|
50
|
+
Date:
|
51
|
+
- Fri, 19 May 2017 14:59:33 GMT
|
52
|
+
Connection:
|
53
|
+
- close
|
54
|
+
Access-Control-Allow-Credentials:
|
55
|
+
- 'true'
|
56
|
+
body:
|
57
|
+
encoding: UTF-8
|
58
|
+
string: |-
|
59
|
+
{
|
60
|
+
"resourceType": "OperationOutcome",
|
61
|
+
"issue": [
|
62
|
+
{
|
63
|
+
"id": "11e73ca3-c4b2-fe69-b5c5-0242ac110002",
|
64
|
+
"severity": "information",
|
65
|
+
"diagnostics": "Address created."
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
http_version:
|
70
|
+
recorded_at: Fri, 19 May 2017 14:59:03 GMT
|
71
|
+
recorded_with: VCR 3.0.3
|