Sha256: e5b1364e2a8da6914105f5a8a4c9700d69385adff20841d7b591030aeb80f6ca

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module AcidicJob
  class IdempotencyKey
    def self.generate(unique_by:, job_class:)
      new(:job_args).value_for({ "job_class" => job_class }, Marshal.dump(unique_by))
    end

    def initialize(identifier = :job_id)
      @identifier = identifier
    end

    def value_for(hash_or_job, *args, **kwargs)
      return value_from_job_args(hash_or_job, *args, **kwargs) if @identifier == :job_args

      value = if hash_or_job.is_a?(Hash)
                value_from_job_id_for_hash(hash_or_job)
              else
                value_from_job_id_for_obj(hash_or_job)
              end

      value || value_from_job_args(hash_or_job, *args, **kwargs)
    end

    private

    def value_from_job_id_for_hash(hash)
      if hash.key?("job_id")
        return if hash["job_id"].nil?
        return if hash["job_id"].empty?

        hash["job_id"]
      elsif hash.key?("jid")
        return if hash["jid"].nil?
        return if hash["jid"].empty?

        hash["jid"]
      end
    end

    def value_from_job_id_for_obj(obj)
      if obj.respond_to?(:job_id)
        return if obj.job_id.nil?
        return if obj.job_id.empty?

        obj.job_id
      elsif obj.respond_to?(:jid)
        return if obj.jid.nil?
        return if obj.jid.empty?

        obj.jid
      end
    end

    def value_from_job_args(hash_or_job, *args, **kwargs)
      worker_class = case hash_or_job
                     when Hash
                       hash_or_job["worker"] || hash_or_job["job_class"]
                     else
                       hash_or_job.class.name
                     end

      Digest::SHA1.hexdigest [worker_class, args, kwargs].flatten.join
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
acidic_job-1.0.0.pre11 lib/acidic_job/idempotency_key.rb
acidic_job-1.0.0.pre10 lib/acidic_job/idempotency_key.rb