Fix follow limit preventing re-following of a moved account (#14207)
parent
941ff04b03
commit
eb35be0431
@ -0,0 +1,44 @@ |
||||
# 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 |
Loading…
Reference in new issue