Skip to content

Commit

Permalink
Merge pull request #4 from manyfold3d/destroy
Browse files Browse the repository at this point in the history
Make sure relations are cleaned up after objects or subjects are destroyed
  • Loading branch information
Floppy authored Aug 29, 2024
2 parents b872a1d + dd0fa7b commit 8a4fccb
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 8 deletions.
3 changes: 1 addition & 2 deletions app/models/concerns/caber/object.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Caber::Object
extend ActiveSupport::Concern

included do
has_many :caber_relations, as: :object, class_name: "Caber::Relation"
has_many :caber_relations, as: :object, class_name: "Caber::Relation", dependent: :destroy
scope :with_permission, ->(permission) { where("caber_relations.permission": permission) }

def self.can_grant_permissions_to(model)
Expand All @@ -25,5 +25,4 @@ def revoke_permission(permission, subject)
def revoke_all_permissions(subject)
Caber::Relation.where(object: self, subject: subject).destroy_all
end

end
2 changes: 1 addition & 1 deletion app/models/concerns/caber/subject.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Caber::Subject
extend ActiveSupport::Concern

included do
has_many :caber_relations, as: :subject, class_name: "Caber::Relation"
has_many :caber_relations, as: :subject, class_name: "Caber::Relation", dependent: :destroy
scope :with_permission, ->(permission) { where("caber_relations.permission": permission) }

def self.can_have_permissions_on(model)
Expand Down
22 changes: 17 additions & 5 deletions spec/models/caber/relation_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,27 @@
end

it "removes a specific permission" do
expect{object.revoke_permission("viewer", alice)}.
to change { alice.has_permission_on?("viewer", object) }.from(true).to(false)
expect { object.revoke_permission("viewer", alice) }
.to change { alice.has_permission_on?("viewer", object) }.from(true).to(false)
end

it "removes all permissions" do
expect{object.revoke_all_permissions(alice)}.
to change { alice.has_permission_on?("viewer", object) }.from(true).to(false)
expect { object.revoke_all_permissions(alice) }
.to change { alice.has_permission_on?("viewer", object) }.from(true).to(false)
end

end

context "removing permissions on object/subject removal" do
before do
object.grant_permission_to "viewer", alice
end

it "removes permission when subject is removed" do
expect { alice.destroy }.to change { Caber::Relation.count }.by(-1)
end

it "removes permission when object is removed" do
expect { object.destroy }.to change { Caber::Relation.count }.by(-1)
end
end
end

0 comments on commit 8a4fccb

Please sign in to comment.