diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2018-02-28 06:54:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-28 06:54:55 +0100 |
commit | 41a01bec2337e7021634f2e9c78d86a1c3002fcf (patch) | |
tree | 44ab6f2f922d5d9adb01f0978ce79a8d301533ca /app/services/report_service.rb | |
parent | 4072b686862048c86674bd6de16d7e20ddc52b29 (diff) |
Federated reports (#6570)
* Fix #2176: Federated reports * UI for federated reports * Add spec for ActivityPub Flag handler * Add spec for ReportService
Diffstat (limited to 'app/services/report_service.rb')
-rw-r--r-- | app/services/report_service.rb | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/app/services/report_service.rb b/app/services/report_service.rb new file mode 100644 index 000000000..c06488a6d --- /dev/null +++ b/app/services/report_service.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +class ReportService < BaseService + def call(source_account, target_account, options = {}) + @source_account = source_account + @target_account = target_account + @status_ids = options.delete(:status_ids) || [] + @comment = options.delete(:comment) || '' + @options = options + + create_report! + notify_staff! + forward_to_origin! if !@target_account.local? && ActiveModel::Type::Boolean.new.cast(@options[:forward]) + + @report + end + + private + + def create_report! + @report = @source_account.reports.create!( + target_account: @target_account, + status_ids: @status_ids, + comment: @comment + ) + end + + def notify_staff! + User.staff.includes(:account).each do |u| + AdminMailer.new_report(u.account, @report).deliver_later + end + end + + def forward_to_origin! + ActivityPub::DeliveryWorker.perform_async( + payload, + some_local_account.id, + @target_account.inbox_url + ) + end + + def payload + Oj.dump(ActiveModelSerializers::SerializableResource.new( + @report, + serializer: ActivityPub::FlagSerializer, + adapter: ActivityPub::Adapter, + account: some_local_account + ).as_json) + end + + def some_local_account + @some_local_account ||= Account.local.where(suspended: false).first + end +end |