export_domain_blocks_controller.rb 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # frozen_string_literal: true
  2. require 'csv'
  3. module Admin
  4. class ExportDomainBlocksController < BaseController
  5. include AdminExportControllerConcern
  6. before_action :set_dummy_import!, only: [:new]
  7. def new
  8. authorize :domain_block, :create?
  9. end
  10. def export
  11. authorize :instance, :index?
  12. send_export_file
  13. end
  14. def import
  15. authorize :domain_block, :create?
  16. @import = Admin::Import.new(import_params)
  17. return render :new unless @import.validate
  18. parse_import_data!(export_headers)
  19. @global_private_comment = I18n.t('admin.export_domain_blocks.import.private_comment_template', source: @import.data_file_name, date: I18n.l(Time.now.utc))
  20. @form = Form::DomainBlockBatch.new
  21. @domain_blocks = @data.take(Admin::Import::ROWS_PROCESSING_LIMIT).filter_map do |row|
  22. domain = row['#domain'].strip
  23. next if DomainBlock.rule_for(domain).present?
  24. domain_block = DomainBlock.new(domain: domain,
  25. severity: row['#severity'].strip,
  26. reject_media: row['#reject_media'].strip,
  27. reject_reports: row['#reject_reports'].strip,
  28. private_comment: @global_private_comment,
  29. public_comment: row['#public_comment']&.strip,
  30. obfuscate: row['#obfuscate'].strip)
  31. domain_block if domain_block.valid?
  32. end
  33. @warning_domains = Instance.where(domain: @domain_blocks.map(&:domain)).where('EXISTS (SELECT 1 FROM follows JOIN accounts ON follows.account_id = accounts.id OR follows.target_account_id = accounts.id WHERE accounts.domain = instances.domain)').pluck(:domain)
  34. rescue ActionController::ParameterMissing
  35. flash.now[:alert] = I18n.t('admin.export_domain_blocks.no_file')
  36. set_dummy_import!
  37. render :new
  38. end
  39. private
  40. def export_filename
  41. 'domain_blocks.csv'
  42. end
  43. def export_headers
  44. %w(#domain #severity #reject_media #reject_reports #public_comment #obfuscate)
  45. end
  46. def export_data
  47. CSV.generate(headers: export_headers, write_headers: true) do |content|
  48. DomainBlock.with_limitations.each do |instance|
  49. content << [instance.domain, instance.severity, instance.reject_media, instance.reject_reports, instance.public_comment, instance.obfuscate]
  50. end
  51. end
  52. end
  53. end
  54. end