fluke/devops-service/db/mongo/models/mongo_model.rb

158 lines
4.3 KiB
Ruby
Raw Normal View History

2015-10-22 12:39:22 +03:00
#require "providers/provider_factory"
2015-07-16 17:18:55 +03:00
require "exceptions/invalid_record"
2014-05-08 15:34:26 +04:00
require "json"
2015-07-20 18:59:26 +03:00
require 'db/validators/all'
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
module Devops
module Model
class MongoModel
2014-05-08 15:34:26 +04:00
attr_accessor :created_at
2015-03-06 12:20:30 +03:00
# multi_json sends argument to 'to_json' method
def to_json arg=nil
JSON.pretty_generate self.to_hash
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def to_hash
h = to_hash_without_id
h["id"] = self.id
h
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def to_mongo_hash
h = to_hash_without_id
h["_id"] = self.id
h
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def is_empty? val
val.nil? or val.strip.empty?
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def check_string! val
raise ArgumentError unless val.is_a?(String)
val.strip!
raise ArgumentError if val.empty?
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def check_array! val, type, empty=false
raise ArgumentError unless val.is_a?(Array)
raise ArgumentError if !empty and val.empty?
val.each do |v|
raise ArgumentError unless v.is_a?(type)
end
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def check_name_value val
raise ArgumentError.new "Invalid name, it should contains 0-9, a-z, A-Z, _, - symbols only" if val.match(/^[0-9a-zA-Z_\-]+$/).nil?
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def check_provider provider=self.provider
unless ::Provider::ProviderFactory.providers.include?(provider)
raise InvalidRecord.new "Invalid provider '#{provider}'"
end
end
2014-05-08 15:34:26 +04:00
2015-03-06 12:20:30 +03:00
def validate!
begin
# TODO: we should validate type in request parser
2015-03-06 12:20:30 +03:00
self.validate_fields_types
self.class.validate_model(self)
true
rescue InvalidRecord => e
error_message = self.build_error_message(e.message)
raise InvalidRecord.new(error_message)
end
end
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
def build_error_message(message)
# overrided in descendants
message
end
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
# types - Hash
# key - param name
# value - Hash
# :type - param type
# :empty - can param be empty? (false)
# :nil - can param be nil? (false)
# :value_type - type of array element (String)
# TODO: @deprecated
2015-03-06 12:20:30 +03:00
def self.types types
define_method :validate_fields_types do
t = types.keys
e = types.keys
n = types.keys
types.each do |name, value|
if value[:nil]
n.delete(name)
if self.send(name).nil?
e.delete(name)
t.delete(name)
next
end
else
n.delete(name) unless self.send(name).nil?
end
if self.send(name).is_a? value[:type]
t.delete(name)
self.send(name).strip! if value[:type] == String
if value[:type] == Array
unless value[:value_type] == false
type = value[:value_type] || String
self.send(name).each do |e|
unless e.is_a?(type)
t.push(name)
break
end
end
2014-05-08 15:34:26 +04:00
end
end
2015-03-06 12:20:30 +03:00
e.delete(name) if value[:empty] or !self.send(name).empty?
2014-05-08 15:34:26 +04:00
end
end
2015-03-06 12:20:30 +03:00
raise InvalidRecord.new "Parameter(s) '#{n.join("', '")}' can not be undefined" unless n.empty?
raise InvalidRecord.new "Parameter(s) '#{t.join("', '")}' have invalid type(s)" unless t.empty?
raise InvalidRecord.new "Parameter(s) '#{e.join("', '")}' can not be empty" unless e.empty?
if types.has_key? :provider
self.send("check_provider")
end
true
2014-05-08 15:34:26 +04:00
end
end
2015-03-06 12:20:30 +03:00
@validators = []
class << self
2014-05-08 15:34:26 +04:00
attr_accessor :validators
def inherited(subclass)
subclass.validators = []
subclass.validators += self.validators
2015-03-06 12:20:30 +03:00
end
2015-02-12 13:01:05 +03:00
# all exceptions are handled in @validate! method
def validate_model(model)
validators.each do |validator|
validator.new(model).validate!
end
end
2015-02-12 13:01:05 +03:00
# private class methods
2015-03-06 12:20:30 +03:00
private
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
def set_validators(*validators_to_add)
self.validators += validators_to_add
2015-03-06 12:20:30 +03:00
end
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
def unset_validators(*validators_to_remove)
self.validators -= validators_to_remove
end
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
end
2015-02-12 13:01:05 +03:00
2015-03-06 12:20:30 +03:00
end
2014-05-08 15:34:26 +04:00
end
end