caren-api 0.2.0 → 0.3.0
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.
- data/README.rdoc +29 -6
- data/VERSION +1 -1
- data/caren-api.gemspec +2 -1
- data/lib/caren/base.rb +3 -1
- data/lib/caren/care_provider.rb +6 -4
- data/lib/caren/caren.rb +22 -0
- data/lib/caren/external_message.rb +4 -3
- data/lib/caren/link.rb +2 -1
- data/spec/care_provider_spec.rb +2 -2
- data/spec/caren_spec.rb +10 -0
- data/spec/external_message_spec.rb +1 -1
- data/spec/fixtures/incoming.xml +54 -0
- data/spec/link_spec.rb +1 -0
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -2,14 +2,37 @@
|
|
2
2
|
|
3
3
|
This is the reference implementation for the Caren CareProvider API (http://caren-cares.com).
|
4
4
|
|
5
|
-
|
5
|
+
== Getting started
|
6
6
|
|
7
|
-
|
8
|
-
Then extract the public key from it: `openssl rsa -in example -pubout -out example.pub`
|
9
|
-
Send the public key to info@caren-cares.com with an access request.
|
7
|
+
To get started you will need a care provider API private/public keypair.
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
* Generate a private key using: `openssl genrsa -out example 1024`
|
10
|
+
* Extract the public key from it: `openssl rsa -in example -pubout -out example.pub`
|
11
|
+
* Send the public key to info@caren-cares.com with an access request.
|
12
|
+
* Set your care provider url `Caren::Api.url` to the provided URL like https://example.caren-cares.com.
|
13
|
+
|
14
|
+
== Getting information from Caren
|
15
|
+
|
16
|
+
This implementation shows you how to get information from Caren. You can gather information about Links (linking your people to caren's),
|
17
|
+
care_providers (including updating your settings) and external_messages (chat messages between you and caren people).
|
18
|
+
|
19
|
+
== Providing information to Caren
|
20
|
+
|
21
|
+
Some information you can push to Caren (like updates to care_provider settings and new messages) using the basic API.
|
22
|
+
Additionally Caren requires you to provide XML resources for People (search) and Events (daterange).
|
23
|
+
You can specify your API base url within your care_provider settings. You are required to implement the following resources:
|
24
|
+
|
25
|
+
* Finding a person by identifier: GET [BASE_URL]/people/?uid=[VALUE]
|
26
|
+
* Finding a list of events for a given person: GET [BASE_URL]/people/[EXTERNAL_ID]/events?from=[DATE]&to=[DATE]
|
27
|
+
|
28
|
+
The uid is your public customer number for this person, the external_id is your internal identifier (usually database id) for this person.
|
29
|
+
These urls should yield Caren compatible XML (the included Caren objects for Event and Person can generate that for you)
|
30
|
+
|
31
|
+
== Push notifications of changes from Caren
|
32
|
+
|
33
|
+
Caren supports a push link. Caren will regularly post a XML file with changes (Links, CareProviders, ExternalMessages) to any url.
|
34
|
+
Passing this XML and the corresponsing header signature into `Caren::Api.incoming` will yield the updated Caren objects.
|
35
|
+
You can optionally specify a push url within your care_provider settings.
|
13
36
|
|
14
37
|
== Contributing to caren-api
|
15
38
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/caren-api.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{caren-api}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andre Foeken"]
|
@@ -50,6 +50,7 @@ Gem::Specification.new do |s|
|
|
50
50
|
"spec/fixtures/caren_links.xml",
|
51
51
|
"spec/fixtures/caren_links_search.xml",
|
52
52
|
"spec/fixtures/caren_unauthorized.xml",
|
53
|
+
"spec/fixtures/incoming.xml",
|
53
54
|
"spec/link_spec.rb",
|
54
55
|
"spec/person_spec.rb",
|
55
56
|
"spec/spec.opts",
|
data/lib/caren/base.rb
CHANGED
@@ -11,8 +11,10 @@ class Caren::Base
|
|
11
11
|
self.class.keys.each do |key|
|
12
12
|
self.attributes[key] = args[key] || args[key.to_s] || nil
|
13
13
|
end
|
14
|
+
# We want to use #id
|
15
|
+
self.instance_eval('undef id')
|
14
16
|
end
|
15
|
-
|
17
|
+
|
16
18
|
# List of available attributes for this object
|
17
19
|
def self.keys
|
18
20
|
[]
|
data/lib/caren/care_provider.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
class Caren::CareProvider < Caren::Base
|
6
6
|
|
7
7
|
def self.keys
|
8
|
-
[ :
|
8
|
+
[ :id, # String (The id of this CP inside Caren)
|
9
9
|
:name, # String
|
10
10
|
:telephone, # String
|
11
11
|
:website, # String
|
@@ -19,7 +19,9 @@ class Caren::CareProvider < Caren::Base
|
|
19
19
|
:max_start, # String (23:00)
|
20
20
|
:min_start, # String (07:00)
|
21
21
|
:show_employee_name_as_title, # Boolean
|
22
|
-
:communication
|
22
|
+
:communication, # Boolean
|
23
|
+
:push_hook_url, # String (Optional url to push api acceptor)
|
24
|
+
:api_url # String (Required url to api resources)
|
23
25
|
]
|
24
26
|
end
|
25
27
|
|
@@ -32,11 +34,11 @@ class Caren::CareProvider < Caren::Base
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def update
|
35
|
-
Caren::Api.put(self.resource_url(self.
|
37
|
+
Caren::Api.put(self.resource_url(self.id), self.to_xml)
|
36
38
|
end
|
37
39
|
|
38
40
|
def update_logo logo_hash_or_path
|
39
|
-
Caren::Api.put(self.resource_url(self.
|
41
|
+
Caren::Api.put(self.resource_url(self.id), self.to_logo_xml(logo_hash_or_path))
|
40
42
|
end
|
41
43
|
|
42
44
|
def as_xml
|
data/lib/caren/caren.rb
CHANGED
@@ -76,6 +76,28 @@ module Caren
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
+
# These types of Caren objects are supported by the Caren::Api.incoming method
|
80
|
+
def self.supported_incoming_objects
|
81
|
+
{ :links => Caren::Link,
|
82
|
+
:external_messages => Caren::ExternalMessage,
|
83
|
+
:care_providers => Caren::CareProvider
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
# Pass an XML string to be handled. Only a valid caren_objects xml hash will be parsed.
|
88
|
+
def self.incoming xml, signature
|
89
|
+
if self.verify_signature(signature,xml)
|
90
|
+
objects = []
|
91
|
+
hash = Hash.from_xml(xml)["caren_objects"]
|
92
|
+
self.supported_incoming_objects.each do |key,klass|
|
93
|
+
objects << (hash[key]||hash[key.to_s]||[]).map{ |h| klass.new(h) }
|
94
|
+
end
|
95
|
+
return objects.flatten
|
96
|
+
else
|
97
|
+
raise Caren::Exceptions::SignatureMismatch.new
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
79
101
|
# Sign your string using Caren::Api.private_key
|
80
102
|
def self.sign string=""
|
81
103
|
encrypted_digest = Caren::Api.private_key.sign( "sha1", string )
|
@@ -1,12 +1,13 @@
|
|
1
1
|
class Caren::ExternalMessage < Caren::Base
|
2
2
|
|
3
3
|
def self.keys
|
4
|
-
[ :
|
4
|
+
[ :id, # String (Caren message id)
|
5
5
|
:person_name, # String (Andre Foeken)
|
6
|
-
:external_person_id, # String (Your person id)
|
6
|
+
:external_person_id, # String (Your person id)
|
7
7
|
:body, # Text
|
8
8
|
:external_id, # String (Your message id)
|
9
9
|
:in_reply_to_id, # Integer (Caren message id)
|
10
|
+
:in_reply_to_type, # The type of message this is a reply to. (Always ExternalMessage if reply is set)
|
10
11
|
:subject_id # Integer (Caren person id)
|
11
12
|
]
|
12
13
|
end
|
@@ -16,7 +17,7 @@ class Caren::ExternalMessage < Caren::Base
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def delete
|
19
|
-
Caren::Api.delete self.class.resource_url(self.subject_id,self.
|
20
|
+
Caren::Api.delete self.class.resource_url(self.subject_id,self.id)
|
20
21
|
end
|
21
22
|
|
22
23
|
def self.array_root
|
data/lib/caren/link.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
class Caren::Link < Caren::Base
|
2
2
|
|
3
3
|
def self.keys
|
4
|
-
[:
|
4
|
+
[:id, # String (Caren id)
|
5
|
+
:person_name, # String (Caren person name)
|
5
6
|
:person_id, # String (Caren person id)
|
6
7
|
:person_photo, # String (url of photo)
|
7
8
|
:patient_number, # String (12345)
|
data/spec/care_provider_spec.rb
CHANGED
@@ -83,11 +83,11 @@ describe "CareProvider", "REST methods" do
|
|
83
83
|
end
|
84
84
|
|
85
85
|
it "should be able to update a care provider" do
|
86
|
-
lambda{ Caren::CareProvider.new( :
|
86
|
+
lambda{ Caren::CareProvider.new( :id => 1, :name => "Test" ).update }.should_not raise_error
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should be able to update the logo for a care provider" do
|
90
|
-
lambda{ Caren::CareProvider.new( :
|
90
|
+
lambda{ Caren::CareProvider.new( :id => 1 ).update_logo( "spec/fixtures/bacon.jpg" ) }.should_not raise_error
|
91
91
|
end
|
92
92
|
|
93
93
|
it "should be able to search for a specific care provider" do
|
data/spec/caren_spec.rb
CHANGED
@@ -71,4 +71,14 @@ describe "Caren", "signature checks" do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
+
it "should be able to handle incoming xml from caren" do
|
75
|
+
incoming = File.read "spec/fixtures/incoming.xml"
|
76
|
+
results = Caren::Api.incoming(incoming, Caren::Api.sign(incoming))
|
77
|
+
results.should have(4).things
|
78
|
+
external_messages = results.select{ |x| x.is_a?(Caren::ExternalMessage) }
|
79
|
+
external_messages.first.id.should == 1
|
80
|
+
links = results.select{ |x| x.is_a?(Caren::Link) }
|
81
|
+
links.last.id.should == 3
|
82
|
+
end
|
83
|
+
|
74
84
|
end
|
@@ -42,7 +42,7 @@ describe "ExternalMessage", "REST methods" do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it "should be able to delete an external message" do
|
45
|
-
lambda{ Caren::ExternalMessage.new( :subject_id => 1, :
|
45
|
+
lambda{ Caren::ExternalMessage.new( :subject_id => 1, :id => 1 ).delete }.should_not raise_error
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<caren_objects type="hash">
|
3
|
+
<external-messages type="array">
|
4
|
+
<external-message>
|
5
|
+
<created-at type="datetime">2011-09-09T15:14:13+02:00</created-at>
|
6
|
+
<body>Expecting this to work somehow ...</body>
|
7
|
+
<updated-at type="datetime">2011-09-09T15:14:13+02:00</updated-at>
|
8
|
+
<in-reply-to-id type="integer" nil="true"></in-reply-to-id>
|
9
|
+
<subject-id type="integer">5</subject-id>
|
10
|
+
<id type="integer">1</id>
|
11
|
+
<in-reply-to-type nil="true"></in-reply-to-type>
|
12
|
+
<care-provider-id type="integer">1</care-provider-id>
|
13
|
+
<person-id type="integer">2</person-id>
|
14
|
+
<person-first-name>Matthijs Langenberg</person-first-name>
|
15
|
+
<person-last-name></person-last-name>
|
16
|
+
<person-photo>http://example.com/1.png</person-photo>
|
17
|
+
</external-message>
|
18
|
+
</external-messages>
|
19
|
+
<links type="array">
|
20
|
+
<link>
|
21
|
+
<created-at type="datetime">2011-10-10T10:38:49+02:00</created-at>
|
22
|
+
<updated-at type="datetime">2011-10-10T10:40:35+02:00</updated-at>
|
23
|
+
<id type="integer">1</id>
|
24
|
+
<care-provider-id type="integer">1</care-provider-id>
|
25
|
+
<person-id type="integer">3</person-id>
|
26
|
+
<person-name>Andre Foeken</person-name>
|
27
|
+
<person-photo>http://example.com/1.png</person-photo>
|
28
|
+
<external-id>1</external-id>
|
29
|
+
<status>confirmed</status>
|
30
|
+
</link>
|
31
|
+
<link>
|
32
|
+
<created-at type="datetime">2011-10-10T10:42:42+02:00</created-at>
|
33
|
+
<updated-at type="datetime">2011-10-10T10:53:07+02:00</updated-at>
|
34
|
+
<id type="integer">2</id>
|
35
|
+
<care-provider-id type="integer">1</care-provider-id>
|
36
|
+
<person-id type="integer">3</person-id>
|
37
|
+
<person-name>Andre Foeken</person-name>
|
38
|
+
<person-photo>http://example.com/1.png</person-photo>
|
39
|
+
<external-id>2</external-id>
|
40
|
+
<status>confirmed</status>
|
41
|
+
</link>
|
42
|
+
<link>
|
43
|
+
<created-at type="datetime">2011-10-10T11:05:28+02:00</created-at>
|
44
|
+
<updated-at type="datetime">2011-10-10T11:06:44+02:00</updated-at>
|
45
|
+
<id type="integer">3</id>
|
46
|
+
<care-provider-id type="integer">1</care-provider-id>
|
47
|
+
<person-id type="integer">3</person-id>
|
48
|
+
<person-name>Andre Foeken</person-name>
|
49
|
+
<person-photo>http://example.com/1.png</person-photo>
|
50
|
+
<external-id>3</external-id>
|
51
|
+
<status>confirmed</status>
|
52
|
+
</link>
|
53
|
+
</links>
|
54
|
+
</caren_objects>
|
data/spec/link_spec.rb
CHANGED
@@ -34,6 +34,7 @@ describe "Link", "REST methods" do
|
|
34
34
|
it "should be find all links using the API" do
|
35
35
|
links = Caren::Link.all
|
36
36
|
links.should have(3).things
|
37
|
+
links.first.id.should == 1
|
37
38
|
links.first.status.should == "confirmed"
|
38
39
|
links.first.external_id.should == "1"
|
39
40
|
links.first.person_name.should == "Andre Foeken"
|
metadata
CHANGED
@@ -4,10 +4,10 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
9
|
segments_generated: true
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andre Foeken
|
@@ -191,6 +191,7 @@ files:
|
|
191
191
|
- spec/fixtures/caren_links.xml
|
192
192
|
- spec/fixtures/caren_links_search.xml
|
193
193
|
- spec/fixtures/caren_unauthorized.xml
|
194
|
+
- spec/fixtures/incoming.xml
|
194
195
|
- spec/link_spec.rb
|
195
196
|
- spec/person_spec.rb
|
196
197
|
- spec/spec.opts
|