Skip to content

Commit

Permalink
Allow import/export of mutes list (mastodon#1541)
Browse files Browse the repository at this point in the history
* Allow export of mutes list

* Allow importing of mutes list

* Refactor to use Settings::Exports::BaseController and DRY up exports code
  • Loading branch information
mjankowski authored and Gargron committed Apr 12, 2017
1 parent 08fce08 commit 7f0a865
Show file tree
Hide file tree
Showing 13 changed files with 86 additions and 19 deletions.
23 changes: 23 additions & 0 deletions app/controllers/settings/exports/base_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

module Settings
module Exports
class BaseController < ApplicationController
before_action :authenticate_user!

def index
export_data = Export.new(export_accounts).to_csv

respond_to do |format|
format.csv { send_data export_data, filename: export_filename }
end
end

private

def export_filename
"#{controller_name}.csv"
end
end
end
end
12 changes: 4 additions & 8 deletions app/controllers/settings/exports/blocked_accounts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@

module Settings
module Exports
class BlockedAccountsController < ApplicationController
before_action :authenticate_user!
class BlockedAccountsController < BaseController
private

def index
export_data = Export.new(current_account.blocking).to_csv

respond_to do |format|
format.csv { send_data export_data, filename: 'blocking.csv' }
end
def export_accounts
current_account.blocking
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@

module Settings
module Exports
class FollowingAccountsController < ApplicationController
before_action :authenticate_user!
class FollowingAccountsController < BaseController
private

def index
export_data = Export.new(current_account.following).to_csv

respond_to do |format|
format.csv { send_data export_data, filename: 'following.csv' }
end
def export_accounts
current_account.following
end
end
end
Expand Down
13 changes: 13 additions & 0 deletions app/controllers/settings/exports/muted_accounts_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

module Settings
module Exports
class MutedAccountsController < BaseController
private

def export_accounts
current_account.muting
end
end
end
end
1 change: 1 addition & 0 deletions app/controllers/settings/exports_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ def show
@total_storage = current_account.media_attachments.sum(:file_file_size)
@total_follows = current_account.following.count
@total_blocks = current_account.blocking.count
@total_mutes = current_account.muting.count
end
end
2 changes: 1 addition & 1 deletion app/models/import.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
class Import < ApplicationRecord
self.inheritance_column = false

enum type: [:following, :blocking]
enum type: [:following, :blocking, :muting]

belongs_to :account

Expand Down
4 changes: 4 additions & 0 deletions app/views/settings/exports/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@
%th= t('exports.blocks')
%td= @total_blocks
%td= table_link_to 'download', t('exports.csv'), settings_exports_blocks_path(format: :csv)
%tr
%th= t('exports.mutes')
%td= @total_mutes
%td= table_link_to 'download', t('exports.csv'), settings_exports_mutes_path(format: :csv)
14 changes: 14 additions & 0 deletions app/workers/import_worker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ def perform(import_id)
process_blocks
when 'following'
process_follows
when 'muting'
process_mutes
end

@import.destroy
Expand All @@ -35,6 +37,18 @@ def import_rows
CSV.new(import_contents).reject(&:blank?)
end

def process_mutes
import_rows.each do |row|
begin
target_account = FollowRemoteAccountService.new.call(row.first)
next if target_account.nil?
MuteService.new.call(from_account, target_account)
rescue Goldfinger::Error, HTTP::Error, OpenSSL::SSL::SSLError
next
end
end
end

def process_blocks
import_rows.each do |row|
begin
Expand Down
2 changes: 2 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ en:
x_seconds: "%{count}s"
exports:
blocks: You block
mutes: You mute
csv: CSV
follows: You follow
storage: Media storage
Expand All @@ -92,6 +93,7 @@ en:
types:
blocking: Blocking list
following: Following list
muting: Muting list
upload: Upload
landing_strip_html: <strong>%{name}</strong> is a user on <strong>%{domain}</strong>. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can <a href="%{sign_up_path}">sign up here</a>.
media_attachments:
Expand Down
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
namespace :exports, constraints: { format: :csv } do
resources :follows, only: :index, controller: :following_accounts
resources :blocks, only: :index, controller: :blocked_accounts
resources :mutes, only: :index, controller: :muted_accounts
end

resource :two_factor_auth, only: [:show, :new, :create] do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

expect(response).to have_http_status(:success)
expect(response.content_type).to eq 'text/csv'
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="blocking.csv"'
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="blocked_accounts.csv"'
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

expect(response).to have_http_status(:success)
expect(response.content_type).to eq 'text/csv'
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="following.csv"'
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="following_accounts.csv"'
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
require 'rails_helper'

describe Settings::Exports::MutedAccountsController do
before do
sign_in Fabricate(:user), scope: :user
end

describe 'GET #index' do
it 'returns a csv of the muting accounts' do
get :index, format: :csv

expect(response).to have_http_status(:success)
expect(response.content_type).to eq 'text/csv'
expect(response.headers['Content-Disposition']).to eq 'attachment; filename="muted_accounts.csv"'
end
end
end

0 comments on commit 7f0a865

Please sign in to comment.