effective_resources 2.10.1 → 2.11.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
  SHA256:
3
- metadata.gz: 69383be96bec20188162a0c42162ce4727bf0f14ce74fa36556b09930bc2307a
4
- data.tar.gz: 7d4ae8dc17da1c34834af13b9d864502de5b580eaa88e3e9da5258f7afc2efb7
3
+ metadata.gz: 8000b25d219e4ce996d1c768682448fc912180f9d0b4808584182e94698255be
4
+ data.tar.gz: d1f99291b1a0072284c0432335541987b6e670b7e491d0e405befbcd42000282
5
5
  SHA512:
6
- metadata.gz: ecb3f7fb7caff620a403c577fc9d1196061e7da0ea2e1d137b6b4889e02097b46cc4a3cc8b7497cfc9fcb1641d9111170daed413a9f4743ee6005e0ba0ed4b0e
7
- data.tar.gz: 6cc85b52a0ee048f15ee61e9b370cc3cad27910529bbf4d83c8260d67bcdaf7ce464d5841fcfa45c1adb6a2fd518c4348f4e46aba5831740fb4f9d4972e44194
6
+ metadata.gz: 2e36bf1f67caf8510e570573621320ba328a311eebc60b8f764a0f811b5b49aedc713f615cb25ef5510786563e9b849a15efd1f4eef6dc86872bc4c26908af85
7
+ data.tar.gz: b6c593560fb53b762eee968c3d53dda47a208493155ef781089cddecc25771dbd18e748ca3336afdf29f187b2801c00ac07a2452457512c4c5788cba7777fb12
@@ -46,7 +46,7 @@ module EffectiveDeviseUser
46
46
  end
47
47
 
48
48
  # Devise invitable ignores model validations, so we manually check for duplicate email addresses.
49
- before_save(if: -> { new_record? && invitation_sent_at.present? }) do
49
+ before_save(if: -> { new_record? && try(:invitation_sent_at).present? }) do
50
50
  if email.blank?
51
51
  self.errors.add(:email, "can't be blank")
52
52
  raise("email can't be blank")
@@ -62,6 +62,28 @@ module EffectiveDeviseUser
62
62
  before_save(if: -> { persisted? && encrypted_password_changed? }) do
63
63
  assign_attributes(provider: nil, access_token: nil, refresh_token: nil, token_expires_at: nil)
64
64
  end
65
+
66
+ # Uniqueness validation of emails and alternate emails across all users
67
+ validate(if: -> { respond_to?(:alternate_email) }) do
68
+ records = self.class.where.not(id: self.id) # exclude self
69
+ email_duplicates = records.where("lower(email) = :email OR lower(alternate_email) = :email", email: email.to_s.strip.downcase)
70
+ alternate_email_duplicates = records.where("lower(email) = :alternate_email OR lower(alternate_email) = :alternate_email", alternate_email: alternate_email.to_s.strip.downcase)
71
+
72
+ # Check if a uniqueness validation was already performed before triggering the exists query
73
+ if !self.errors.added?(:email, 'has already been taken') && email_duplicates.exists?
74
+ self.errors.add(:email, 'has already been taken')
75
+ end
76
+
77
+ # Check if the alternate email is set before triggering the exists query
78
+ if try(:alternate_email).present? && alternate_email_duplicates.exists?
79
+ self.errors.add(:alternate_email, 'has already been taken')
80
+ end
81
+ end
82
+
83
+ with_options(if: -> { respond_to?(:alternate_email) }) do
84
+ validates :alternate_email, email: true, allow_blank: true
85
+ end
86
+
65
87
  end
66
88
 
67
89
  module ClassMethods
@@ -162,10 +184,48 @@ module EffectiveDeviseUser
162
184
  recoverable
163
185
  end
164
186
 
187
+ # https://github.com/heartcombo/devise/blob/f6e73e5b5c8f519f4be29ac9069c6ed8a2343ce4/lib/devise/models/authenticatable.rb#L276
188
+ def find_first_by_auth_conditions(tainted_conditions, opts = {})
189
+ conditions = devise_parameter_filter.filter(tainted_conditions).merge(opts)
190
+ email = conditions[:email]
191
+ conditions.delete(:email)
192
+
193
+ user = to_adapter.find_first(conditions.merge(email: email))
194
+ return user if user.present? && user.persisted?
195
+
196
+ to_adapter.find_first(conditions.merge(alternate_email: email)) if respond_to?(:alternate_email)
197
+ end
198
+
199
+ # https://github.com/heartcombo/devise/blob/f6e73e5b5c8f519f4be29ac9069c6ed8a2343ce4/lib/devise/models/database_authenticatable.rb#L216
200
+ def find_for_database_authentication(warden_conditions)
201
+ conditions = warden_conditions.dup.presence || {}
202
+ primary_or_alternate_email = conditions[:email]
203
+ conditions.delete(:email)
204
+
205
+ has_alternate_email = 'alternate_email'.in? column_names
206
+
207
+ raise "Expected an email #{has_alternate_email ? 'or alternate email' : ''} but got [#{primary_or_alternate_email}] instead" if primary_or_alternate_email.blank?
208
+
209
+ query = if has_alternate_email
210
+ "lower(email) = :value OR lower(alternate_email) = :value"
211
+ else
212
+ "lower(email) = :value"
213
+ end
214
+
215
+ all
216
+ .where(conditions)
217
+ .where(query, value: primary_or_alternate_email.strip.downcase)
218
+ .first
219
+ end
220
+
165
221
  end
166
222
 
167
223
  # EffectiveDeviseUser Instance Methods
168
224
 
225
+ def alternate_email=(value)
226
+ super(value.to_s.strip.downcase.presence)
227
+ end
228
+
169
229
  def reinvite!
170
230
  invite!
171
231
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '2.10.1'.freeze
2
+ VERSION = '2.11.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.1
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-13 00:00:00.000000000 Z
11
+ date: 2023-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails