trusty 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecc5a4aaa2950c1df33a04997cc6a6785b63cc1a
4
- data.tar.gz: 33a98591652aa3f4f5b0d3249482df0d545ec628
3
+ metadata.gz: 766c8728e87db3008595dbae530b7774cfb4c31d
4
+ data.tar.gz: 403d9eceb6e0b4b858a21a1e7be1191f54a66b01
5
5
  SHA512:
6
- metadata.gz: fb4f89d216571b5e6c823e3d64a964b4ea869821ba9b120ff07d746f07601f7846e854ade0cbc0659f2a219c1a0e820752fd8b430cfca71f0204962484a09990
7
- data.tar.gz: ca03bc174cd9007085a6c86f3a1cb0675d099ac50591e0fff6dfde37e86a949e23bcfd5dcd409500db1489eb5e4ce0025694ef19c96566aa976b2c0b9d40d004
6
+ metadata.gz: a4ac7fa3d31cad32e091f70f32b4e7bf1ad9ca4887013aba809acbcd5d1cb1e1d0d8f085831b65a907ef2fa51e1b834b7a6a9ac718e784f0610fe915041bca20
7
+ data.tar.gz: 6a767f6575043251f26700a221bfcea788b75f52683385fda358749fda853ca8a71a926ea56f98456a44254d3d5fb8cf7da863b30d339f56c2c705d4c811d7ba
@@ -4,10 +4,15 @@ module Trusty
4
4
  module Omniauth
5
5
  class ModelMapper
6
6
  include MappingHelpers
7
+
8
+ attr_reader :unique_identifiers, :required_criteria
7
9
 
8
10
  def initialize(provider, options = {})
9
11
  @provider = provider
10
12
  @options = options
13
+
14
+ @unique_identifiers = @options.fetch(:unique_identifiers, []).map(&:to_s)
15
+ @required_criteria = stringify_keys @options.fetch(:required_criteria, {})
11
16
  end
12
17
 
13
18
  def model
@@ -15,11 +20,12 @@ module Trusty
15
20
  end
16
21
 
17
22
  def attribute_names
18
- @attribute_names ||= @options[:attribute_names] || column_names
23
+ # Remove required_criteria so that existing attributes are skipped
24
+ @attribute_names ||= (@options[:attribute_names] || column_names).map(&:to_s) - required_criteria.keys
19
25
  end
20
26
 
21
27
  def attributes(*filter_attribute_names)
22
- @attributes ||= @provider.attributes(*attribute_names).merge!(@options[:attributes])
28
+ @attributes ||= @provider.attributes(*attribute_names).merge(stringify_keys @options[:attributes]).merge(required_criteria)
23
29
 
24
30
  if filter_attribute_names.any?
25
31
  @attributes.slice(*filter_attribute_names)
@@ -29,9 +35,15 @@ module Trusty
29
35
  end
30
36
 
31
37
  def build_record(additional_attributes = {})
32
- model.new(attributes.merge(additional_attributes), without_protection: true)
38
+ model.new(attributes.merge(required_criteria).merge(additional_attributes), without_protection: true)
33
39
  end
34
40
 
41
+ def find_records(additional_criteria = {})
42
+ conditions = model.where( attributes(*unique_identifiers) )
43
+ conditions = conditions.where(additional_criteria) unless additional_criteria.empty?
44
+ conditions.where(required_criteria)
45
+ end
46
+
35
47
  def update_record!(record)
36
48
  if Rails::VERSION::MAJOR >= 4
37
49
  record.update_attributes!(attributes)
@@ -49,6 +61,11 @@ module Trusty
49
61
  []
50
62
  end
51
63
  end
64
+
65
+ protected
66
+ def stringify_keys(original_hash)
67
+ original_hash.each_with_object({}){|(key, value), hash| hash[key.to_s] = value}
68
+ end
52
69
  end
53
70
  end
54
71
  end
@@ -17,6 +17,8 @@ module Trusty
17
17
  # - :identity_model = Identity model
18
18
  # - :identity_attributes = Hash of attributes to merge into identity_attributes
19
19
  # - :identity_attribute_names = Array of attribute names to copy from Omniauth data (default: Identity.column_names)
20
+ # - :identity_required_criteria = Hash of criteria to use to find identities, and also to merge into attributes
21
+ # - :unique_identifiers = Array of column names that identify a model uniquely with omniauth data
20
22
  # - :skip_raw_info (default: false) = Boolean whether to exclude OmniAuth "extra" data in identity_attributes[:raw_info]
21
23
  # - :skip_nils (default: true) = Boolean whether to remove attributes with nil values
22
24
  def initialize(provider_attributes, options = {})
@@ -30,36 +32,66 @@ module Trusty
30
32
  }.merge(options)
31
33
 
32
34
  @provider_identity = ModelMapper.new(self,
33
- :model => @options[:identity_model] || Identity,
34
- :attributes => @options[:identity_attributes],
35
- :attribute_names => @options[:identity_attribute_names]
35
+ :model => @options[:identity_model] || Identity,
36
+ :attributes => @options[:identity_attributes],
37
+ :attribute_names => @options[:identity_attribute_names],
38
+ :unique_identifiers => @options[:unique_identifiers] || [:provider, :uid],
39
+ :required_criteria => @options[:identity_required_criteria]
36
40
  )
37
41
  @provider_user = ModelMapper.new(self,
38
- :model => @options[:user_model] || User,
39
- :attributes => @options[:user_attributes],
40
- :attribute_names => @options[:user_attribute_names]
42
+ :model => @options[:user_model] || User,
43
+ :attributes => @options[:user_attributes],
44
+ :attribute_names => @options[:user_attribute_names],
45
+ :unique_identifiers => @options[:unique_identifiers] || [:email]
41
46
  )
42
47
  end
43
48
 
44
49
  # Query existing
50
+
51
+ def find_identities_for_user(user)
52
+ @provider_identity.find_records(user_id: user.id)
53
+ end
45
54
 
46
- def user
47
- # first try to find the user based on provider/uid combo
48
- @user ||= find_user_by_identity
49
- # find the user by email if not found by identity
50
- @user ||= find_user_by_email
55
+ # Matched identities based on omniauth unique identifiers (provider, uid)
56
+ def matched_identities
57
+ @matched_identities ||= @provider_identity.find_records
58
+ end
59
+
60
+ def identities_exist?
61
+ matched_identities.any?
62
+ end
63
+
64
+ def single_identity?
65
+ matched_identities.size == 1
66
+ end
67
+
68
+ def multiple_identities?
69
+ matched_identities.size > 1
51
70
  end
52
71
 
53
- def identity
54
- @identity ||= find_identity_by_user
72
+ # Matched users based on omniauth unique identifiers (email)
73
+ def matched_users
74
+ @matched_users ||= @provider_user.find_records
75
+ end
76
+
77
+ def users_exist?
78
+ matched_users.any?
79
+ end
80
+
81
+ def single_user?
82
+ matched_users.size == 1
83
+ end
84
+
85
+ def multiple_users?
86
+ matched_users.size > 1
55
87
  end
56
88
 
57
- def user_exists?
58
- !user.nil?
89
+ def single_user
90
+ @single_user ||= matched_users.first if single_user?
59
91
  end
60
92
 
61
- def identity_exists?
62
- !identity.nil?
93
+ def single_identity
94
+ @single_identity ||= matched_identities.first if single_identity?
63
95
  end
64
96
 
65
97
  # USER
@@ -75,16 +107,15 @@ module Trusty
75
107
  end
76
108
 
77
109
  def build_identity_for_user(user)
78
- build_identity.tap do |identity|
79
- # this assumes there is an inverse relationship automatically created
80
- # such as user.identities would now contain this identity for the user
81
- identity.user = user
82
- end
110
+ # build_identity.tap do |identity|
111
+ # # this assumes there is an inverse relationship automatically created
112
+ # # such as user.identities would now contain this identity for the user
113
+ # identity.user = user
114
+ # end
115
+ build_identity(user: user)
83
116
  end
84
117
 
85
- def update_existing_identity!
86
- raise "Identity doesn't exist!" unless identity
87
-
118
+ def update_identity!(identity)
88
119
  @provider_identity.update_record!(identity)
89
120
  end
90
121
 
@@ -113,6 +144,7 @@ module Trusty
113
144
  :phone => clean(info['phone']),
114
145
  :image_url => info['image'],
115
146
  :profile_url => info.fetch('urls', {})['public_profile'],
147
+ :token_type => clean(credentials['token_type']),
116
148
  :token => clean(credentials['token']),
117
149
  :secret => clean(credentials['secret']),
118
150
  :refresh_token => clean(credentials['refresh_token']),
@@ -136,26 +168,6 @@ module Trusty
136
168
  end
137
169
  end
138
170
 
139
- private
140
-
141
- def find_user_by_identity
142
- if defined?(Mongoid::Document) && @provider_user.model.include?(Mongoid::Document)
143
- @provider_user.model.elem_match(:identities => @provider_identity.attributes(:provider, :uid)).first
144
- else
145
- @provider_user.model.where(
146
- :id => @provider_identity.model.where( @provider_identity.attributes(:provider, :uid) ).select(:user_id)
147
- ).first
148
- end
149
- end
150
-
151
- def find_user_by_email
152
- @provider_user.model.where( @provider_identity.attributes(:email) ).first
153
- end
154
-
155
- def find_identity_by_user
156
- user && user.identities.where( @provider_identity.attributes(:provider, :uid) ).first
157
- end
158
-
159
171
  end
160
172
  end
161
173
  end
@@ -1,3 +1,3 @@
1
1
  module Trusty
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Van Horn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-17 00:00:00.000000000 Z
11
+ date: 2015-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler