|
|
|
@ -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 |
|
|
|
|