You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.9 KiB
101 lines
2.9 KiB
# 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
|
|
|