Class: Kaal::Internal::ActiveRecord::DispatchRegistry

Inherits:
Dispatch::Registry show all
Defined in:
lib/kaal/internal/active_record/dispatch_registry.rb,
sig/kaal/internal/active_record/dispatch_registry.rbs

Overview

Active Record-backed registry for dispatch audit records.

Instance Method Summary collapse

Methods inherited from Dispatch::Registry

#dispatched?

Constructor Details

#initialize(connection: nil, model: DispatchRecord, namespace: nil) ⇒ DispatchRegistry

Returns a new instance of DispatchRegistry.

Parameters:

  • connection: (Kaal::rbs_any, nil) (defaults to: nil)
  • model: (Kaal::rbs_any) (defaults to: DispatchRecord)
  • namespace: (Kaal::rbs_any, nil) (defaults to: nil)


14
15
16
17
18
19
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 14

def initialize(connection: nil, model: DispatchRecord, namespace: nil)
  super()
  ConnectionSupport.configure!(connection)
  @model = model
  @namespace = namespace
end

Instance Method Details

#cleanup(recovery_window: 86_400) ⇒ Kaal::rbs_any

Parameters:

  • recovery_window: (::Integer) (defaults to: 86_400)

Returns:

  • (Kaal::rbs_any)


46
47
48
49
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 46

def cleanup(recovery_window: 86_400)
  cutoff_time = Time.now.utc - recovery_window
  cleanup_scope.where(fire_time: ...cutoff_time).delete_all
end

#cleanup_scope ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


84
85
86
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 84

def cleanup_scope
  namespace_scope(@model)
end

#find_by_key(key) ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


34
35
36
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 34

def find_by_key(key)
  query(key: namespaced_key(key))
end

#find_by_node(node_id) ⇒ Kaal::rbs_any

Parameters:

  • node_id (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


38
39
40
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 38

def find_by_node(node_id)
  query(node_id: node_id)
end

#find_by_status(status) ⇒ Kaal::rbs_any

Parameters:

  • status (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


42
43
44
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 42

def find_by_status(status)
  query(status: status)
end

#find_dispatch(key, fire_time) ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)
  • fire_time (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


30
31
32
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 30

def find_dispatch(key, fire_time)
  normalize(@model.find_by(key: namespaced_key(key), fire_time: fire_time))
end

#log_dispatch(key, fire_time, node_id, status = 'dispatched') ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)
  • fire_time (Kaal::rbs_any)
  • node_id (Kaal::rbs_any)
  • status (::String) (defaults to: 'dispatched')

Returns:

  • (Kaal::rbs_any)


21
22
23
24
25
26
27
28
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 21

def log_dispatch(key, fire_time, node_id, status = 'dispatched')
  record = @model.find_or_initialize_by(key: namespaced_key(key), fire_time: fire_time)
  record.dispatched_at = Time.now.utc
  record.node_id = node_id
  record.status = status
  record.save!
  normalize(record)
end

#namespace_prefix ⇒ "", ::String

Returns:

  • ("", ::String)


94
95
96
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 94

def namespace_prefix
  @namespace.to_s.empty? ? '' : "#{@namespace}:"
end

#namespace_scope(relation) ⇒ Kaal::rbs_any

Parameters:

  • relation (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


88
89
90
91
92
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 88

def namespace_scope(relation)
  return relation if namespace_prefix.empty?

  relation.where('key LIKE ?', "#{namespace_prefix}%")
end

#namespaced_key(key) ⇒ ::String

Parameters:

  • key (Kaal::rbs_any)

Returns:

  • (::String)


57
58
59
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 57

def namespaced_key(key)
  "#{namespace_prefix}#{key}"
end

#normalize(record) ⇒ nil, { key: Kaal::rbs_any, fire_time: Kaal::rbs_any, dispatched_at: Kaal::rbs_any, node_id: Kaal::rbs_any, status: Kaal::rbs_any }

Parameters:

  • record (Kaal::rbs_any)

Returns:

  • (nil, { key: Kaal::rbs_any, fire_time: Kaal::rbs_any, dispatched_at: Kaal::rbs_any, node_id: Kaal::rbs_any, status: Kaal::rbs_any })


61
62
63
64
65
66
67
68
69
70
71
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 61

def normalize(record)
  return nil unless record

  {
    key: strip_namespace(record.key),
    fire_time: record.fire_time,
    dispatched_at: record.dispatched_at,
    node_id: record.node_id,
    status: record.status
  }
end

#query(filters) ⇒ Kaal::rbs_any

Parameters:

  • filters (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


53
54
55
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 53

def query(filters)
  query_scope(filters).order(fire_time: :desc).map { |record| normalize(record) }
end

#query_scope(filters) ⇒ Kaal::rbs_any

Parameters:

  • filters (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


77
78
79
80
81
82
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 77

def query_scope(filters)
  relation = @model.where(filters)
  return relation if filters.key?(:key)

  namespace_scope(relation)
end

#strip_namespace(key) ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


73
74
75
# File 'lib/kaal/internal/active_record/dispatch_registry.rb', line 73

def strip_namespace(key)
  key.delete_prefix(namespace_prefix)
end