Module: JetstreamBridge::ModelCodecSetup

Defined in:
lib/jetstream_bridge/core/model_codec_setup.rb

Class Method Summary collapse

Class Method Details

.already_serialized?(klass, attr) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
58
59
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 55

def already_serialized?(klass, attr)
  klass.attribute_types.fetch(attr, nil).is_a?(ActiveRecord::Type::Serialized)
rescue StandardError
  false
end

.apply!Object



9
10
11
12
13
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 9

def apply!
  return unless ar_connected?

  [JetstreamBridge::OutboxEvent, JetstreamBridge::InboxEvent].each { |k| apply_to(k) }
end

.apply_to(klass) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 15

def apply_to(klass)
  return unless table_exists_safely?(klass)

  %w[payload headers].each do |attr|
    next unless column?(klass, attr)
    next if json_column?(klass, attr) || already_serialized?(klass, attr)

    klass.serialize attr.to_sym, coder: Oj
  end
rescue ActiveRecord::StatementInvalid, ActiveRecord::ConnectionNotEstablished, ActiveRecord::NoDatabaseError
  # ignore when schema isn’t available yet
end

.ar_connected?Boolean

— helpers —

Returns:

  • (Boolean)


30
31
32
33
34
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 30

def ar_connected?
  ActiveRecord::Base.connected?
rescue StandardError
  false
end

.column?(klass, attr) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
45
46
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 42

def column?(klass, attr)
  klass.columns_hash.key?(attr)
rescue StandardError
  false
end

.json_column?(klass, attr) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 48

def json_column?(klass, attr)
  sql = klass.columns_hash.fetch(attr).sql_type.to_s.downcase
  sql.include?('json') # covers json & jsonb
rescue StandardError
  false
end

.table_exists_safely?(klass) ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
39
40
# File 'lib/jetstream_bridge/core/model_codec_setup.rb', line 36

def table_exists_safely?(klass)
  klass.table_exists?
rescue StandardError
  false
end