hackedteam/rcs-db

View on GitHub
lib/rcs-db/db_objects/watched_item.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'mongoid'
require 'rcs-common/trace'

class WatchedItem
  extend RCS::Tracer
  include Mongoid::Document

  field :iid, as: :item_id, type: Moped::BSON::ObjectId
  field :uids, as: :user_ids, type: Array, default: []

  index iid: 1

  def self.rebuild
    delete_all
    documents = {}

    User.online.only(:dashboard_ids).each do |user|
      user.dashboard_ids.each do |item_id|
        documents[item_id] ||= []
        documents[item_id] << user.id unless documents[item_id].include?(user.id)
      end
    end

    documents.each { |item_id, user_ids| create!(item_id: item_id, user_ids: user_ids) }
  end

  def self.matching(*items)
    items2id = items.inject({}) do |h, item|
      h[item.id] = item if item.respond_to?(:id)
      h
    end

    self.in(item_id: items2id.keys).each do |dw|
      item = items2id[dw.item_id]

      if item._kind == 'operation'
        # if match the operation, send the stats target of the current sync, not the operation stats.
        items.select { |i| i._kind == 'target' && i.path[0] == item.id }.each { |i| yield(i, dw.user_ids) }
      else
        yield(item, dw.user_ids)
      end
    end
  end
end