| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module AccountFinderConcern | 
					
						
							|  |  |  |   extend ActiveSupport::Concern | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class_methods do | 
					
						
							|  |  |  |     def find_local!(username) | 
					
						
							|  |  |  |       find_local(username) || raise(ActiveRecord::RecordNotFound) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def find_remote!(username, domain) | 
					
						
							|  |  |  |       find_remote(username, domain) || raise(ActiveRecord::RecordNotFound) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def find_local(username) | 
					
						
							|  |  |  |       find_remote(username, nil) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def find_remote(username, domain) | 
					
						
							|  |  |  |       AccountFinder.new(username, domain).account | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class AccountFinder | 
					
						
							|  |  |  |     attr_reader :username, :domain | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize(username, domain) | 
					
						
							|  |  |  |       @username = username | 
					
						
							|  |  |  |       @domain = domain | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def account | 
					
						
							| 
									
										
										
										
											2018-03-27 02:33:57 +00:00
										 |  |  |       scoped_accounts.order(id: :asc).take | 
					
						
							| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def scoped_accounts | 
					
						
							|  |  |  |       Account.unscoped.tap do |scope| | 
					
						
							| 
									
										
										
										
											2017-06-01 12:20:36 +00:00
										 |  |  |         scope.merge! with_usernames | 
					
						
							| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  |         scope.merge! matching_username | 
					
						
							|  |  |  |         scope.merge! matching_domain | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-01 12:20:36 +00:00
										 |  |  |     def with_usernames | 
					
						
							| 
									
										
										
										
											2017-11-16 11:13:03 +00:00
										 |  |  |       Account.where.not(username: '') | 
					
						
							| 
									
										
										
										
											2017-06-01 12:20:36 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  |     def matching_username | 
					
						
							| 
									
										
										
										
											2017-06-01 12:20:36 +00:00
										 |  |  |       Account.where(Account.arel_table[:username].lower.eq username.to_s.downcase) | 
					
						
							| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def matching_domain | 
					
						
							|  |  |  |       if domain.nil? | 
					
						
							|  |  |  |         Account.where(domain: nil) | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2017-06-01 12:20:36 +00:00
										 |  |  |         Account.where(Account.arel_table[:domain].lower.eq domain.to_s.downcase) | 
					
						
							| 
									
										
										
										
											2017-05-31 18:28:45 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |