johnhamelink
11/25/2015 - 1:31 AM

contact_detail.rb

class ContactDetail < ActiveRecord::Base
  belongs_to :session
  before_save :normalize_phone_number
  after_commit :check_for_connections

  def self.find_by_phone_number(phone_number)
    ContactDetail.find_by(key: 'phone_number', value: phone_number)
  end

  def self.find_phone_number_by_session(session)
    session.contact_details.find_by(key: 'phone_number').value rescue nil
  end

  def normalize_phone_number
    return unless self.key == 'phone_number'
    # TODO: This will not work when we turn hashing back on!
    self.value = PhoneNumberHashService.to_hash(self.value)
  end

  def check_for_connections
    return unless self.key == 'phone_number'
    if pn = PhoneNumber.find_by_phone_number(self.value)
      handle_neo4j_connections(pn)
      handle_player_connections(pn)
    end
  end
  private

  def handle_player_connections(rel)
    rel.contact_book_items.each do |cbi|

      # Link up contact book items with real users
      cbi.update_attributes(contact_session: self.session)
      # Link up players with real users
      cbi.players.each do |player|
        player.update_attributes(session: self.session)
      end

    end
  end

  def handle_neo4j_connections(pn)
    pn_n4j = pn.neo4j_record

    if user_n4j = self.session.neo4j_record
      user_n4j.phone_numbers << pn_n4j
      user_n4j.save

      logger.info "Connecting ContactBook Associations with User"
      friends = Neo4jModels::ContactBookItem.where(phone_numbers: pn_n4j)
        .flat_map(&:contact_books)
        .flat_map(&:users)

      user_n4j.contact_book_associations << friends
      user_n4j.save
    else
      logger.warn "Not connecting user to phone_numbers - user isn't in neo4j"
    end
  end

end