lifen 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|