lib/unread_mongoid/readable.rb in unread-mongoid-0.0.5 vs lib/unread_mongoid/readable.rb in unread-mongoid-0.1.0
- old
+ new
@@ -1,117 +1,41 @@
module UnreadMongoid
module Readable
module ClassMethods
def mark_as_read!(target, options)
- user = options[:for]
- assert_reader(user)
+ reader = options[:for]
+ UnreadMongoid::Reader.assert_reader(reader)
- if target == :all
- reset_read_marks_for_user(user)
- elsif target.is_a?(Array)
- mark_array_as_read(target, user)
- else
- raise ArgumentError
- end
- end
+ readables_to_mark = if(target == :all)
+ self.unread_by(reader)
+ else
+ target
+ end
- def mark_array_as_read(array, user)
- array.each do |obj|
- raise ArgumentError unless obj.is_a?(self)
+ self.unread_by(reader).each do |readable|
+ raise ArgumentError unless readable.is_a? self
- rm = obj.read_marks.where(user_id: user._id).first || obj.read_marks.build(user_id: user._id)
- rm.timestamp = obj.send(readable_options[:on])
- rm.save!
+ readable.mark_as_read! :for => reader
end
end
-
- # A scope with all items accessable for the given user
- # It's used in cleanup_read_marks! to support a filtered cleanup
- # Should be overriden if a user doesn't have access to all items
- # Default: User has access to all items and should read them all
- #
- # Example:
- # def Message.read_scope(user)
- # user.visible_messages
- # end
- def read_scope(user)
- self
- end
-
- def cleanup_read_marks!
- assert_reader_class
-
- ReadMark.reader_class.each do |user|
- if oldest_timestamp = read_scope(user).unread_by(user).sort(readable_options[:on] => :asc).first.send(readable_options[:on])
- # There are unread items, so update the global read_mark for this user to the oldest
- # unread item and delete older read_marks
- update_read_marks_for_user(user, oldest_timestamp)
- else
- # There is no unread item, so deletes all markers and move global timestamp
- reset_read_marks_for_user(user)
- end
- end
- end
-
- def update_read_marks_for_user(user, timestamp)
- # Delete markers OLDER than the given timestamp
- user.read_marks.where(:readable_type => self.name).single.older_than(timestamp).delete_all
-
- # Change the global timestamp for this user
- rm = user.read_mark_global(self) || user.read_marks.build(:readable_type => self.name)
- rm.timestamp = timestamp - 1.second
- rm.save!
- end
-
- def reset_read_marks_for_all
- ReadMark.delete_all :readable_type => self.name
- ReadMark.reader_class.each do |user|
- ReadMark.create!(user_id: user._id, readable_type: self.name, timestamp: Time.current.to_s(:db))
- end
- end
-
- def reset_read_marks_for_user(user)
- assert_reader(user)
-
- ReadMark.delete_all :readable_type => self.name, :user_id => user._id
- ReadMark.create! :readable_type => self.name, :user_id => user._id, :timestamp => Time.now
- end
-
- def assert_reader(user)
- assert_reader_class
-
- unless user.is_a?(ReadMark.reader_class)
- raise ArgumentError, "Class #{user.class.name} is not registered by acts_as_reader!"
- end
-
- unless user._id
- raise ArgumentError, "The given user has no id!"
- end
- end
-
- def assert_reader_class
- raise RuntimeError, 'There is no class using acts_as_reader!' unless ReadMark.reader_class
- end
end
module InstanceMethods
- def unread?(user)
- self.class.unread_by(user).and(_id: self._id).exists?
+ def unread?(reader)
+ UnreadMongoid::Reader.assert_reader(reader)
+
+ ReadMark.where(reader: reader, readable: self).empty?
end
def mark_as_read!(options)
- user = options[:for]
- self.class.assert_reader(user)
+ reader = options[:for]
+ UnreadMongoid::Reader.assert_reader(reader)
- if unread?(user)
- rm = read_mark(user) || read_marks.build(:user_id => user._id)
- rm.timestamp = self.send(readable_options[:on]).to_s(:db)
- rm.save!
- end
+ ReadMark.create(reader: reader, readable: self)
end
- def read_mark(user)
- read_marks.where(:user_id => user._id).first
+ def mark_as_unread!
+ self.read_marks.destroy_all
end
end
end
end