scinote-web/app/services/webhook_service.rb
2021-11-03 15:04:13 +01:00

56 lines
1.1 KiB
Ruby

# frozen_string_literal: true
class WebhookService
class InactiveWebhookSendException < StandardError; end
class RequestFailureException < StandardError; end
def initialize(webhook, payload)
@webhook = webhook
@payload = payload
end
def send_webhook
unless @webhook.active?
raise(
InactiveWebhookSendException,
'Refused to send inactive webhook.'
)
end
headers = { 'Content-Type' => 'application/json' }
headers['Webhook-Secret-Key'] = @webhook.secret_key if @webhook.secret_key.present?
response = HTTParty.public_send(
@webhook.http_method,
@webhook.url,
{
headers: headers,
body: @payload.to_json
}
)
unless response.success?
error_description = "#{response.code}: #{response.message}"
log_error!(error_description)
raise(
RequestFailureException,
error_description
)
end
response
rescue Net::ReadTimeout, Net::OpenTimeout, SocketError => e
log_error!(e)
raise e
end
private
def log_error!(message)
@webhook.update!(
last_error: message
)
end
end