mingujo/UCBerkeley_Housing

View on GitHub
app/controllers/events_controller.rb

Summary

Maintainability
C
1 day
Test Coverage
include EventsHelper
include SessionsHelper
require_relative '../helpers/fetch_sheets.rb'

# NO COVs here should not be called!!! Those are actual API calls
class EventsController < ApplicationController
  before_action :require_login
  skip_before_filter :verify_authenticity_token
  
  @@THIRTY_MIN = 1800
    
  def new
    @event = Event.new(:end_time => 30.minutes.from_now, :period => "Does not repeat")
    @ca = Ca.find(params[:ca_id])
    render :json => {:form => render_to_string(:partial => 'form')}
  end
  
  def create
    if params[:event][:period] == "Does not repeat"
      event = Event.new(event_params)
    else
      event = EventSeries.new(event_params)
    end
    starttime = event.start_time
    if starttime >= event.end_time
      render :text => "Please input valid start and end time.", :status => 422
      return
    end
    while event.end_time - starttime > 0
      if event.class == Event
        curr_event = Event.new(:start_time => starttime,
                               :end_time => starttime + @@THIRTY_MIN,
                               :ca_id => event[:ca_id])
      else
        curr_event = EventSeries.new(:start_time => starttime,
                               :end_time => starttime + @@THIRTY_MIN,
                               :ca_id => event[:ca_id],
                               :period => event[:period],
                               :frequency => event[:frequency])
      end
      if curr_event.class == Event and curr_event.save
        Timeslot.create!(:starttime => starttime,
                         :endtime => starttime + @@THIRTY_MIN,
                         :ca_id => event[:ca_id])
        starttime += @@THIRTY_MIN
      elsif curr_event.class == EventSeries and curr_event.save
        starttime += @@THIRTY_MIN
      else
        render :text => "The timeslot already exists. Please try again.", :status => 422
        return
      end
    end
    render :nothing => true
  end
  
  def index
  end
  
  def get_events
    @events = Event.where(["start_time >= '#{Time.at(params['start'].to_i).to_formatted_s(:db)}' and end_time <= '#{Time.at(params['end'].to_i).to_formatted_s(:db)}'"] )
    events = make_event_json(@events)
    render :text => events.to_json
  end
  
  
  def move
    @event = Event.find_by_id(params[:id])
    ts = Timeslot.where(:ca_id => @event.ca_id, :starttime => @event.start_time).first
    if @event and ts
      @event.start_time = (params[:minute_delta].to_i).minutes.from_now((params[:day_delta].to_i).days.from_now(@event.start_time))
      @event.end_time = (params[:minute_delta].to_i).minutes.from_now((params[:day_delta].to_i).days.from_now(@event.end_time))
      ts.starttime = @event.start_time
      ts.endtime = @event.end_time
      @event.save
      ts.save
    end
    render :nothing => true
  end
  
  def edit
    @event = Event.find_by_id(params[:id])
    render :json => { :form => render_to_string(:partial => 'edit_form') } 
  end
  
  def update
    @event = Event.find_by_id(params[:id])
    ts = Timeslot.find_by_starttime_and_ca_id(@event.start_time, @event.ca_id)
    @event.attributes = event_params
    if @event.attributes["end_time"] - @event.attributes["start_time"] != @@THIRTY_MIN
      render :text => "Please input valid start and end time. \nThe duration should be 30 minutes", :status => 422
      return
    end
    if params[:event][:commit_button] == "Update All Occurrence"
      events = Event.where(:event_series_id => @event.event_series_id)
      for event in events
        ts = Timeslot.find_by_starttime_and_ca_id(event.start_time, event.ca_id)
        if ENV["TESTING_ENV"] == "false"
          # :nocov:
          remove_name_from_spreadsheet(ts)
          # :nocov:
        end
        st = parse_day_and_time(ts.starttime, @event.start_time)
        et = parse_day_and_time(ts.starttime, @event.end_time)
        Timeslot.update(ts[:id], :starttime => st, :endtime => et)
        if ENV["TESTING_ENV"] == "false"
          # :nocov:
          write_to_spreadsheet(Timeslot.find(ts[:id]))
          # :nocov:
        end
        event.start_time = parse_day_and_time(event.start_time, @event.start_time)
        event.end_time = parse_day_and_time(event.end_time, @event.end_time)
        event.save
      end
      render :nothing => true 
      return
    end
    if ENV["TESTING_ENV"] == "false"
      # :nocov:
      remove_name_from_spreadsheet(ts)
      # :nocov:
    end
    st = @event.start_time
    et = @event.end_time
        Timeslot.update(ts[:id], :starttime => st, :endtime => et)
        if ENV["TESTING_ENV"] == "false"
          # :nocov:
            write_to_spreadsheet(Timeslot.find(ts[:id]))
            # :nocov:
        end
    @event.save
    render :nothing => true    
  end  
  
  def destroy
    @event = Event.find_by_id(params[:id])
    if params[:delete_all] == "true"
      events = Event.where(:event_series_id => @event.event_series_id)
      for event in events
        if Timeslot.find_by_starttime_and_ca_id(event.start_time, event.ca_id)
          ts_id = Timeslot.find_by_starttime_and_ca_id(event.start_time, event.ca_id)[:id]
          if ENV["TESTING_ENV"] == "false"
            # :nocov:
            remove_name_from_spreadsheet(Timeslot.find(ts_id))
            # :nocov:
          end
          Timeslot.delete(ts_id)
        end
        event.destroy
      end
      @event.event_series.destroy
    else
      @event.destroy
      if Timeslot.find_by_starttime_and_ca_id(@event.start_time, @event.ca_id)
        ts_id = Timeslot.find_by_starttime_and_ca_id(@event.start_time, @event.ca_id)[:id]
        if ENV["TESTING_ENV"] == "false"
          # :nocov:
                remove_name_from_spreadsheet(Timeslot.find(ts_id))
                # :nocov:
        end
        Timeslot.delete(ts_id)
      end
    end
    render :nothing => true   
  end

  private
    def event_params
      params.require(:event).permit('start_time(1i)', 'start_time(2i)', 'start_time(3i)', 'start_time(4i)', 'start_time(5i)', 'end_time(1i)', 'end_time(2i)', 'end_time(3i)', 'end_time(4i)', 'end_time(5i)', 'period', 'frequency', 'commit_button', 'ca_id')
    end
    
    def parse_day_and_time(day, time)
      Time.parse(day.time.to_s[0,10] + " " + time.to_s[11,15])
    end
  
end