Module: Hooksmith::Rails::WebhooksController
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/hooksmith/rails/webhooks_controller.rb
Overview
A concern for Rails controllers that handle webhooks.
This concern provides standardized webhook handling with:
- Automatic request verification (if configured)
- Consistent response codes (200 for success, 400 for bad request, 500 for errors)
- Error logging and instrumentation
- Skip CSRF protection for webhook endpoints
Instance Method Summary collapse
-
#handle_webhook(provider:, event:, payload:) {|result| ... } ⇒ void
Handles a webhook synchronously.
-
#handle_webhook_async(provider:, event:, payload:, queue: :default) ⇒ void
Handles a webhook asynchronously using ActiveJob.
Instance Method Details
#handle_webhook(provider:, event:, payload:) {|result| ... } ⇒ void
This method returns an undefined value.
Handles a webhook synchronously.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/hooksmith/rails/webhooks_controller.rb', line 61 def handle_webhook(provider:, event:, payload:) result = Hooksmith::Dispatcher.new(provider:, event:, payload:).run! if block_given? yield(result) else head :ok end rescue Hooksmith::MultipleProcessorsError => e Hooksmith.logger.error("Webhook error: #{e.}") head :internal_server_error rescue StandardError => e Hooksmith.logger.error("Webhook processing failed: #{e.}") head :internal_server_error end |
#handle_webhook_async(provider:, event:, payload:, queue: :default) ⇒ void
This method returns an undefined value.
Handles a webhook asynchronously using ActiveJob.
Requires Hooksmith::Jobs::DispatcherJob to be available.
86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/hooksmith/rails/webhooks_controller.rb', line 86 def handle_webhook_async(provider:, event:, payload:, queue: :default) unless defined?(Hooksmith::Jobs::DispatcherJob) raise 'Hooksmith::Jobs::DispatcherJob is not available. Ensure ActiveJob is loaded.' end Hooksmith::Jobs::DispatcherJob.set(queue:).perform_later( provider: provider.to_s, event: event.to_s, payload: payload.as_json ) head :ok end |