class LearningObject include ActiveModel::Model include RepositoriesProxy attr_accessor :id, :id_dspace, :rid, :name, :author, :description, :published_at, :thumbnail, :created_at, :last_modified, :type, :grade_level, :bitstreams, :metadata, :likes, :views, :downloads, :subjects, :attributes, :score, :publisher validates_presence_of :name, :created_at, :type, :likes, :views, :downloads validates_numericality_of :likes, greater_than_or_equal_to: 0 validates_numericality_of :views, greater_than_or_equal_to: 0 validates_numericality_of :downloads, greater_than_or_equal_to: 0 def initialize(params={}) super(params.merge(defaults)) end def collections collection_repository.find_by_learning_object self end def publisher @publisher ||= learning_object_repository.get_publisher(self) end def subjects @subjects ||= learning_object_repository.get_subjects(self) end def attributes @attributes ||= learning_object_repository.get_attributes(self) end def categories get_metadata_value_of 'dc.subject.category' end ## social actions def like(user) learning_object_repository.like user, self end def liked?(user) learning_object_repository.liked? user, self end def dislike(user) learning_object_repository.dislike user, self end ## end social actions def get_metadata_value_of key get_metadata_values_of(key).first end def get_metadata_values_of key values = [] @metadata.each do |m| m = m.with_indifferent_access values << m["value"] if m["key"] == key end values end #TODO: move for Bitstream model def get_bitstream_retrievelink_of name values = @bitstreams.select { |v| v["bundleName"] == name } unless values.empty? return Dspace::Config.rest_url + values.first["retrieveLink"] end end #TODO: move for Bitstream model def get_bitstream_filename_of name values = @bitstreams.select { |v| v["bundleName"] == name } unless values.empty? return values.first["name"] end end #TODO: move for Bitstream model def get_retrievelink get_bitstream_retrievelink_of "ORIGINAL" end #TODO: move for Bitstream model def get_filename get_bitstream_filename_of "ORIGINAL" end def update_dynamic_fields self.likes = learning_object_repository.count_likes(self) self.views = learning_object_repository.count_views(self) self end private def defaults { likes: 0, views: 0, downloads: 0, score: 0 # Setting this default value wont allow created_at to be set trough the constructor # created_at: DateTime.new } end end