File size: 3,076 Bytes
874ae95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
class CoursesController < ApplicationController
  include RecaptchaVerifiable
  include DiscordAccountRequirable

  before_action :authenticate_user!,
                except: %i[show apply process_application curriculum]

  before_action :preview_or_authenticate, only: %i[curriculum]
  before_action :require_discord_account, only: %i[curriculum report]

  # GET /courses/:id/curriculum
  def curriculum
    @presenter = Courses::CurriculumPresenter.new(view_context, @course)
    render layout: "student_course"
  end

  # GET /courses/:id/leaderboard?weeks_before=
  def leaderboard
    @course = authorize(find_course)
    @on = params[:on]
    render layout: "student_course"
  end

  # GET /courses/:id/apply
  def apply
    @course = authorize(find_course)
    @show_checkbox_recaptcha = params[:visible_recaptcha].present?

    save_tag
  end

  # POST /courses/:id/apply
  def process_application
    @course = authorize(find_course)

    form = Courses::EnrollmentForm.new(@course)

    recaptcha_success =
      recaptcha_success?(@form, action: "public_course_enrollment")

    unless recaptcha_success
      redirect_to apply_course_path(params[:id], visible_recaptcha: 1)
      return
    end

    if form.validate(params)
      form.create_applicant(session)

      flash[:success] = t(".sent_mail")

      redirect_to root_path
    else
      flash[:error] = t(
        ".errors",
        form_errors: form.errors.full_messages.join(", ")
      )

      redirect_to apply_course_path(params[:id], visible_recaptcha: 1)
    end
  end

  # GET /courses/:id/(:slug)
  def show
    @course = authorize(find_course)
    render layout: "student"
  end

  # GET /courses/:id/review
  def review
    @course = authorize(find_course)
    render html: "", layout: "app_router"
  end

  # GET /courses/:id/cohorts
  def cohorts
    @course = authorize(find_course)
    render layout: "student_course"
  end

  # GET /courses/:id/report
  def report
    @course = authorize(find_course)
    @presenter = Courses::ReportPresenter.new(view_context, @course, student)
    render layout: "student_course"
  end

  # GET /courses/:id/calendar
  def calendar
    @course = authorize(find_course)
    @presenter = Courses::CalendarsPresenter.new(view_context, @course, params)
    render layout: "student_course"
  end

  def calendar_month_data
    @course = authorize(find_course)
    @presenter = Courses::CalendarsPresenter.new(view_context, @course, params)
    render json: @presenter.month_data
  end

  private

  def course
    @course ||= Course.find(params[:id])
  end

  def preview_or_authenticate
    course = find_course

    authenticate_user! unless course.public_preview?

    @course = authorize(course)
  end

  def student
    @student ||=
      @course.students.not_dropped_out.find_by(user_id: current_user.id)
  end

  def find_course
    policy_scope(Course).find(params[:id])
  end

  def save_tag
    return if params[:tag].blank?

    if params[:tag].in?(current_school.student_tag_list)
      session[:applicant_tag] = params[:tag]
    end
  end
end