Module: DBConfig

Defined in:
lib/db_config.rb,
lib/db_config/record.rb,
lib/db_config/current.rb,
lib/db_config/railtie.rb,
lib/db_config/version.rb,
lib/db_config/middleware.rb

Defined Under Namespace

Classes: Current, Middleware, NotFoundError, Railtie, Record

Constant Summary collapse

VERSION =
"0.1.10"

Class Method Summary collapse

Class Method Details

.delete(key) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/db_config.rb', line 42

def delete(key)
  key_str = key.to_s
  record = DBConfig::Record.find_by(key: key_str)

  if record
    record.destroy!
    true
  else
    false
  end
end

.exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/db_config.rb', line 107

def exist?(key)
  get_record(key) != nil
end

.fetch(key, &block) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/db_config.rb', line 111

def fetch(key, &block)
  record = get_record(key)

  if record
    convert_value(record.value, record.value_type)
  elsif block_given?
    # Execute block and store the result
    value = yield
    set(key, value)
  end

  # Return nil if key doesn't exist and no block given
end

.get(key) ⇒ Object Also known as: read



11
12
13
14
# File 'lib/db_config.rb', line 11

def get(key)
  record = get_record(key)
  record ? convert_value(record.value, record.value_type) : nil
end

.get!(key) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/db_config.rb', line 16

def get!(key)
  record = get_record(key)

  if record
    convert_value(record.value, record.value_type)
  else
    raise NotFoundError, "DBConfig not found for key: #{key}"
  end
end

.set(key, value) ⇒ Object Also known as: write



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

def set(key, value)
  value_str = serialize_value(value)
  value_type = determine_type(value)
  key = key.to_s

  record = Current.cached_records[key] || DBConfig::Record.find_or_initialize_by(key:)

  record.update!(
    value: value_str,
    value_type: value_type,
    eager_load: record.eager_load || false
  )

  convert_value(record.value, record.value_type)
end

.update(key, **kwargs) ⇒ Object

Raises:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/db_config.rb', line 54

def update(key, **kwargs)
  key_str = key.to_s
  record = get_record(key_str)
  raise NotFoundError, "DBConfig not found for key: #{key}" unless record

  # Extract current values
  current_value = convert_value(record.value, record.value_type)
  current_type = record.value_type

  # Process updates
  updates = {}

  # Handle value update - new values can change type freely
  if kwargs.key?(:value)
    new_value = kwargs[:value]
    new_type = determine_type(new_value)

    updates[:value] = serialize_value(new_value)
    updates[:value_type] = new_type
  end

  # Handle type update with compatibility check
  if kwargs.key?(:type)
    target_type = kwargs[:type]

    # Validate target type
    unless DBConfig::Record::VALUE_TYPES.include?(target_type)
      raise ArgumentError, "Invalid type: #{target_type}. Must be one of: #{DBConfig::Record::VALUE_TYPES.join(", ")}"
    end

    # Check if current value can be converted to target type
    unless value_convertible_to_type?(current_value, current_type, target_type)
      raise ArgumentError, "Can't modify type because value \"#{current_value}\" doesn't support conversion from \"#{current_type}\" to \"#{target_type}\""
    end

    # Convert value to new type
    converted_value = convert_value_to_type(current_value, current_type, target_type)
    updates[:value] = serialize_value(converted_value)
    updates[:value_type] = target_type
  end

  # Handle eager_load update
  if kwargs.key?(:eager_load)
    updates[:eager_load] = kwargs[:eager_load]
  end

  # Apply updates
  record.update!(updates)

  # Return the updated value in its new type
  convert_value(record.value, record.value_type)
end