2762: When deleting an object, delete permissions and fail if other
[arvados.git] / services / api / app / models / arvados_model.rb
index 006eb90e12fd550e2110906a1b1c42cc64e291e8..4faa0d041ffa28d3497a085d01285ab8ca6906df 100644 (file)
@@ -14,7 +14,6 @@ class ArvadosModel < ActiveRecord::Base
   before_save :ensure_ownership_path_leads_to_user
   before_destroy :ensure_owner_uuid_is_permitted
   before_destroy :ensure_permission_to_destroy
-
   before_create :update_modified_by_fields
   before_update :maybe_update_modified_by_fields
   after_create :log_create
@@ -27,7 +26,7 @@ class ArvadosModel < ActiveRecord::Base
   # Note: This only returns permission links. It does not account for
   # permissions obtained via user.is_admin or
   # user.uuid==object.owner_uuid.
-  has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'"
+  has_many :permissions, :foreign_key => :head_uuid, :class_name => 'Link', :primary_key => :uuid, :conditions => "link_class = 'permission'", dependent: :destroy
 
   class PermissionDeniedError < StandardError
     def http_status
@@ -237,6 +236,11 @@ class ArvadosModel < ActiveRecord::Base
     return true
   end
 
+  def destroy_permission_links
+    Link.destroy_all(['link_class=? and (head_uuid=? or tail_uuid=?)',
+                      'permission', uuid, uuid])
+  end
+
   def ensure_permission_to_destroy
     raise PermissionDeniedError unless permission_to_destroy
   end