Sha256: 710cf0ed5293d6f163fb80930c4cd05cf0f645cb3ffc5e44eb7a19296ec8ca51

Contents?: true

Size: 1.66 KB

Versions: 1

Compression:

Stored size: 1.66 KB

Contents

require 'active_support/concern'
require 'global_id'

module Services
  module Asyncable
    extend ActiveSupport::Concern

    ASYNC_METHOD_SUFFIXES = %i(async in at).freeze

    included do
      begin
        require 'sidekiq'
        require 'sidekiq/api'
      rescue LoadError
      else
        include Sidekiq::Worker
        return
      end

      begin
        require 'sucker_punch'
      rescue LoadError
        raise Services::NoBackgroundProcessorFound
      else
        include SuckerPunch::Job
      end
    end

    module ClassMethods
      ASYNC_METHOD_SUFFIXES.each do |async_method_suffix|
        define_method "call_#{async_method_suffix}" do |*args|
          args = args.map do |arg|
            arg.respond_to?(:to_global_id) ? arg.to_global_id : arg
          end
          self.public_send "perform_#{async_method_suffix}", *args
        end
      end
    end

    def perform(*args)
      args = args.map do |arg|
        GlobalID::Locator.locate(arg) || arg
      end

      # If the `call` method takes any kwargs and the last argument is a hash, symbolize the hash keys,
      # otherwise they won't be recognized as kwards when splatted.
      # Since the arguments to `perform` are serialized to the database before Sidekiq picks them up,
      # symbol keys are converted to strings.
      call_method = method(:call)

      # Find the first class that inherits from `Services::Base`.
      while !(call_method.owner < Services::Base)
        call_method = call_method.super_method
      end

      if call_method.parameters.map(&:first).grep(/\Akey/).any? && args.last.is_a?(Hash)
        args.last.symbolize_keys!
      end

      call *args
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
services-7.3.0 lib/services/asyncable.rb