lawrencechanyewlong/wherewolfpro

View on GitHub
app/controllers/event_controller.rb

Summary

Maintainability
D
2 days
Test Coverage
class EventController < ApplicationController
  attr_accessor :latlng
  attr_accessor :formatted_address
  #attr_accessor :latitud
  #attr_accessor :longitud
  skip_before_action :verify_authenticity_token
  require 'gmail'
  def event_params
    params.require(:event).permit(:address_lat, :address_lng, :receiver, :duration_setting, :uid, :message)
  end

  def select_contacts
    user = User.where(:id => session[:id]).take
    if user
      @receiver_all = []
      @receiver_name_all = []
      user.contacts.each do |c|
        @receiver_name_all << c[0]
        @receiver_all << c[1]
      end
      # @receiver_all = user.contacts 
      if params['email']
        if params['email'].length == 0 or params['name'].length == 0
          flash['notice'] = 'Invalid'
          return
        else
          flash['notice'] = 'user created'
        end
        if @receiver_all
          @receiver_all = [params['email']] + @receiver_all
        else
          @receiver_all = [params['email']]
        end
        if @receiver_name_all
          @receiver_name_all = [params['name']] + @receiver_name_all
        else
          @receiver_name_all = [params['name']]
        end
        user.contacts = @receiver_all
        user.save!
      end
    else
      @receiver_all = session[:receiver_all]
      @receiver_name_all = session[:receiver_name_all]
      if params['email'] and params['name']
        if params['email'].length == 0 or params['name'].length == 0
          flash['notice'] = 'Invalid'
          return
        else
          flash['notice'] = 'user created'
          if @receiver_all
            @receiver_all = [params['email']] + @receiver_all
          else
            @receiver_all = [params['email']]
          end
          if @receiver_name_all
            @receiver_name_all = [params['name']] + @receiver_name_all
          else
            @receiver_name_all = [params['name']]
          end
          logger.debug @receiver_all
          session[:receiver_all] = @receiver_all
          session[:receiver_name_all] = @receiver_name_all
        end
      end
    end
  end

  def store_contacts
    logger.debug "In store_contacts"
    logger.debug params.inspect
    puts "HELLO"
    @receiver = ''
    @receiver_name = ''
    params.each do |k, v|
      if k =~ /^info_.*$/
        @temp = v.split(', ')
        @receiver_name += @temp[0] + ', '
        @receiver += @temp[1] + ', '
      end
    end
    if @receiver.length > 0 and @receiver_name.length > 0
      session[:receiver] = @receiver[0..-3]
      session[:receiver_name] = @receiver_name[0..-3]
    else
      return redirect_to event_select_contacts_path
    end
    # if params[:receiver_name] and params[:receiver]
    #   session[:receiver] = params[:receiver]
    #   session[:receiver_name] = params[:receiver_name]
    # end
    logger.debug "receiver: #{session[:receiver]}"
    # render text: "<script>window.location = '#{event_select_duration_path}';</script>", status: 200
    redirect_to '/event/select_duration'
  end
  
  def geocoding
    respond_to do |format|               
      format.js
    end
  end

  def select_destination
    @address_lat_init = 37.7749
    @address_lng_init = -122.4194
    @address_lat = 37.7749
    @address_lng = -122.4194
    if session[:address_lat] and session[:address_lng]
      @address_lat = session[:address_lat]
      @address_lng = session[:address_lng]
      @address_lat_init = @address_lat
      @address_lng_init = @address_lng
    end
  end
  
  def store_destination
    logger.debug "In store_destination"
    # @latlng = {lat: params[:lat], long: params[:long]}
    # @formatted_address = params[:formatted_address]
    
    session[:address_lat] = params[:lat]
    session[:address_lng] = params[:long]
    session[:address_string] = params[:formatted_address]
    
    # logger.debug "latlng: #{session[:latlng]}"
    # logger.debug "formatted_address: #{session[:formatted_address]}"
    
    render text: "<script>window.location = '#{event_select_contacts_path}';</script>", status: 200
  end

  def select_duration
    @duration = session[:duration_setting]
  end
  
  def store_duration
    logger.debug params.inspect
    if params[:arrive]
      @duration = 'arrive'
    elsif params[:until_this_time] != '0'
      if params[:am]
        @duration = "#{params[:until_this_time]} am"
      elsif params[:pm]
        @duration = "#{params[:until_this_time]} pm"
      else
        @duration = nil
      end
    elsif params[:for_this_many_hours] != '0'
      @duration = "#{params[:for_this_many_hours]} hours"
    else
      logger.debug "Something is wrong"
      @duration = nil
    end
    if @duration
      session[:duration_setting] = @duration
      logger.debug "duration"
      redirect_to event_message_path
      # render text: "<script>window.location = '#{event_message_path}';</script>", status: 200
    else
      redirect_to event_select_duration_path
      # render text: "<script>window.location = '#{event_select_duration_path}';</script>", status: 400
    end
  end

  def summary
    
    def parseDuration(d)
      if d
        if d == 'arrive'
          return 'Until I arrive'
        elsif d[d.size-1] == 'm'
          return 'Until '+d
        elsif d[d.size-1] == 's' or d[d.size-1] == 'r'
          return 'For '+d
        else
          return nil
        end
      else
        return nil
      end
    end
    logger.debug "receiver: #{session[:receiver]}"
    @address_string = session[:address_string]
    @address_lat = session[:address_lat]
    @address_lng = session[:address_lng]
    if @address_lat == "37.7749" and @address_lat == "-122.4194"
      @address_lat = "-"
      @address_lng = "-"
    end
    logger.debug session[:receiver_name].is_a?(String)
    @receiver_name = if session[:receiver_name].is_a?(String) then [session[:receiver_name]] else session[:receiver_name] end
    @receiver = if session[:receiver].is_a?(String) then [session[:receiver]] else session[:receiver] end
    @duration = parseDuration(session[:duration_setting])
    @message = session[:message]
  end


  def message
    @messagehistory = []
    Event.all.each do |e|
      if not e.message.to_s.empty?
        logger.debug "message: #{e.message}"
        @messagehistory << e
      end
    end
    @messagehistory = @messagehistory.uniq { |p| p.message }
    @messagehistory.sort!{ |x,y| y[:created_at] <=> x[:created_at] }
    if session[:message]
      @message = session[:message]
    else
      @message = nil
    end
  end
 
  def store_message
    logger.debug params.inspect
    if params[:message]
      session[:message] = params[:message]
    else
      session[:message] = ""
    end
    logger.debug session[:message]
    redirect_to '/event/summary'
    # render text: "<script>window.location = '#{event_summary_path}';</script>", status: 200
  end
  
  def user_map
    
    def parseDurationToCheckCondition(d)
      # return true if condition is met and stop tracking, else return false if keep tracking
      if d == 'arrive'
        # print "\n Inside d=='arrive' \n"
        # print @event.current_lat, @event.current_lng
        # check if location matches destination within a radius of about 50 metres
        current_distance = Geocoder::Calculations.distance_between([@event.current_lat,@event.current_lng], [@event.address_lat,@event.address_lng])
        print current_distance
        stop_dist = 50/1600.0
        return current_distance < stop_dist
      elsif d[d.size-1] == 'm'
        #check the time each time he posts
        #not allowed to start at the exact same hour and minute as the end time
        hour = params[:hour].to_i
        minutes = params[:minutes].to_i
        if d[d.size-2] == 'p'
          # reach hour is set to the saved hour plus 12
          reachHour = (d.slice(0,d.size-3)).to_i + 12
        else
          # reach hour is set to the saved hour
          reachHour = (d.slice(0,d.size-3)).to_i
        end
        return (hour == reachHour and minutes == 0)
      elsif d[d.size-1] == 's'
        #check condition for this many hours
        num_hours = d[0, d.size-6].to_i
        return (@event.created_at.to_time + num_hours.hours) < Time.now
      else
        return nil
      end
    end
    
    id = params[:id]
    # print "event exists: ", Event.exists?(id: id)
    if Event.exists?(id: id)
      @event = Event.find(id)
      if @event.active == true
        #@latlong = {lat: params[:latitude], lng: params[:longitude]}
        #logger.debug "latlong = #{@latlong}"
        #session[:latlong] = @latlong
        #logger.debug "latlong = #{session[:latlong]}"
        #logger.debug "lat = #{$latitud}"
        #logger.debug "lat = #{params[:latitude]}"
        logger.debug "lat = #{params}"
        # check condition for turning active off
        # print "\n@event.current_lat is : ", @event.current_lat, "\n"
        @event.current_lat = params[:latitude] || @event.current_lat
        @event.current_lng = params[:longitude] || @event.current_lng
        @event.save!
        logger.debug "lat = #{@event.current_lat}"
        logger.debug "lng = #{@event.current_lng}"
        # condition = @event.duration_setting
        stop = parseDurationToCheckCondition(@event.duration_setting)
        if stop
          print "stop"
          @event.active = false
          @event.save!
          render :js => "window.location = '/'" 
        else
          print "continue"
        end
      else
        redirect_to '/'
      end
    else
      redirect_to '/'
    end

    
  end
  
  def send_mail
    gmail = Gmail.new('woofwhere', 'battle431101')
    if session[:id]
      user = User.find_by id: session[:id]
      if user
        name = user.name
      else
        name = ""
      end
    else
      name = "an unspecified user"
    end 
    if name == nil
      name = "unspecified user"
    end
    message = session[:message]
    url = session['url']
    # redirect_to url
    if session[:receiver]
      if session[:receiver].is_a?(String)
        receiver = session[:receiver]
        gmail.deliver do
          to receiver
          subject "Welcome to wherewoof" 
          text_part do
            body "Wherewoof is forwarding a message from " + name +  ".The message is " + message + " Track " + receiver + " at " + url + "!"
          end
        end
        return
      end
      session[:receiver].each do |messenger|
        receiver = messenger
        gmail.deliver do
          to messenger
          subject "Welcome to wherewoof " + message
          text_part do
            body "Wherewoof is forwarding a message from " + name +  ".The message is " + message + " Track " + receiver + " at " + url + "!"
          end
        end
      end
    end
  end
  
  def receiver_map
    #@sess = session[:latlong]
    #logger.debug "sess = #{session[:latlong]}"
    id = params[:id]
    if Event.exists?(id: id)
      @event = Event.find(id)
      if @event.active == true
        @lati = @event.current_lat
        @longi = @event.current_lng
        
        return {lat: @lati, lng: @longi}
        logger.debug "lat = #{@lati}"
        logger.debug "lng = #{@longi}"
    #logger.debug "lati = #{@lati}"
    #@longi = $longitud
    #logger.debug "longi = #{@longi}"
      end
    end
  end
  
  def latlng
    id = params[:id]
    if Event.exists?(id: id)
      @event = Event.find(id)
      # if @event.active == true
      @lati = @event.current_lat
      @longi = @event.current_lng
    
      logger.debug "lat = #{@lati}"
      logger.debug "lng = #{@longi}"
      @data = {:lat => @lati, :lng => @longi}
      render json: @data
      # end
    end
  end

  def store_event
    if params[:eid]
      @eid = params[:eid]
      @event = Event.where(id: @eid.to_i).first
      logger.debug "event: #{@event.inspect}"
      session[:receiver_name] = @event[:receiver_name]
      session[:receiver] = @event[:receiver]
      session[:address_string] = @event[:address_string]
      session[:duration_setting] = @event[:duration_setting]
      session[:message] = @event[:message]
      # # @datetime_sent = @event[:datetime_sent]

      # # session[:receiver_name] = @receiver_name
      # session[:info] = @receiver
      # session[:formatted_address] = @formatted_address
      # session[:duration] = @duration_setting
      # # session[:datetime_sent] = @datetime_sent
      # session[:message] = ""

      logger.debug "session[:info]: #{session[:info]}"
      logger.debug "session[:formatted_address]: #{session[:formatted_address]}"
      logger.debug "session[:duration]: #{session[:duration]}"
      redirect_to event_summary_path
      # render text: "<script>window.location = '#{event_summary_path}';</script>", status: 200
    end

  end
  
  def create_event
    @event = Event.create!(
        :uid => session[:uid],
        :address_lat => session[:address_lat],
        :address_lng => session[:address_lng],
        :receiver => session[:receiver],
        :datetime_sent => session[:datetime_sent],
        :duration_setting => session[:duration_setting],
        :active => true,
        :address_string => session[:address_string],
        :receiver_name => session[:receiver_name],
        :message => session[:message],
        #:current_lat => session[:current_lat],
        #:current_lng => session[:current_lng]
      )
      
    session['url'] = "http://wherewoof.herokuapp.com/event/receiver_map/" + @event.id.to_s
    send_mail
    redirect_to controller: 'event', action: 'user_map', id: @event.id
  end

end