diff --git a/app/models/recent_view.rb b/app/models/recent_view.rb index 6b81e6d6d..d66ea3d80 100644 --- a/app/models/recent_view.rb +++ b/app/models/recent_view.rb @@ -13,24 +13,16 @@ class RecentView < ApplicationModel 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) + RecentView.create(o_id: o_id, + recent_view_object_id: ObjectLookup.by_name(object), + created_by_id: user.id) 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 @@ -41,46 +33,34 @@ class RecentView < ApplicationModel end def self.list(user, limit = 10, object_name = nil) - recent_views = if !object_name - RecentView.select('o_id, recent_view_object_id, created_by_id, MAX(created_at) as created_at, MAX(id) as id') - .group(:o_id, :recent_view_object_id, :created_by_id) - .where(created_by_id: user.id) - .order('MAX(created_at) DESC, MAX(id) DESC') - .limit(limit) - elsif object_name == 'Ticket' - state_ids = Ticket::State.by_category(:viewable_agent_new).pluck(:id) - local_recent_views = RecentView.select('o_id, recent_view_object_id, MAX(created_at) as created_at, MAX(id) as id, created_by_id') - .group(:o_id, :recent_view_object_id, :created_by_id) - .where(created_by_id: user.id, recent_view_object_id: ObjectLookup.by_name(object_name)) - .order('MAX(created_at) DESC, MAX(id) DESC') - .limit(limit + 10) - clear_list = [] - local_recent_views.each do |item| - ticket = Ticket.find_by(id: item.o_id) - next if !ticket - next if !state_ids.include?(ticket.state_id) - clear_list.push item - break if clear_list.count == limit - end - clear_list - else - RecentView.select('o_id, recent_view_object_id, MAX(created_at) as created_at, MAX(id) as id, created_by_id') - .group(:o_id, :recent_view_object_id, :created_by_id) - .where(created_by_id: user.id, recent_view_object_id: ObjectLookup.by_name(object_name)) - .order('MAX(created_at) DESC, MAX(id) DESC') - .limit(limit) - end + recent_views = RecentView.select('o_id, ' \ + 'recent_view_object_id, ' \ + 'created_by_id, ' \ + 'MAX(created_at) as created_at, ' \ + 'MAX(id) as id') + .group(:o_id, :recent_view_object_id, :created_by_id) + .where(created_by_id: user.id) + .order('MAX(created_at) DESC, MAX(id) DESC') + .limit(limit) - list = [] - recent_views.each do |item| - - # access check - next if !access(ObjectLookup.by_id(item['recent_view_object_id']), item['o_id'], user) - - # add to result list - list.push item + if object_name.present? + recent_views = recent_views.where(recent_view_object_id: ObjectLookup.by_name(object_name)) end - list + + # hide merged / removed tickets in Ticket Merge dialog + if object_name == 'Ticket' + recent_views = recent_views.limit(limit * 2) + + viewable_ticket_ids = Ticket.where('id IN (?) AND state_id in (?)', + recent_views.map(&:o_id), + Ticket::State.by_category(:viewable_agent_new).pluck(:id)) + .pluck(:id) + + recent_views = recent_views.select { |rv| viewable_ticket_ids.include?(rv.o_id) } + .first(limit) + end + + recent_views.select { |rv| access(ObjectLookup.by_id(rv.recent_view_object_id), rv.o_id, user) } end def notify_clients @@ -94,19 +74,12 @@ class RecentView < ApplicationModel 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') + object.to_s + .constantize + .try(:lookup, { id: o_id }) + .try(:access?, user, 'read') + rescue NameError + false end =begin