1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# frozen_string_literal: true
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class Retraction
include Diaspora::Federated::Base
include Diaspora::Logging
attr_reader :subscribers, :data
def initialize(data, subscribers, target=nil)
@data = data
@subscribers = subscribers
@target = target
end
def self.entity_class
DiasporaFederation::Entities::Retraction
end
def self.retraction_data_for(target)
DiasporaFederation::Entities::Retraction.new(
target_guid: target.guid,
target: Diaspora::Federation::Entities.related_entity(target),
target_type: Diaspora::Federation::Mappings.entity_name_for(target),
author: target.diaspora_handle
).to_h
end
def self.for(target)
federation_retraction_data = retraction_data_for(target)
new(federation_retraction_data, target.subscribers.select(&:remote?), target)
end
def defer_dispatch(user, include_target_author=true)
subscribers = dispatch_subscribers(include_target_author)
Workers::DeferredRetraction.perform_async(user.id, self.class.to_s, data.deep_stringify_keys,
subscribers.map(&:id), service_opts(user).deep_stringify_keys)
end
def perform
logger.debug "Performing retraction for #{target.class.base_class}:#{target.guid}"
target.destroy!
logger.info "event=retraction status=complete target=#{data[:target_type]}:#{data[:target_guid]}"
end
def public?
data[:target][:public]
end
private
attr_reader :target
def dispatch_subscribers(include_target_author)
subscribers << target.author if target.is_a?(Diaspora::Relayable) && include_target_author && target.author.remote?
subscribers
end
def service_opts(user)
return {} unless target.is_a?(StatusMessage)
user.services.each_with_object(service_types: []) do |service, opts|
service_opts = service.post_opts(target)
if service_opts
opts.merge!(service_opts)
opts[:service_types] << service.class.to_s
end
end
end
end
|