diff --git a/app/models/collection_item.rb b/app/models/collection_item.rb index 4fc48636bdb07fefc3468a79dc6dce01bafcb704..1a73aaed0001b832a727cc81d98110053ffd7b20 100644 --- a/app/models/collection_item.rb +++ b/app/models/collection_item.rb @@ -25,6 +25,14 @@ class CollectionItem < ApplicationRecord collection end + def public? + collectionable.privacy == 'public' + end + + def owner?(candidate) + collectionable.owner == candidate + end + def thumbnail collectionable_type == 'LearningObject' ? LearningObject.find(collectionable_id).default_thumbnail : Collection.find(collectionable_id).thumbnail end diff --git a/app/policies/collection_policy.rb b/app/policies/collection_policy.rb index 7ca595c7cd867bdbaf48d7f9c858c140a0fe1a21..b39a280f49d2ced6d8ecca66b31597661d2c42d5 100644 --- a/app/policies/collection_policy.rb +++ b/app/policies/collection_policy.rb @@ -7,8 +7,12 @@ class CollectionPolicy < ApplicationPolicy class Scope < Scope def resolve - if !user.nil? && user.is_admin? - scope.all + if !user.nil? + if user.is_admin? + scope.all + else + scope.includes(:collection_items).where.not(:collection_items => {:collection_id => nil}).where("privacy = ? OR owner_id = ?", 'public', user.id) + end else scope.includes(:collection_items).where.not(:collection_items => {:collection_id => nil}).where(privacy: 'public') end diff --git a/app/serializers/collection_item_serializer.rb b/app/serializers/collection_item_serializer.rb index e085d36a8ac68a814ded456d5fa347827b08cabc..60c59d539e02a9b728b34dfea947c9e46a819aa8 100644 --- a/app/serializers/collection_item_serializer.rb +++ b/app/serializers/collection_item_serializer.rb @@ -1,9 +1,18 @@ class CollectionItemSerializer < ActiveModel::Serializer cache key: 'collection_item', expires_in: 24.hours + def collectionable - serializer = object.collectionable_type == "LearningObject" ? ::LearningObjectSerializer : ::CollectionMinSerializer - serializer.new(object.collectionable, {scope: current_user, scope_name: :current_user}).serializable_hash + if ( object.collectionable_type == "LearningObject" ) + serializer = ::LearningObjectSerializer + elsif ( object.public? || (current_user && ( object.owner?(current_user) || current_user.is_admin? )) ) + serializer = ::CollectionMinSerializer + end + + if ( !serializer.blank? ) + serializer.new(object.collectionable, {scope: current_user, scope_name: :current_user}).serializable_hash + end end + belongs_to :collectionable, polymorphic: true attributes :id, :position, :collectionable, :collectionable_type end