effective_resources 2.10.0 → 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: 3f405113f520922715e551829d9059c36e923291a35a7ae254898dcbc609d96a
4
- data.tar.gz: 67e9d68e3b45d9173e14d51da7a6f8d8c6c1fdf35b8e74bc204f1a8261b47f6c
3
+ metadata.gz: 8000b25d219e4ce996d1c768682448fc912180f9d0b4808584182e94698255be
4
+ data.tar.gz: d1f99291b1a0072284c0432335541987b6e670b7e491d0e405befbcd42000282
5
5
  SHA512:
6
- metadata.gz: 6ba2e27b1ef6e7ff8bdf4e154ef08b4b70687d8c5cae8e7907e4456c698769816bd70e4e2c9dd956f9197abccd225ca76b646bac0932ff72b70a8a1a32d754be
7
- data.tar.gz: 697c1a6e458c761faeca1d96c527aba93d3814edd17169478828d6a9a56065ed917e98ed85e5419e15fd554eafadd8944efa48ca67d453f12ac6fce846f9c41c
6
+ metadata.gz: 2e36bf1f67caf8510e570573621320ba328a311eebc60b8f764a0f811b5b49aedc713f615cb25ef5510786563e9b849a15efd1f4eef6dc86872bc4c26908af85
7
+ data.tar.gz: b6c593560fb53b762eee968c3d53dda47a208493155ef781089cddecc25771dbd18e748ca3336afdf29f187b2801c00ac07a2452457512c4c5788cba7777fb12
@@ -46,8 +46,10 @@ module Effective
46
46
  helper EffectiveResourcesWizardHelper
47
47
 
48
48
  rescue_from Wicked::Wizard::InvalidStepError do |exception|
49
- flash[:danger] = "Unknown step. You have been moved to the #{resource_wizard_steps.first} step."
50
- redirect_to wizard_path(resource_wizard_steps.first)
49
+ step = resource.required_steps.first || resource_wizard_steps.first
50
+
51
+ flash[:danger] = "Unknown step. You have been moved to the #{step} step."
52
+ redirect_to wizard_path(step)
51
53
  end
52
54
 
53
55
  # effective_resources on save callback
@@ -172,7 +172,8 @@ module ActsAsWizard
172
172
  existing = current_step
173
173
 
174
174
  begin
175
- self.current_step = nil; yield
175
+ self.current_step = nil
176
+ yield
176
177
  ensure
177
178
  self.current_step = existing
178
179
  end
@@ -191,7 +192,4 @@ module ActsAsWizard
191
192
  end
192
193
 
193
194
  end
194
-
195
-
196
-
197
195
  end
@@ -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.0'.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.0
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-12 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