45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class ImportValidator < ActiveModel::Validator
 | |
|   KNOWN_HEADERS = [
 | |
|     'Account address',
 | |
|     '#domain',
 | |
|     '#uri',
 | |
|   ].freeze
 | |
| 
 | |
|   def validate(import)
 | |
|     return if import.type.blank? || import.data.blank?
 | |
| 
 | |
|     # We parse because newlines could be part of individual rows. This
 | |
|     # runs on create so we should be reading the local file here before
 | |
|     # it is uploaded to object storage or moved anywhere...
 | |
|     csv_data = CSV.parse(import.data.queued_for_write[:original].read)
 | |
| 
 | |
|     row_count  = csv_data.size
 | |
|     row_count -= 1 if KNOWN_HEADERS.include?(csv_data.first&.first)
 | |
| 
 | |
|     import.errors.add(:data, I18n.t('imports.errors.over_rows_processing_limit', count: ImportService::ROWS_PROCESSING_LIMIT)) if row_count > ImportService::ROWS_PROCESSING_LIMIT
 | |
| 
 | |
|     case import.type
 | |
|     when 'following'
 | |
|       validate_following_import(import, row_count)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def validate_following_import(import, row_count)
 | |
|     base_limit = FollowLimitValidator.limit_for_account(import.account)
 | |
| 
 | |
|     limit = begin
 | |
|       if import.overwrite?
 | |
|         base_limit
 | |
|       else
 | |
|         base_limit - import.account.following_count
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     import.errors.add(:data, I18n.t('users.follow_limit_reached', limit: base_limit)) if row_count > limit
 | |
|   end
 | |
| end
 |