Normalize collection hashes provided by clients as attribute values
[arvados.git] / services / api / app / models / arvados_model.rb
index 4f2aa72161ef903f638cb4e62d4996d774c3e415..8ee14b793667f86e44a6fbb311fbee402689a14b 100644 (file)
@@ -14,6 +14,7 @@ class ArvadosModel < ActiveRecord::Base
   before_create :update_modified_by_fields
   before_update :maybe_update_modified_by_fields
   validate :ensure_serialized_attribute_type
+  validate :normalize_collection_uuids
 
   has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'"
 
@@ -157,6 +158,24 @@ class ArvadosModel < ActiveRecord::Base
     end
   end
 
+  def foreign_key_attributes
+    attributes.keys.select { |a| a.match /_uuid$/ }
+  end
+
+  def normalize_collection_uuids
+    foreign_key_attributes.each do |attr|
+      attr_value = send attr
+      if attr_value.is_a? String and
+          attr_value.match /^[0-9a-f]{32,}(\+[@\w]+)*$/
+        begin
+          send "#{attr}=", Collection.normalize_uuid(attr_value)
+        rescue
+          # TODO: abort instead of silently accepting unnormalizable value?
+        end
+      end
+    end
+  end
+
   def self.resource_class_for_uuid(uuid)
     if uuid.is_a? ArvadosModel
       return uuid.class