1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- require 'json_serialized_field'
- class Event < ActiveRecord::Base
- include JSONSerializedField
- include LiquidDroppable
- attr_accessible :lat, :lng, :payload, :user_id, :user, :expires_at
- acts_as_mappable
- json_serialize :payload
- belongs_to :user
- belongs_to :agent, :counter_cache => true, :touch => :last_event_at
- has_many :agent_logs_as_inbound_event, :class_name => "AgentLog", :foreign_key => :inbound_event_id, :dependent => :nullify
- has_many :agent_logs_as_outbound_event, :class_name => "AgentLog", :foreign_key => :outbound_event_id, :dependent => :nullify
- scope :recent, lambda { |timespan = 12.hours.ago|
- where("events.created_at > ?", timespan)
- }
- scope :expired, lambda {
- where("expires_at IS NOT NULL AND expires_at < ?", Time.now)
- }
- after_create :possibly_propagate
-
- def reemit!
- agent.create_event :payload => payload, :lat => lat, :lng => lng
- end
-
-
- def self.cleanup_expired!
- affected_agents = Event.expired.group("agent_id").pluck(:agent_id)
- Event.expired.delete_all
- Agent.where(:id => affected_agents).update_all "events_count = (select count(*) from events where agent_id = agents.id)"
- end
- protected
- def possibly_propagate
-
- propagate_ids = agent.receivers.where(:propagate_immediately => true).pluck(:id)
- Agent.receive!(:only_receivers => propagate_ids) unless propagate_ids.empty?
- end
- end
- class EventDrop
- def initialize(object)
- @payload = object.payload
- super
- end
- def before_method(key)
- @payload[key]
- end
- def each(&block)
- @payload.each(&block)
- end
- def agent
- @payload.fetch(__method__) {
- @object.agent
- }
- end
- def created_at
- @payload.fetch(__method__) {
- @object.created_at
- }
- end
- end
|