mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-26 01:35:34 +08:00
56 lines
1.1 KiB
Ruby
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
|