Sha256: fd0c0129555853b011fe1b1261951c9d0f092f5c3c65231f2bc7edc86d7ef997

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

module ActiveWebhook
  module Callbacks
    class InvalidCallbackError < StandardError; end
    extend ActiveSupport::Concern

    SUPPORTED_CALLBACKS = %i(created updated deleted).freeze

    class_methods do
      def trigger_webhooks(version: nil, only: nil, except: [], **_options)
        callbacks = if only.nil?
          SUPPORTED_CALLBACKS
        else
          Array.wrap(only).map(&:to_sym)
        end - Array.wrap(except).map(&:to_sym)

        callbacks.each do |callback|
          unless SUPPORTED_CALLBACKS.include? callback
            raise InvalidCallbackError, "Invalid callback: #{callback}. Must be one of #{SUPPORTED_CALLBACKS}."
          end
        end

        after_commit :trigger_created_webhook, on: :create if callbacks.include?(:created)

        after_commit :trigger_updated_webhook, on: :update if callbacks.include?(:updated)

        after_commit :trigger_deleted_webhook, on: :destroy if callbacks.include?(:deleted)
      end
    end

    def trigger_created_webhook
      trigger_webhook(:created)
    end

    def trigger_updated_webhook
      trigger_webhook(:updated) unless previous_changes.empty?
    end

    def trigger_deleted_webhook
      trigger_webhook(:deleted)
    end

    def trigger_webhook(key, version: nil, type: 'resource', **context)
      key = [self.class.name.underscore, key].join("/") unless key.is_a?(String)
      context[:resource_id] ||= id
      context[:resource_type] ||= self.class.name

      ActiveWebhook.trigger(key: key, version: version, type: type, **context)
    end
  end
  ActiveRecord::Base.include ActiveWebhook::Callbacks
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
active_webhook-1.0.0 lib/active_webhook/callbacks.rb