123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
- class RecentView < ApplicationModel
- belongs_to :object_lookup, class_name: 'ObjectLookup'
- belongs_to :ticket, class_name: 'Ticket', foreign_key: 'o_id'
- after_create :notify_clients
- after_update :notify_clients
- after_destroy :notify_clients
- def self.log(object, o_id, user)
- # access check
- return if !access(object, o_id, user)
- # lookups
- object_lookup_id = ObjectLookup.by_name(object)
- # create entry
- record = {
- o_id: o_id,
- recent_view_object_id: object_lookup_id.to_i,
- created_by_id: user.id,
- }
- RecentView.create(record)
- end
- def self.log_destroy(requested_object, requested_object_id)
- return if requested_object == 'RecentView'
- RecentView.where(recent_view_object_id: ObjectLookup.by_name(requested_object))
- .where(o_id: requested_object_id)
- .destroy_all
- end
- def self.user_log_destroy(user)
- RecentView.where(created_by_id: user.id).destroy_all
- end
- def self.list(user, limit = 10, type = nil)
- recent_views = if !type
- RecentView.select('o_id, recent_view_object_id, MAX(created_at) as created_at, MAX(id) as id')
- .group(:o_id, :recent_view_object_id)
- .where(created_by_id: user.id)
- .limit(limit)
- elsif type == 'Ticket'
- state_ids = Ticket::State.by_category(:viewable_agent_new).pluck(:id)
- RecentView.joins(:ticket)
- .select('recent_views.o_id as o_id, recent_views.recent_view_object_id as recent_view_object_id, MAX(recent_views.created_at) as created_at, MAX(recent_views.id) as id')
- .group(:o_id, :recent_view_object_id)
- .where('recent_views.created_by_id = ? AND recent_views.recent_view_object_id = ? AND tickets.state_id IN (?)', user.id, ObjectLookup.by_name('Ticket'), state_ids )
- .limit(limit)
- else
- RecentView.select('o_id, recent_view_object_id, MAX(created_at) as created_at, MAX(id) as id')
- .group(:o_id, :recent_view_object_id)
- .where(created_by_id: user.id, recent_view_object_id: ObjectLookup.by_name(type))
- .limit(limit)
- end
- list = []
- recent_views.each do |item|
- data = item.attributes
- data['object'] = ObjectLookup.by_id(data['recent_view_object_id'])
- data.delete('recent_view_object_id')
- # access check
- next if !access(data['object'], data['o_id'], user)
- # add to result list
- list.push data
- end
- list
- end
- def self.list_full(user, limit = 10)
- recent_viewed = list(user, limit)
- # get related object
- assets = ApplicationModel.assets_of_object_list(recent_viewed)
- {
- stream: recent_viewed,
- assets: assets,
- }
- end
- def notify_clients
- Sessions.send_to(
- created_by_id,
- {
- event: 'RecentView::changed',
- data: {}
- }
- )
- end
- def self.access(object, o_id, user)
- # check if object exists
- begin
- return if !Kernel.const_get(object)
- record = Kernel.const_get(object).lookup(id: o_id)
- return if !record
- rescue
- return
- end
- # check permission
- return if !record.respond_to?(:access?)
- record.access?(user, 'read')
- end
- =begin
- cleanup old entries
- RecentView.cleanup
- optional you can put the max oldest entries as argument
- RecentView.cleanup(1.month)
- =end
- def self.cleanup(diff = 1.month)
- RecentView.where('created_at < ?', Time.zone.now - diff).delete_all
- true
- end
- end
|