70 lines
1.9 KiB
Ruby
70 lines
1.9 KiB
Ruby
# https://business-api.tiktok.com/portal/docs?id=1832190670631937
|
|
class Webhooks::TiktokEventsJob < MutexApplicationJob
|
|
queue_as :default
|
|
retry_on LockAcquisitionError, wait: 2.seconds, attempts: 8
|
|
|
|
SUPPORTED_EVENTS = [:im_send_msg, :im_receive_msg, :im_mark_read_msg].freeze
|
|
|
|
def perform(event)
|
|
@event = event.with_indifferent_access
|
|
|
|
return if channel_is_inactive?
|
|
|
|
key = format(::Redis::Alfred::TIKTOK_MESSAGE_MUTEX, business_id: business_id, conversation_id: conversation_id)
|
|
with_lock(key, 10.seconds) do
|
|
process_event
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def channel_is_inactive?
|
|
return true if channel.blank?
|
|
return true unless channel.account.active?
|
|
|
|
false
|
|
end
|
|
|
|
def process_event
|
|
return if event_name.blank? || channel.blank?
|
|
|
|
send(event_name)
|
|
end
|
|
|
|
def event_name
|
|
@event_name ||= SUPPORTED_EVENTS.include?(@event[:event].to_sym) ? @event[:event] : nil
|
|
end
|
|
|
|
def business_id
|
|
@business_id ||= @event[:user_openid]
|
|
end
|
|
|
|
def content
|
|
@content ||= JSON.parse(@event[:content]).deep_symbolize_keys
|
|
end
|
|
|
|
def conversation_id
|
|
@conversation_id ||= content[:conversation_id]
|
|
end
|
|
|
|
def channel
|
|
@channel ||= Channel::Tiktok.find_by(business_id: business_id)
|
|
end
|
|
|
|
# Receive real-time notifications if you send a message to a user.
|
|
def im_send_msg
|
|
# This can be either an echo message or a message sent directly via tiktok application
|
|
::Tiktok::MessageService.new(channel: channel, content: content, outgoing_echo: true).perform
|
|
end
|
|
|
|
# Receive real-time notifications if a user outside the European Economic Area (EEA), Switzerland, or the UK sends a message to you.
|
|
def im_receive_msg
|
|
::Tiktok::MessageService.new(channel: channel, content: content).perform
|
|
end
|
|
|
|
# Receive real-time notifications when a Personal Account user marks all messages in a session as read.
|
|
def im_mark_read_msg
|
|
::Tiktok::ReadStatusService.new(channel: channel, content: content).perform
|
|
end
|
|
end
|