Class: ZeroRailsAdapter::PublishedSchema

Inherits:
Object
  • Object
show all
Defined in:
lib/zero_rails_adapter/published_schema.rb

Constant Summary collapse

SUPPORTED_COLUMN_TYPES =
%i[
  bigint boolean date datetime decimal enum float integer json jsonb
  string text time timestamp uuid
].freeze
FORBIDDEN_COLUMN_NAMES =
%w[
  access_token api_key api_key_digest device_token key_digest
  password password_digest password_hash refresh_token secret secret_key
  token token_digest
].freeze
FORBIDDEN_TABLE_PREFIXES =
%w[
  action_mailbox_ active_storage_
].freeze
FORBIDDEN_TABLE_NAMES =
%w[
  user_login_change_keys user_lockouts user_password_reset_keys
  user_previous_password_hashes user_recovery_codes user_remember_keys
  user_verification_keys
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mapping, zero_key: ZeroRailsAdapter.configuration.zero_key) ⇒ PublishedSchema

Returns a new instance of PublishedSchema.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/zero_rails_adapter/published_schema.rb', line 25

def initialize(mapping, zero_key: ZeroRailsAdapter.configuration.zero_key)
  value = mapping.respond_to?(:call) ? mapping.call : mapping
  unless value.respond_to?(:to_h)
    raise UnsafePublicationError,
      "Published schema must be a model-to-columns mapping"
  end

  @zero_key = zero_key
  @columns_by_model = value.to_h.each_with_object({}) do |(model, names), result|
    validate_model!(model)
    result[model] = validate_columns!(model, names)
  end
  @models = @columns_by_model.keys.freeze
end

Instance Attribute Details

#modelsObject (readonly)

Returns the value of attribute models.



23
24
25
# File 'lib/zero_rails_adapter/published_schema.rb', line 23

def models
  @models
end

Instance Method Details

#column_names_for(model) ⇒ Object



44
45
46
# File 'lib/zero_rails_adapter/published_schema.rb', line 44

def column_names_for(model)
  columns_for(model).map(&:name)
end

#columns_for(model) ⇒ Object



48
49
50
# File 'lib/zero_rails_adapter/published_schema.rb', line 48

def columns_for(model)
  @columns_by_model.fetch(model)
end

#empty?Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/zero_rails_adapter/published_schema.rb', line 40

def empty?
  models.empty?
end

#zero_keys_for(model) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/zero_rails_adapter/published_schema.rb', line 52

def zero_keys_for(model)
  keys = Array(@zero_key.call(model)).compact.map(&:to_s)
  return keys.freeze if keys.any?

  label = model.name.presence || model.table_name
  raise UnsafePublicationError, "#{label} must define at least one Zero key"
end