effective_resources 2.10.1 → 2.11.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 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