chatwoot-develop/enterprise/app/services/captain/webhook_sender_service.rb

66 lines
1.7 KiB
Ruby

class Captain::WebhookSenderService
def initialize(reservation)
@reservation = reservation
@unit = reservation.unit
end
def perform
return if @unit&.webhook_url.blank?
payload = build_payload
send_webhook(payload)
end
private
def build_payload
contact = @reservation.contact
brand = @reservation.brand
{
event: 'reservation_update',
timestamp: Time.current.iso8601,
reservation: {
id: @reservation.id,
suite: @reservation.suite_identifier,
status: @reservation.status,
payment_status: @reservation.payment_status,
check_in: @reservation.check_in_at&.iso8601,
check_out: @reservation.check_out_at&.iso8601,
created_at: @reservation.created_at&.iso8601
},
financial: {
total_amount: @reservation.total_amount,
paid_amount: @reservation.active? ? (@reservation.total_amount * 0.5) : 0.0,
currency: 'BRL'
},
customer: {
name: contact&.name,
email: contact&.email,
phone: contact&.phone_number
},
unit: {
name: @unit.name,
brand: brand&.name
},
metadata: @reservation.metadata
}
end
def send_webhook(payload)
uri = URI.parse(@unit.webhook_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == 'https')
request = Net::HTTP::Post.new(uri.path, { 'Content-Type' => 'application/json' })
request.body = payload.to_json
begin
response = http.request(request)
Rails.logger.info "[Captain::WebhookSender] Sent to #{@unit.webhook_url} | Status: #{response.code}"
rescue StandardError => e
Rails.logger.error "[Captain::WebhookSender] Failed to send: #{e.message}"
end
end
end