# frozen_string_literal: true class DeliverToDeviceService < BaseService include Payloadable class EncryptedMessage < ActiveModelSerializers::Model attributes :source_account, :target_account, :source_device, :target_device_id, :type, :body, :digest, :message_franking end def call(source_account, source_device, options = {}) @source_account = source_account @source_device = source_device @target_account = Account.find(options[:account_id]) @target_device_id = options[:device_id] @body = options[:body] @type = options[:type] @hmac = options[:hmac] set_message_franking! if @target_account.local? deliver_to_local! else deliver_to_remote! end end private def set_message_franking! @message_franking = message_franking.to_token end def deliver_to_local! target_device = @target_account.devices.find_by!(device_id: @target_device_id) target_device.encrypted_messages.create!( from_account: @source_account, from_device_id: @source_device.device_id, type: @type, body: @body, digest: @hmac, message_franking: @message_franking ) end def deliver_to_remote! ActivityPub::DeliveryWorker.perform_async( Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_encrypted_message(encrypted_message), ActivityPub::ActivitySerializer)), @source_account.id, @target_account.inbox_url ) end def message_franking MessageFranking.new( source_account_id: @source_account.id, target_account_id: @target_account.id, hmac: @hmac, timestamp: Time.now.utc ) end def encrypted_message EncryptedMessage.new( source_account: @source_account, target_account: @target_account, source_device: @source_device, target_device_id: @target_device_id, type: @type, body: @body, digest: @hmac, message_franking: @message_franking ) end end