123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- # frozen_string_literal: true
- require 'csv'
- class Settings::ImportsController < Settings::BaseController
- before_action :set_bulk_import, only: [:show, :confirm, :destroy]
- before_action :set_recent_imports, only: [:index]
- TYPE_TO_FILENAME_MAP = {
- following: 'following_accounts_failures.csv',
- blocking: 'blocked_accounts_failures.csv',
- muting: 'muted_accounts_failures.csv',
- domain_blocking: 'blocked_domains_failures.csv',
- bookmarks: 'bookmarks_failures.csv',
- lists: 'lists_failures.csv',
- }.freeze
- TYPE_TO_HEADERS_MAP = {
- following: ['Account address', 'Show boosts', 'Notify on new posts', 'Languages'],
- blocking: false,
- muting: ['Account address', 'Hide notifications'],
- domain_blocking: false,
- bookmarks: false,
- lists: false,
- }.freeze
- RECENT_IMPORTS_LIMIT = 10
- def index
- @import = Form::Import.new(current_account: current_account)
- end
- def show; end
- def failures
- @bulk_import = current_account.bulk_imports.state_finished.find(params[:id])
- respond_to do |format|
- format.csv do
- filename = TYPE_TO_FILENAME_MAP[@bulk_import.type.to_sym]
- headers = TYPE_TO_HEADERS_MAP[@bulk_import.type.to_sym]
- export_data = CSV.generate(headers: headers, write_headers: true) do |csv|
- @bulk_import.rows.find_each do |row|
- case @bulk_import.type.to_sym
- when :following
- csv << [row.data['acct'], row.data.fetch('show_reblogs', true), row.data.fetch('notify', false), row.data['languages']&.join(', ')]
- when :blocking
- csv << [row.data['acct']]
- when :muting
- csv << [row.data['acct'], row.data.fetch('hide_notifications', true)]
- when :domain_blocking
- csv << [row.data['domain']]
- when :bookmarks
- csv << [row.data['uri']]
- when :lists
- csv << [row.data['list_name'], row.data['acct']]
- end
- end
- end
- send_data export_data, filename: filename
- end
- end
- end
- def confirm
- @bulk_import.update!(state: :scheduled)
- BulkImportWorker.perform_async(@bulk_import.id)
- redirect_to settings_imports_path, notice: I18n.t('imports.success')
- end
- def create
- @import = Form::Import.new(import_params.merge(current_account: current_account))
- if @import.save
- redirect_to settings_import_path(@import.bulk_import.id)
- else
- # We need to set recent imports as we are displaying the index again
- set_recent_imports
- render :index
- end
- end
- def destroy
- @bulk_import.destroy!
- redirect_to settings_imports_path
- end
- private
- def import_params
- params.require(:form_import).permit(:data, :type, :mode)
- end
- def set_bulk_import
- @bulk_import = current_account.bulk_imports.state_unconfirmed.find(params[:id])
- end
- def set_recent_imports
- @recent_imports = current_account.bulk_imports.reorder(id: :desc).limit(RECENT_IMPORTS_LIMIT)
- end
- end
|