class AppController

Public Class Methods

add_activity(user) click to toggle source
# File lib/AppController.rb, line 102
def self.add_activity(user)
    prompt = TTY::Prompt.new
    type = prompt.select("Select Activity: ", %w(run bike swim walk/hike))
begin
    puts "Distance(kms): "
    distance = gets.chomp.to_f
    raise "Invalid Input" if distance == 0.0
rescue RuntimeError
    puts "Please enter a number"
    retry
end
begin
    puts "Duration(mins): "
    duration = gets.chomp.to_i
    raise "Invalid Input" if duration == 0
rescue RuntimeError
    puts "Please enter a number"
    retry
end
begin
    puts "Date: (today or yyyy-mm-dd)"     
    date = gets.chomp
    if date != "today"
        Date.parse(date)
    end
rescue Date::Error
    puts "Invalid date"
    retry
end
    if date.downcase == "today"
        date = Date.today.to_s
    end        
    Model.add_activity(user, type, distance, duration, date)
end
check_completed(user) click to toggle source
# File lib/AppController.rb, line 89
def self.check_completed(user)
    activities = self.get_activities_by_date(user)
    activity = self.select_activity(user, activities)
    activity.completed = true 
    Model.update_activities(user)
end
check_user(user_name) click to toggle source

run at start of program to check if new user either create a file for new user or get activities for returning user

# File lib/AppController.rb, line 12
def self.check_user(user_name)  
    if File.exist?("users/#{user_name}.csv")
        Model.get_activities(user_name) 
        self.menu(user_name)
    else 
        Model.add_user(user_name)
        self.menu(user_name)
    end
end
delete_activity(user) click to toggle source
# File lib/AppController.rb, line 96
def self.delete_activity(user)
    activities = self.get_activities_by_date(user)
    activity = self.select_activity(user, activities)
    Model.delete_activity(user, activity)
end
get_activities_by_date(user) click to toggle source

looks up activities based on user input date returns an array of activities that match date

# File lib/AppController.rb, line 47
def self.get_activities_by_date(user)
    begin
        puts "Activity date: (today or yyyy-mm-dd): "
        date = gets.chomp
        if date == "today"
            date = Date.today.to_s
        else
            # run to test for invalid dates
            Date.parse(date) 
        end
        activities = Model.search_activities(user, date)
    raise "No activities on that date" if activities.length == 0 || is_in_future?(date)
    rescue Date::Error, RuntimeError 
        puts "Invalid date"
        self.menu(user)
    end 
    return activities   
end
get_stats(user) click to toggle source
# File lib/AppController.rb, line 137
def self.get_stats(user)
    prompt = TTY::Prompt.new
    month = prompt.select("Choose an month: ", %w(All January February March April May June July August September October November December))
    prompt = TTY::Prompt.new
    type = prompt.select("Select Activity: ", %w(run bike swim walk/hike))
    totals = Model.calculate_totals(user, type, month)
    records = Model.find_longest(user, type, month)
    Display.display_records(records[0], records[1])
    Display.display_totals(totals[0], totals[1])
end
menu(user) click to toggle source

main menu - run straight after user check

select_activity(user, activities) click to toggle source

takes array of activities and generates a drop down menu used for selecting activities to check completed or to delete returns users chosen activity

# File lib/AppController.rb, line 69
def self.select_activity(user, activities)
    prompt = TTY::Prompt.new
        options = %w(go-back)
        activities.each do |activity|
            options << "#{activity.type}-#{activity.distance}-#{activity.duration}-#{activity.date}"
        end
        selected_activity = prompt.select("Select Activity: ", options)
        if selected_activity == 'go-back'
            self.menu(user)
        end
        
        # iterates over array of activities, converts to string for comparison with user selection
        activities.each do |activity|
            activity_string = "#{activity.type}-#{activity.distance}-#{activity.duration}-#{activity.date}"
            if activity_string == selected_activity
                return activity
            end
        end
end