Class: RailsWebhookOutbox::Subscription

Inherits:
ApplicationRecord show all
Defined in:
app/models/rails_webhook_outbox/subscription.rb

Constant Summary collapse

URL_FORMAT =
/\Ahttps?:\/\/.+/i

Instance Method Summary collapse

Instance Method Details

#previous_secret_active?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'app/models/rails_webhook_outbox/subscription.rb', line 32

def previous_secret_active?
  previous_secret.present? && previous_secret_expires_at.present? && previous_secret_expires_at.future?
end

#record_delivery_failure!(threshold: RailsWebhookOutbox.config.circuit_breaker_threshold) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'app/models/rails_webhook_outbox/subscription.rb', line 44

def record_delivery_failure!(threshold: RailsWebhookOutbox.config.circuit_breaker_threshold)
  with_lock do
    next false unless active?

    increment!(:consecutive_failures)
    next false unless threshold&.positive? && consecutive_failures >= threshold

    update!(active: false)
    true
  end
end

#record_delivery_success!Object



40
41
42
# File 'app/models/rails_webhook_outbox/subscription.rb', line 40

def record_delivery_success!
  update!(consecutive_failures: 0) if consecutive_failures != 0
end

#rotate_secret!(grace_period: RailsWebhookOutbox.config.secret_rotation_grace_period, force: false) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'app/models/rails_webhook_outbox/subscription.rb', line 22

def rotate_secret!(grace_period: RailsWebhookOutbox.config.secret_rotation_grace_period, force: false)
  raise SecretRotationError if previous_secret_active? && !force

  update!(
    previous_secret: secret,
    previous_secret_expires_at: Time.current + grace_period,
    secret: generate_secret_value
  )
end

#signing_secretsObject



36
37
38
# File 'app/models/rails_webhook_outbox/subscription.rb', line 36

def signing_secrets
  previous_secret_active? ? [secret, previous_secret] : [secret]
end

#subscribes_to?(event) ⇒ Boolean

Returns:

  • (Boolean)


18
19
20
# File 'app/models/rails_webhook_outbox/subscription.rb', line 18

def subscribes_to?(event)
  events.include?(event.to_s)
end