-
Notifications
You must be signed in to change notification settings - Fork 589
/
self_enrollment_controller.rb
138 lines (116 loc) · 3.9 KB
/
self_enrollment_controller.rb
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
132
133
134
135
136
137
138
# frozen_string_literal: true
#= Controller for editors enrolling in courses
class SelfEnrollmentController < ApplicationController
respond_to :html, :json
def enroll_self
# Catch HEAD requests
respond_to_non_get_request { return }
# The direct enrollment link only works if you are signed in.
# The frontend ?enroll= links handle UI for making sure you're signed in
# before redirecting here.
require_signed_in
set_course
# Don't allow users to self-enroll if the course has already ended.
redirect_if_course_ended { return }
redirect_if_passcode_invalid { return }
# Creates the CoursesUsers record
add_user_to_course
# Make sure the user isn't already enrolled.
redirect_if_enrollment_failed { return }
# Automatic edits for newly enrolled user
make_enrollment_edits
respond_to do |format|
format.html { redirect_to course_slug_path(@course.slug, enrolled: true) }
format.json do
message = I18n.t('courses.join_successful', title: @course.title)
render json: { message: }, status: :ok
end
end
end
private
def respond_to_non_get_request
return if request.get?
render json: { status: 200 }
yield
end
def set_course
@course = Course.find_by(slug: params[:course_id])
# Check if the course exists
raise ActionController::RoutingError, 'Course not found' if @course.nil?
end
def redirect_if_course_ended
return unless course_ended?
message = 'You cannot join this course. It has already ended.'
respond_to do |format|
format.html do
flash[:notice] = message
redirect_to course_slug_path(@course.slug)
end
format.json do
render json: { message: }, status: :bad_request
end
end
yield
end
def course_ended?
@course.end < Time.zone.now
end
def redirect_if_enrollment_failed
return unless @result['failure']
respond_to do |format|
format.html do
redirect_to course_slug_path(@course.slug,
enrolled: false,
failure_reason: @result['failure'])
end
format.json do
render json: {
message: I18n.t("courses.join_failure_details.#{@result['failure']}")
},
status: :bad_request
end
end
yield
end
def redirect_if_passcode_invalid
# Passcode is not required for the Online Volunteer role
return if role == CoursesUsers::Roles::ONLINE_VOLUNTEER_ROLE
return if passcode_valid?
respond_to do |format|
format.html do
path = course_slug_path(@course.slug)
redirect_to "/errors/incorrect_passcode?retry=#{path}"
end
format.json { redirect_to '/errors/incorrect_passcode.json' }
end
yield
end
def passcode_valid?
# If course has no passcode set, treat any submission as valid.
return true if @course.passcode.blank?
params[:passcode] == @course.passcode
end
def role
if params[:role] == 'online_volunteer'
CoursesUsers::Roles::ONLINE_VOLUNTEER_ROLE
else
CoursesUsers::Roles::STUDENT_ROLE
end
end
def add_user_to_course
@result = JoinCourse.new(course: @course,
user: current_user,
role:,
real_name: current_user.real_name).result
end
def make_enrollment_edits
# Posts templates to userpage and sandbox and
# adds user to course page by updating course page with latest course info.
# For Wiki Ed users, also sets their email and VE preferences.
set_mediawiki_preferences = Features.wiki_ed?
EnrollInCourseWorker.schedule_edits(course: @course,
editing_user: current_user,
enrolling_user: current_user,
set_wiki_preferences: set_mediawiki_preferences)
end
end