Extract by_domain_length scope in DomainNormalizable concern (#29517)
				
					
				
			This commit is contained in:
		
							parent
							
								
									5b60d4b696
								
							
						
					
					
						commit
						d4ed7e466c
					
				| @ -5,6 +5,18 @@ module DomainNormalizable | ||||
| 
 | ||||
|   included do | ||||
|     before_validation :normalize_domain | ||||
| 
 | ||||
|     scope :by_domain_length, -> { order(domain_char_length.desc) } | ||||
|   end | ||||
| 
 | ||||
|   class_methods do | ||||
|     def domain_char_length | ||||
|       Arel.sql( | ||||
|         <<~SQL.squish | ||||
|           CHAR_LENGTH(domain) | ||||
|         SQL | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
|  | ||||
| @ -70,7 +70,7 @@ class DomainBlock < ApplicationRecord | ||||
|       segments = uri.normalized_host.split('.') | ||||
|       variants = segments.map.with_index { |_, i| segments[i..].join('.') } | ||||
| 
 | ||||
|       where(domain: variants).order(Arel.sql('char_length(domain) desc')).first | ||||
|       where(domain: variants).by_domain_length.first | ||||
|     rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError | ||||
|       nil | ||||
|     end | ||||
|  | ||||
| @ -56,7 +56,7 @@ class EmailDomainBlock < ApplicationRecord | ||||
|     end | ||||
| 
 | ||||
|     def blocking?(allow_with_approval: false) | ||||
|       blocks = EmailDomainBlock.where(domain: domains_with_variants, allow_with_approval: allow_with_approval).order(Arel.sql('char_length(domain) desc')) | ||||
|       blocks = EmailDomainBlock.where(domain: domains_with_variants, allow_with_approval: allow_with_approval).by_domain_length | ||||
|       blocks.each { |block| block.history.add(@attempt_ip) } if @attempt_ip.present? | ||||
|       blocks.any? | ||||
|     end | ||||
|  | ||||
| @ -54,6 +54,6 @@ class PreviewCardProvider < ApplicationRecord | ||||
| 
 | ||||
|   def self.matching_domain(domain) | ||||
|     segments = domain.split('.') | ||||
|     where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).order(Arel.sql('char_length(domain) desc')).first | ||||
|     where(domain: segments.map.with_index { |_, i| segments[i..].join('.') }).by_domain_length.first | ||||
|   end | ||||
| end | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user