14484: Adds file count and size callback to the collection model
[arvados.git] / services / api / app / models / collection.rb
index 487043ee3549d8afe915f9abeeaeab2c8f252707..2cebd5438ed1fbfec710de6947cd9516d058a377 100644 (file)
@@ -30,6 +30,7 @@ class Collection < ArvadosModel
   validate :versioning_metadata_updates, on: :update
   validate :past_versions_cannot_be_updated, on: :update
   before_save :set_file_names
+  before_save :set_file_count_and_total_size
   around_update :manage_versioning
 
   api_accessible :user, extend: :common do |t|
@@ -51,6 +52,8 @@ class Collection < ArvadosModel
     t.add :version
     t.add :current_version_uuid
     t.add :preserve_version
+    t.add :file_count
+    t.add :file_size_total
   end
 
   after_initialize do
@@ -195,6 +198,15 @@ class Collection < ArvadosModel
     true
   end
 
+  def set_file_count_and_total_size
+    if self.manifest_text_changed?
+      m = Keep::Manifest.new(self.manifest_text)
+      self.file_size_total = m.files_size
+      self.file_count = m.files_count
+    end
+    true
+  end
+
   def manifest_files
     return '' if !self.manifest_text
 
@@ -262,6 +274,7 @@ class Collection < ArvadosModel
       sync_past_versions if syncable_updates.any?
       if snapshot
         snapshot.attributes = self.syncable_updates
+        snapshot.manifest_text = snapshot.signed_manifest_text
         snapshot.save
       end
     end
@@ -287,7 +300,9 @@ class Collection < ArvadosModel
       # Use a different validation context to skip the 'old_versions_cannot_be_updated'
       # validator, as on this case it is legal to update some fields.
       leave_modified_by_user_alone do
-        c.save(context: :update_old_versions)
+        leave_modified_at_alone do
+          c.save(context: :update_old_versions)
+        end
       end
     end
   end