Sha256: 9777e872fb1be584a9b664c7356507873d592f10eb79183c38ea0486fe508779

Contents?: true

Size: 1.63 KB

Versions: 13

Compression:

Stored size: 1.63 KB

Contents

module Comee
  module Core
    class Product < ApplicationRecord
      belongs_to :product_type
      belongs_to :unit

      validates :code, presence: true, uniqueness: true
      validates :name, presence: true
      validate :metadata_must_be_based_on_metadata_schema, if: -> { product_type.present? }

      delegate(:code, :name, to: :product_type, prefix: true)
      delegate(:code, :name, to: :unit, prefix: true)

      def metadata_must_be_based_on_metadata_schema
        metadata_schema = product_type.metadata_schema
        return unless metadata_schema.present? && metadata.present?

        properties = metadata_schema["properties"]
        fields = properties.keys
        required = metadata_schema["required"]
        diff = metadata.keys - fields
        unless diff.empty?
          errors.add(:metadata, "holds fields that are not allowed #{diff}.")
          return
        end

        diff = required - metadata.keys
        unless diff.empty?
          errors.add(:metadata, "should contain the following required fields #{diff}.")
          return
        end

        metadata.each do |k, v|
          if v.class.to_s.downcase != properties[k]["type"]
            errors.add(:metadata, "contains invalid value for field #{k}.")
          end
          if properties[k].key?("min") && v < properties[k]["min"]
            errors.add(:base, "The value of #{k} cannot be lower than #{properties[k]["min"]}.")
          end
          if properties[k].key?("max") && v > properties[k]["max"]
            errors.add(:base, "The value of #{k} cannot be higher than #{properties[k]["max"]}.")
          end
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
comee_core-0.1.22 app/models/comee/core/product.rb
comee_core-0.1.21 app/models/comee/core/product.rb
comee_core-0.1.20 app/models/comee/core/product.rb
comee_core-0.1.19 app/models/comee/core/product.rb
comee_core-0.1.18 app/models/comee/core/product.rb
comee_core-0.1.17 app/models/comee/core/product.rb
comee_core-0.1.16 app/models/comee/core/product.rb
comee_core-0.1.15 app/models/comee/core/product.rb
comee_core-0.1.14 app/models/comee/core/product.rb
comee_core-0.1.13 app/models/comee/core/product.rb
comee_core-0.1.12 app/models/comee/core/product.rb
comee_core-0.1.11 app/models/comee/core/product.rb
comee_core-0.1.10 app/models/comee/core/product.rb