Class: Kaal::Definition::RedisEngine

Inherits:
Registry
  • Object
show all
Includes:
Support::HashTools
Defined in:
lib/kaal/definition/redis_engine.rb

Overview

Redis-backed definition registry shared across processes.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Support::HashTools

constantize, deep_dup, deep_merge, duplicable?, stringify_keys, symbolize_keys

Methods inherited from Registry

#disable_definition, #enable_definition, #enabled_definitions

Constructor Details

#initialize(redis, namespace: 'kaal') ⇒ RedisEngine

Returns a new instance of RedisEngine.



19
20
21
22
23
# File 'lib/kaal/definition/redis_engine.rb', line 19

def initialize(redis, namespace: 'kaal')
  super()
  @redis = redis
  @namespace = namespace
end

Class Method Details

.deserialize_payload(raw) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/kaal/definition/redis_engine.rb', line 75

def deserialize_payload(raw)
  return nil unless raw

  parsed = JSON.parse(raw)
  {
    key: parsed['key'],
    cron: parsed['cron'],
    enabled: parsed['enabled'] == true,
    source: parsed['source'],
    metadata: parsed['metadata'] || {},
    created_at: parse_time(parsed['created_at']),
    updated_at: parse_time(parsed['updated_at']),
    disabled_at: parse_time(parsed['disabled_at'])
  }
rescue JSON::ParserError
  nil
end

.parse_time(value) ⇒ Object



93
94
95
96
97
# File 'lib/kaal/definition/redis_engine.rb', line 93

def parse_time(value)
  Time.iso8601(value.to_s)
rescue ArgumentError
  nil
end

.serialize_payload(payload) ⇒ Object



69
70
71
72
73
# File 'lib/kaal/definition/redis_engine.rb', line 69

def serialize_payload(payload)
  payload.transform_values do |value|
    value.is_a?(Time) ? value.iso8601 : value
  end
end

Instance Method Details

#all_definitionsObject



54
55
56
# File 'lib/kaal/definition/redis_engine.rb', line 54

def all_definitions
  @redis.hvals(storage_key).filter_map { |raw| self.class.deserialize_payload(raw) }.sort_by { |definition| definition[:key] }
end

#find_definition(key) ⇒ Object



49
50
51
52
# File 'lib/kaal/definition/redis_engine.rb', line 49

def find_definition(key)
  raw = @redis.hget(storage_key, key)
  deserialize(raw)
end

#remove_definition(key) ⇒ Object



43
44
45
46
47
# File 'lib/kaal/definition/redis_engine.rb', line 43

def remove_definition(key)
  raw = @redis.hget(storage_key, key)
  @redis.hdel(storage_key, key)
  deserialize(raw)
end

#upsert_definition(key:, cron:, enabled: true, source: 'code', metadata: {}) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/kaal/definition/redis_engine.rb', line 25

def upsert_definition(key:, cron:, enabled: true, source: 'code', metadata: {})
  now = Time.now.utc
  existing = find_definition(key)
  payload = {
    key: key,
    cron: cron,
    enabled: enabled,
    source: source,
    metadata: deep_dup( || {}),
    created_at: existing ? existing[:created_at] : now,
    updated_at: now,
    disabled_at: PersistenceHelpers.disabled_at_for(existing, enabled, now)
  }

  @redis.hset(storage_key, key, JSON.generate(self.class.serialize_payload(payload)))
  deep_dup(payload)
end