master
 1class WorkoutsController < ApplicationController
 2  before_action { @search_path = workouts_path }
 3
 4  def index
 5    @ranges = [5.years, 1.year, 6.months, 3.months, 1.month, 2.weeks, 1.week].reverse
 6    @exercise = Exercise.find_by(id: params[:exercise])
 7    @primary_exercises = Exercise.primary.order_by_name.to_a
 8    @workouts = recent_workouts(@exercise)
 9  end
10
11  def calendar
12    respond_to do |format|
13      format.html
14      format.json do
15        workouts = current_user.workouts.recent.before(params[:end]).after(params[:start]).includes(:routine)
16        results = workouts.map do |workout|
17          {
18            title: workout.routine.name,
19            start: workout.occurred_at.strftime("%Y-%m-%d")
20          }
21        end
22        render json: results.to_json
23      end
24    end
25  end
26
27  def new
28    @routine = find_routine(params[:routine_id])
29    @all_routines = current_program.routines - [@routine]
30    @workout = current_user.next_workout_for(@routine)
31  end
32
33  def create
34    workout = current_user.workouts.build(secure_params)
35    workout.occurred_at = DateTime.now
36    workout.save!
37    redirect_to edit_workout_path(workout)
38  end
39
40  def edit
41    @workout = current_user.workouts.find(params[:id])
42    gon.workout = @workout.to_hash
43  end
44
45  private
46
47  def secure_params
48    params.require(:workout).permit(
49      :routine_id,
50      :body_weight,
51      exercise_sets_attributes: [
52        :exercise_id,
53        :target_duration,
54        :target_repetitions,
55        :target_weight,
56        :type,
57      ]
58    )
59  end
60
61  def recent_workouts(exercise, since = (params[:since] || 1.month).to_i.seconds.ago)
62    @since = since.beginning_of_day
63    workouts = current_user.workouts.since(since).recent.includes(:routine)
64    exercise ? workouts.with_exercise(exercise) : workouts
65  end
66
67  def find_routine(routine_id)
68    current_program.routines.find_by(id: routine_id) ||
69      current_user.next_routine
70  end
71
72  def current_program
73    current_user.current_program
74  end
75end