|
|
|
@ -4,26 +4,31 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
|
|
|
|
def perform
|
|
|
|
|
return if delete_arrived_first?(object_uri) || unsupported_object_type?
|
|
|
|
|
|
|
|
|
|
status = find_existing_status
|
|
|
|
|
RedisLock.acquire(lock_options) do |lock|
|
|
|
|
|
if lock.acquired?
|
|
|
|
|
@status = find_existing_status
|
|
|
|
|
process_status if @status.nil?
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
@status
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return status unless status.nil?
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def process_status
|
|
|
|
|
ApplicationRecord.transaction do
|
|
|
|
|
status = Status.create!(status_params)
|
|
|
|
|
@status = Status.create!(status_params)
|
|
|
|
|
|
|
|
|
|
process_tags(status)
|
|
|
|
|
process_attachments(status)
|
|
|
|
|
process_tags(@status)
|
|
|
|
|
process_attachments(@status)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
resolve_thread(status)
|
|
|
|
|
distribute(status)
|
|
|
|
|
forward_for_reply if status.public_visibility? || status.unlisted_visibility?
|
|
|
|
|
|
|
|
|
|
status
|
|
|
|
|
resolve_thread(@status)
|
|
|
|
|
distribute(@status)
|
|
|
|
|
forward_for_reply if @status.public_visibility? || @status.unlisted_visibility?
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def find_existing_status
|
|
|
|
|
status = status_from_uri(object_uri)
|
|
|
|
|
status ||= Status.find_by(uri: @object['atomUri']) if @object['atomUri'].present?
|
|
|
|
@ -182,4 +187,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
|
|
|
|
return unless @json['signature'].present? && reply_to_local?
|
|
|
|
|
ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def lock_options
|
|
|
|
|
{ redis: Redis.current, key: "create:#{@object['id']}" }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|