lifen 0.2.1 → 1.0.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -1
- data/README.md +11 -11
- data/lib/lifen.rb +7 -4
- data/lib/lifen/app_authenticated_client.rb +15 -27
- data/lib/lifen/client.rb +44 -0
- data/lib/lifen/configuration.rb +1 -1
- data/lib/lifen/error.rb +1 -0
- data/lib/lifen/flow.rb +41 -44
- data/lib/lifen/flows.rb +4 -8
- data/lib/lifen/status.rb +5 -3
- data/lib/lifen/token.rb +44 -0
- data/lib/lifen/user.rb +34 -23
- data/lib/lifen/user_authenticated_client.rb +17 -27
- data/lib/lifen/version.rb +1 -1
- data/lifen.gemspec +1 -0
- data/spec/cassettes/flows/attach_users/invalid_flow_uuid.yml +11 -13
- data/spec/cassettes/flows/attach_users/invalid_user_uuid.yml +12 -14
- data/spec/cassettes/flows/attach_users/valid.yml +14 -16
- data/spec/cassettes/flows/create.yml +13 -15
- data/spec/cassettes/flows/create_with_users.yml +12 -13
- data/spec/cassettes/flows/detach_users/valid.yml +14 -16
- data/spec/cassettes/flows/internal_error.yml +4 -2
- data/spec/cassettes/flows/internal_error_without_trace_id.yml +4 -2
- data/spec/cassettes/flows/invalid_token.yml +18 -14
- data/spec/cassettes/flows/valid_token.yml +14 -17
- data/spec/cassettes/messages/valid_message.yml +13 -15
- data/spec/cassettes/users/create/existing_user.yml +11 -11
- data/spec/cassettes/users/create/invalid_token.yml +16 -10
- data/spec/cassettes/users/create/missing_fields.yml +19 -14
- data/spec/cassettes/users/create/valid_attributes.yml +12 -12
- data/spec/cassettes/users/{refresh_unread_messages → status/refresh}/invalid_token.yml +16 -12
- data/spec/cassettes/users/{refresh_unread_messages → status/refresh}/valid_token.yml +10 -12
- data/spec/cassettes/users/token/refresh/invalid_user_uuid.yml +40 -0
- data/spec/cassettes/users/{refresh/invalid_user_uuid.yml → token/refresh/valid_user_uuid.yml} +16 -15
- data/spec/flows_spec.rb +43 -25
- data/spec/messages_spec.rb +10 -5
- data/spec/spec_helper.rb +1 -1
- data/spec/users_spec.rb +46 -26
- metadata +25 -13
- data/lib/lifen/authentication.rb +0 -29
- data/spec/cassettes/flows/detach_users/valid_again.yml +0 -57
- data/spec/cassettes/users/refresh/valid_user_uuid.yml +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a67207628744fa9170010479e696b05545a73568
|
4
|
+
data.tar.gz: c88fc831f27439acd3df13d6eca873b159cf8d5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fbd97528d92d51504930198d3eee85e50b06c2ed530a7597458770a7fe874373d7359af64d032d72d386a983dde4632521a0ae642d7d1bf32813724f1f2c0b0
|
7
|
+
data.tar.gz: d4430833c1e7849de2446b6b38f14d99a33d5a0a27130a43676f9f8a05c2504e2690908f4bd86ed5d7df3ee0e1e4cdf19548cd2091458412c56f5ba7a7c9e923
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
lifen (0.
|
4
|
+
lifen (1.0.0)
|
5
5
|
faraday (>= 0.9)
|
6
|
+
inflecto
|
6
7
|
virtus (>= 1.0)
|
7
8
|
|
8
9
|
GEM
|
@@ -27,6 +28,7 @@ GEM
|
|
27
28
|
multipart-post (>= 1.2, < 3)
|
28
29
|
hashdiff (0.3.0)
|
29
30
|
ice_nine (0.11.2)
|
31
|
+
inflecto (0.0.2)
|
30
32
|
multipart-post (2.0.0)
|
31
33
|
public_suffix (2.0.4)
|
32
34
|
rake (10.5.0)
|
data/README.md
CHANGED
@@ -23,31 +23,31 @@ Or install it yourself as:
|
|
23
23
|
Lifen can be configured (ideally inside an initializer) like so:
|
24
24
|
|
25
25
|
Lifen.configure do |config|
|
26
|
-
config.site
|
27
|
-
config.
|
28
|
-
config.proxy_url
|
26
|
+
config.site = "https://develop.lifen.fr/"
|
27
|
+
config.application_access_token = "application_access_token"
|
28
|
+
config.proxy_url = "http://my.proxy.fr/"
|
29
29
|
end
|
30
30
|
|
31
|
-
`site` and `
|
31
|
+
`site` and `application_access_token` are mandatory attributes.
|
32
32
|
|
33
33
|
### Managing users
|
34
34
|
|
35
35
|
user = Lifen::User.new(email: "email@domain.tld", first_name: "Jean", last_name: "Dupont")
|
36
|
-
user.create
|
37
|
-
user.
|
38
|
-
user.
|
36
|
+
user.create
|
37
|
+
user.token.refresh
|
38
|
+
user.status.refresh
|
39
39
|
|
40
40
|
### Managing flows
|
41
41
|
|
42
|
-
user = Lifen::User.new(
|
42
|
+
user = Lifen::User.new(uuid: "valid_uuid")
|
43
43
|
user.flows
|
44
44
|
|
45
45
|
flow = Lifen::Flow.new(user: user, title: "honestica Rocks !")
|
46
46
|
flow.create
|
47
|
-
flow.attach_users
|
48
|
-
flow.detach_users
|
47
|
+
flow.attach_users(user)
|
48
|
+
flow.detach_users(user)
|
49
49
|
|
50
|
-
flow = Lifen::Flow.new(user: user, title: "honestica Rocks !",
|
50
|
+
flow = Lifen::Flow.new(user: user, title: "honestica Rocks !", users: [user_1, user_2])
|
51
51
|
flow.create
|
52
52
|
|
53
53
|
### Managing messages
|
data/lib/lifen.rb
CHANGED
@@ -2,20 +2,23 @@ module Lifen
|
|
2
2
|
|
3
3
|
require 'virtus'
|
4
4
|
require 'faraday'
|
5
|
+
require 'inflecto'
|
5
6
|
|
6
7
|
require "lifen/version"
|
7
8
|
|
8
|
-
require
|
9
|
+
require 'lifen/error'
|
9
10
|
require 'lifen/client'
|
10
11
|
require 'lifen/user_authenticated_client'
|
11
12
|
require 'lifen/app_authenticated_client'
|
12
13
|
require 'lifen/configuration'
|
13
|
-
require
|
14
|
+
require 'lifen/base'
|
15
|
+
require 'lifen/token'
|
16
|
+
require 'lifen/status'
|
14
17
|
require 'lifen/user'
|
15
18
|
require 'lifen/flow'
|
16
19
|
require 'lifen/flows'
|
17
|
-
require 'lifen/authentication'
|
18
|
-
require 'lifen/status'
|
19
20
|
require 'lifen/message'
|
20
21
|
|
22
|
+
Virtus.finalize
|
23
|
+
|
21
24
|
end
|
@@ -1,38 +1,26 @@
|
|
1
1
|
module Lifen
|
2
2
|
class AppAuthenticatedClient < Client
|
3
3
|
|
4
|
-
|
4
|
+
private
|
5
5
|
|
6
|
-
response
|
7
|
-
|
6
|
+
def handle_status!(response)
|
7
|
+
super(response)
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
case response.status
|
10
|
+
when 400
|
11
|
+
raise Error, "Error 400"
|
12
|
+
when 401
|
13
|
+
raise InvalidSecretTokenError
|
14
|
+
when 403
|
15
|
+
raise UserAlreadyExistingError
|
16
|
+
when 404
|
17
|
+
raise Error, "Error 404, Page not found"
|
18
|
+
end
|
11
19
|
|
12
|
-
req.body = JSON.generate(params)
|
13
20
|
end
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
trace_id = json.fetch("X-B3-TraceId", "unknown")
|
19
|
-
raise Error, "Error 500, Internal server error (trace ID: #{trace_id})"
|
20
|
-
end
|
21
|
-
|
22
|
-
raise Error, "Error 400" if response.status == 400
|
23
|
-
raise Error, "Error 404, Page not found" if response.status == 404
|
24
|
-
raise InvalidSecretTokenError if response.status == 401
|
25
|
-
raise UserAlreadyExistingError if response.status == 403
|
26
|
-
|
27
|
-
json = JSON.parse response.body
|
28
|
-
|
29
|
-
json
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def secret_key
|
35
|
-
Lifen.configuration.secret_key
|
22
|
+
def bearer
|
23
|
+
Lifen.configuration.application_access_token
|
36
24
|
end
|
37
25
|
|
38
26
|
end
|
data/lib/lifen/client.rb
CHANGED
@@ -1,8 +1,45 @@
|
|
1
1
|
module Lifen
|
2
2
|
class Client
|
3
3
|
|
4
|
+
def request(mode, url, params = {})
|
5
|
+
before_request
|
6
|
+
|
7
|
+
response = faraday_client.send(mode) do |req|
|
8
|
+
req.url url
|
9
|
+
|
10
|
+
req.headers['Authorization'] = "Bearer #{bearer}"
|
11
|
+
req.headers['Content-Type'] = "application/json"
|
12
|
+
req.headers['Accept'] = "application/json"
|
13
|
+
|
14
|
+
req.body = JSON.generate(params)
|
15
|
+
end
|
16
|
+
|
17
|
+
handle_status!(response)
|
18
|
+
|
19
|
+
json = JSON.parse response.body
|
20
|
+
|
21
|
+
json
|
22
|
+
end
|
23
|
+
|
24
|
+
def post(url, params = {})
|
25
|
+
request(:post, url, params)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get(url, params = {})
|
29
|
+
request(:get, url, params)
|
30
|
+
end
|
31
|
+
|
4
32
|
private
|
5
33
|
|
34
|
+
def handle_status!(response)
|
35
|
+
if response.status == 500
|
36
|
+
json = JSON.parse response.body
|
37
|
+
|
38
|
+
trace_id = json.fetch("X-B3-TraceId", "unknown")
|
39
|
+
raise Error, "Error 500, Internal server error (trace ID: #{trace_id})"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
6
43
|
def faraday_client
|
7
44
|
@faraday_client ||= Faraday.new(faraday_options) do |faraday|
|
8
45
|
faraday.request :url_encoded # form-encode POST params
|
@@ -26,5 +63,12 @@ module Lifen
|
|
26
63
|
Lifen.configuration.proxy_url
|
27
64
|
end
|
28
65
|
|
66
|
+
def before_request
|
67
|
+
end
|
68
|
+
|
69
|
+
def bearer
|
70
|
+
raise "A bearer method must be defined"
|
71
|
+
end
|
72
|
+
|
29
73
|
end
|
30
74
|
end
|
data/lib/lifen/configuration.rb
CHANGED
data/lib/lifen/error.rb
CHANGED
data/lib/lifen/flow.rb
CHANGED
@@ -4,16 +4,12 @@ module Lifen
|
|
4
4
|
attribute :uuid, String
|
5
5
|
attribute :title, String
|
6
6
|
attribute :user, Lifen::User
|
7
|
-
attribute :
|
7
|
+
attribute :users, Array[Lifen::User]
|
8
8
|
|
9
9
|
def create
|
10
|
-
|
10
|
+
users_to_attach = users
|
11
11
|
|
12
|
-
|
13
|
-
if !active_users.empty?
|
14
|
-
users_to_attach = active_users
|
15
|
-
params[:users] = active_users.map(&:uuid)
|
16
|
-
end
|
12
|
+
params = {title: title, users: extract_users_uuids(users_to_attach)}
|
17
13
|
|
18
14
|
json = client.post("central/api/chats?rel=activeUsers", params)
|
19
15
|
|
@@ -23,61 +19,35 @@ module Lifen
|
|
23
19
|
|
24
20
|
self.user = user
|
25
21
|
self.uuid = flow.uuid
|
22
|
+
self.title = flow.title
|
26
23
|
|
27
|
-
|
28
|
-
Array(json_flow["activeUsers"]).each do |element|
|
29
|
-
element[:first_name] = element["firstName"]
|
30
|
-
element[:last_name] = element["lastName"]
|
31
|
-
|
32
|
-
self.active_users << Lifen::User.new(element)
|
33
|
-
end
|
34
|
-
|
35
|
-
users_to_attach.each do |user|
|
36
|
-
raise Lifen::Error, "User #{user.uuid} was not attached to this flow" if !active_users.map(&:uuid).include? user.uuid
|
37
|
-
end
|
24
|
+
build_users(json_flow)
|
38
25
|
|
39
|
-
|
26
|
+
check_if_users_were_attached!(users_to_attach)
|
40
27
|
|
41
28
|
self
|
42
29
|
end
|
43
30
|
|
44
|
-
def attach_users
|
45
|
-
|
46
|
-
|
47
|
-
params = users.map(&:uuid).compact.uniq
|
31
|
+
def attach_users(users_to_attach)
|
32
|
+
params = extract_users_uuids(users_to_attach)
|
48
33
|
|
49
34
|
json = client.post("central/api/chats/#{uuid}/attach_users?rel=activeUsers", params)
|
50
35
|
|
51
|
-
|
52
|
-
element[:first_name] = element["firstName"]
|
53
|
-
element[:last_name] = element["lastName"]
|
54
|
-
|
55
|
-
self.active_users << Lifen::User.new(element)
|
56
|
-
end
|
36
|
+
build_users(json)
|
57
37
|
|
58
|
-
|
59
|
-
raise Lifen::Error, "User #{user.uuid} was not attached to this flow" if !active_users.map(&:uuid).include? user.uuid
|
60
|
-
end
|
38
|
+
check_if_users_were_attached!(users_to_attach)
|
61
39
|
|
62
40
|
self
|
63
41
|
end
|
64
42
|
|
65
|
-
def detach_users
|
66
|
-
|
67
|
-
|
68
|
-
params = users.map(&:uuid).compact.uniq
|
43
|
+
def detach_users(users_to_detach)
|
44
|
+
params = extract_users_uuids(users_to_detach)
|
69
45
|
|
70
46
|
json = client.post("central/api/chats/#{uuid}/detach_users?rel=activeUsers", params)
|
71
47
|
|
72
|
-
|
48
|
+
build_users(json)
|
73
49
|
|
74
|
-
|
75
|
-
self.active_users << Lifen::User.new(element)
|
76
|
-
end
|
77
|
-
|
78
|
-
users.each do |user|
|
79
|
-
raise Lifen::Error, "User #{user.uuid} was not detached to this flow" if active_users.map(&:uuid).include? user.uuid
|
80
|
-
end
|
50
|
+
check_if_users_were_detached!(users_to_detach)
|
81
51
|
|
82
52
|
self
|
83
53
|
end
|
@@ -88,5 +58,32 @@ module Lifen
|
|
88
58
|
@client ||= user.client
|
89
59
|
end
|
90
60
|
|
61
|
+
def build_users(json)
|
62
|
+
self.users = []
|
63
|
+
|
64
|
+
Array(json["activeUsers"]).each do |element|
|
65
|
+
element[:first_name] = element["firstName"]
|
66
|
+
element[:last_name] = element["lastName"]
|
67
|
+
|
68
|
+
self.users << Lifen::User.new(element)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def extract_users_uuids(users)
|
73
|
+
Array(users).map(&:uuid).compact.uniq
|
74
|
+
end
|
75
|
+
|
76
|
+
def check_if_users_were_attached!(users_to_attach)
|
77
|
+
missing_users = Array(users_to_attach).map(&:uuid) - users.map(&:uuid)
|
78
|
+
|
79
|
+
raise Lifen::Error, "Users #{missing_users.join(', ')} were not attached to this flow" if !missing_users.empty?
|
80
|
+
end
|
81
|
+
|
82
|
+
def check_if_users_were_detached!(users_to_detach)
|
83
|
+
extra_users = users.map(&:uuid) & Array(users_to_detach).map(&:uuid)
|
84
|
+
|
85
|
+
raise Lifen::Error, "Users #{extra_users.join(', ')} were not detached from this flow" if !extra_users.empty?
|
86
|
+
end
|
87
|
+
|
91
88
|
end
|
92
89
|
end
|
data/lib/lifen/flows.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
module Lifen
|
2
2
|
class Flows < Base
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
@collection = []
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_reader :collection, :user
|
4
|
+
attribute :user, Lifen::User
|
5
|
+
attribute :elements, Array[Lifen::Flow], default: []
|
10
6
|
|
11
7
|
def all
|
12
8
|
json = client.get("central/api/chats")
|
@@ -15,10 +11,10 @@ module Lifen
|
|
15
11
|
flow = Flow.new(element)
|
16
12
|
flow.user = user
|
17
13
|
|
18
|
-
|
14
|
+
elements << flow
|
19
15
|
end
|
20
16
|
|
21
|
-
|
17
|
+
elements
|
22
18
|
end
|
23
19
|
|
24
20
|
private
|
data/lib/lifen/status.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
module Lifen
|
2
|
-
class Status
|
2
|
+
class Status
|
3
3
|
|
4
|
-
|
4
|
+
include Virtus.model(finalize: false)
|
5
5
|
|
6
|
-
attribute :
|
6
|
+
attribute :user, "Lifen::User"
|
7
|
+
|
8
|
+
attribute :unread, Integer, default: 0
|
7
9
|
|
8
10
|
def refresh
|
9
11
|
json = client.get("central/api/chats/status")
|
data/lib/lifen/token.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Lifen
|
2
|
+
class Token
|
3
|
+
include Virtus.model(finalize: false)
|
4
|
+
|
5
|
+
attribute :user, "Lifen::User"
|
6
|
+
|
7
|
+
attribute :value, String
|
8
|
+
attribute :expires_at, Integer
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
value
|
12
|
+
end
|
13
|
+
|
14
|
+
def has_expired?
|
15
|
+
return true if expires_at.nil?
|
16
|
+
|
17
|
+
return expires_at < Time.now.to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def refresh
|
21
|
+
# params = {accountUuid: user.uuid}
|
22
|
+
|
23
|
+
json = client.post("/oauth/admin/third_party/access_token?accountUuid=#{user.uuid}")
|
24
|
+
|
25
|
+
self.value = json["access_token"]
|
26
|
+
self.expires_at = Time.now.to_i + json["expires_in"].to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
def refresh_once_if_needed
|
30
|
+
return if !has_expired?
|
31
|
+
|
32
|
+
refresh
|
33
|
+
|
34
|
+
raise Error, "Token can't be refreshed" if has_expired?
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def client
|
40
|
+
@client ||= AppAuthenticatedClient.new
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|