jcraigk/phishin

View on GitHub
app/controllers/map_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class MapController < ApplicationController
  def index
    params[:date_start] ||= '1983-01-01'
    params[:date_stop]  ||= Time.zone.today.to_s
    render_xhr_without_layout
  end

  def search
    init_date_params
    return render json: { success: true, venues: relevant_venues } if all_params_present?
    render json: { success: false, msg: 'No search criteria provided' }
  end

  private

  def all_params_present?
    params[:lat] && params[:lng] && params[:distance]
  end

  def init_date_params
    params[:date_start] ||= Show.published.order(date: :asc).first.date
    params[:date_stop] ||= Show.published.order(date: :desc).first.date
  end

  def relevant_venues
    venues_nearby.each_with_object([]) do |venue, relevant_venues|
      shows = relevant_shows_for(venue)
      next unless shows.any?
      relevant_venues << venue.as_json.merge(shows: shows.map(&:as_json))
    end
  end

  def venues_nearby
    @venues_nearby ||= Venue.near([params[:lat], params[:lng]], params[:distance]).includes(:shows)
  end

  def relevant_shows_for(venue)
    venue.shows.select { |show| shows_in_timeframe(show) }.sort_by(&:date).reverse
  end

  def shows_in_timeframe(show)
    show.date >= Time.zone.parse(params[:date_start]) &&
      show.date <= Time.zone.parse(params[:date_stop])
  rescue ArgumentError
    true
  end
end