102 lines
2.9 KiB
Ruby
102 lines
2.9 KiB
Ruby
# 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
|
|
|
|
def index
|
|
@import = Form::Import.new(current_account: current_account)
|
|
end
|
|
|
|
def show; end
|
|
|
|
def failures
|
|
@bulk_import = current_account.bulk_imports.where(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.where(state: :unconfirmed).find(params[:id])
|
|
end
|
|
|
|
def set_recent_imports
|
|
@recent_imports = current_account.bulk_imports.reorder(id: :desc).limit(10)
|
|
end
|
|
end
|