diff --git a/app/models/notification.rb b/app/models/notification.rb index 498673ff..5cdc629f 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -59,6 +59,7 @@ class Notification < ApplicationRecord def target_status case type when :reblog + return status if status&.quote? status&.reblog when :favourite favourite&.status diff --git a/app/models/status.rb b/app/models/status.rb index 9c055116..c88daf7d 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -162,6 +162,10 @@ class Status < ApplicationRecord !reblog_of_id.nil? end + def quote? + !quote_of_id.nil? + end + def within_realtime_window? created_at >= REAL_TIME_WINDOW.ago end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index ee549003..ecd2c46d 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -68,6 +68,7 @@ class PostStatusService < BaseService process_hashtags_service.call(@status) process_mentions_service.call(@status) + process_quote_service.call(@status) end def schedule_status! @@ -117,6 +118,10 @@ class PostStatusService < BaseService ISO_639.find(str)&.alpha2 end + def process_quote_service + ProcessQuoteService.new + end + def process_mentions_service ProcessMentionsService.new end diff --git a/app/services/process_quote_service.rb b/app/services/process_quote_service.rb new file mode 100644 index 00000000..b532ae38 --- /dev/null +++ b/app/services/process_quote_service.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +class ProcessQuoteService < BaseService + include StreamEntryRenderer + + # Create notification for a quote + # @param [Status] status Quoting status + # @return [Status] + def call(status) + create_notification(status) + bump_potential_friendship(status) + end + + private + + def create_notification(status) + quoted_status = status.quote + + if quoted_status.account.local? + LocalNotificationWorker.perform_async(quoted_status.account_id, status.id, status.class.name) + elsif quoted_status.account.ostatus? + NotificationWorker.perform_async(stream_entry_to_xml(status.stream_entry), status.account_id, quoted_status.account_id) + elsif quoted_status.account.activitypub? && !quoted_status.account.following?(status.account) + ActivityPub::DeliveryWorker.perform_async(build_json(status), status.account_id, quoted_status.account.inbox_url) + end + end + + def bump_potential_friendship(status) + ActivityTracker.increment('activity:interactions') + return if status.account.following?(status.quote.account_id) + PotentialFriendshipTracker.record(status.account_id, status.quote.account_id, :reblog) + end + + def build_json(status) + Oj.dump(ActivityPub::LinkedDataSignature.new(ActiveModelSerializers::SerializableResource.new( + status, + serializer: ActivityPub::ActivitySerializer, + adapter: ActivityPub::Adapter + ).as_json).sign!(status.account)) + end + end + \ No newline at end of file