Module: HTM::Config::Database

Included in:
HTM::Config
Defined in:
lib/htm/config/database.rb

Instance Method Summary collapse

Instance Method Details

#actual_database_nameString?

Extract the actual database name from URL or config

Returns:

  • (String, nil)

    the database name



134
135
136
137
138
139
140
141
142
143
# File 'lib/htm/config/database.rb', line 134

def actual_database_name
  url = database&.url
  if url && !url.empty?
    # Parse database name from URL: postgresql://user@host:port/dbname
    uri = URI.parse(url) rescue nil
    return uri&.path&.sub(%r{^/}, '')
  end

  database&.name
end

#database_configObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/htm/config/database.rb', line 44

def database_config
  url = database_url
  return {} unless url

  uri = URI.parse(url)

  # Coercion now merges env vars with SCHEMA defaults, so pool_size/timeout
  # are always available even when only HTM_DATABASE__URL is set
  {
    adapter: 'postgresql',
    host: uri.host,
    port: uri.port || 5432,
    database: uri.path&.sub(%r{^/}, ''),
    username: uri.user,
    password: uri.password,
    pool: database.pool_size.to_i,
    timeout: database.timeout.to_i,
    sslmode: database.sslmode,
    encoding: 'unicode',
    prepared_statements: false,
    advisory_locks: false
  }.compact
end

#database_configured?Boolean

Returns:

  • (Boolean)


68
69
70
71
# File 'lib/htm/config/database.rb', line 68

def database_configured?
  url = database_url
  (url && !url.empty?) || (database.name && !database.name.empty?)
end

#database_hostString?

Returns the database host.

Returns:

  • (String, nil)

    the database host



20
21
22
# File 'lib/htm/config/database.rb', line 20

def database_host
  database.host
end

#database_nameString?

Returns the database name.

Returns:

  • (String, nil)

    the database name



30
31
32
# File 'lib/htm/config/database.rb', line 30

def database_name
  database.name
end

#database_passwordString?

Returns the database password.

Returns:

  • (String, nil)

    the database password



40
41
42
# File 'lib/htm/config/database.rb', line 40

def database_password
  database.password
end

#database_portInteger?

Returns the database port.

Returns:

  • (Integer, nil)

    the database port



25
26
27
# File 'lib/htm/config/database.rb', line 25

def database_port
  database.port
end

#database_urlObject

Database convenience methods



74
75
76
77
78
79
# File 'lib/htm/config/database.rb', line 74

def database_url
  url = database.url
  return url if url && !url.empty?

  build_database_url
end

#database_userString?

Returns the database user.

Returns:

  • (String, nil)

    the database user



35
36
37
# File 'lib/htm/config/database.rb', line 35

def database_user
  database.user
end

#expected_database_nameString

Returns the expected database name based on service.name and environment

Examples:

config.service.name = "htm"
HTM_ENV = "test"
config.expected_database_name  # => "htm_test"

Returns:



127
128
129
# File 'lib/htm/config/database.rb', line 127

def expected_database_name
  "#{service_name}_#{environment}"
end

#parse_database_urlHash?

Parse database URL into component hash

Returns:

  • (Hash, nil)

    parsed components or nil if no URL



194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/htm/config/database.rb', line 194

def parse_database_url
  url = database&.url
  return nil if url.nil? || url.empty?

  uri = URI.parse(url) rescue nil
  return nil unless uri

  # Parse query string for sslmode
  query_params = URI.decode_www_form(uri.query || '').to_h
  sslmode = query_params['sslmode']

  {
    host: uri.host,
    port: uri.port,
    name: uri.path&.sub(%r{^/}, ''),
    user: uri.user,
    password: uri.password,
    sslmode: sslmode
  }.compact
end

#valid_database_name?Boolean

Check if the database name matches the expected convention

Returns:

  • (Boolean)

    true if database name matches expected



183
184
185
# File 'lib/htm/config/database.rb', line 183

def valid_database_name?
  actual_database_name == expected_database_name
end

#validate_database!true

Validate that database is configured for the current environment

Returns:

  • (true)

    if database is configured

Raises:



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/htm/config/database.rb', line 85

def validate_database!
  validate_environment!

  unless database_configured?
    raise HTM::ConfigurationError,
          "No database configured for environment '#{environment}'. " \
          "Set HTM_DATABASE__URL or HTM_DATABASE__NAME, " \
          "or add database.name to the '#{environment}:' section in your config."
  end

  true
end

#validate_database_name!true

Validate that the database name follows the naming convention

Database names must be: HTM::Config#service_name_HTM::Config#environment

Examples:

Valid configurations

HTM_ENV=test, service.name=htm, database=htm_test        # OK
HTM_ENV=production, service.name=payroll, database=payroll_production  # OK

Invalid configurations (will raise)

HTM_ENV=test, service.name=htm, database=htm_production  # Wrong environment
HTM_ENV=test, service.name=htm, database=payroll_test    # Wrong service
HTM_ENV=test, service.name=htm, database=mydb            # Wrong format

Returns:

  • (true)

    if database name is valid

Raises:



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/htm/config/database.rb', line 161

def validate_database_name!
  actual = actual_database_name
  expected = expected_database_name

  return true if actual == expected

  raise HTM::ConfigurationError,
        "Database name '#{actual}' does not match expected '#{expected}'.\n" \
        "Database names must follow the convention: {service_name}_{environment}\n  " \
        "Service name: #{service_name}\n  " \
        "Environment:  #{environment}\n  " \
        "Expected:     #{expected}\n  " \
        "Actual:       #{actual}\n\n" \
        "Either:\n  " \
        "- Set HTM_DATABASE__URL to point to '#{expected}'\n  " \
        "- Set HTM_DATABASE__NAME=#{expected}\n  " \
        "- Change HTM_ENV to match the database suffix"
end