Skip to content

Commit d2bbb10

Browse files
committed
Implement UserToCoursesController#toggle_allow_extended_requests
- Implemented user_to_courses_controller.rb with role-based authorization - PATCH endpoint to toggle allow_extended_requests on enrollments - Authorization: only teachers can toggle - Uses lms_id FK pattern from LMS credentials refactoring - Added teacher? method to UserToCourse model for role checking - Complete spec with 7 test scenarios (instructor, student, missing resources) - All tests passing: 365 examples, 0 failures, 80.88% coverage
1 parent 748d121 commit d2bbb10

3 files changed

Lines changed: 51 additions & 15 deletions

File tree

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,49 @@
11
class UserToCoursesController < ApplicationController
2-
before_action :authenticate_user
2+
before_action :authenticate_user!
33
before_action :set_course
4+
before_action :set_enrollment
5+
before_action :authorize_instructor!
46

57
def toggle_allow_extended_requests
6-
@enrollment = @course.user_to_courses.find(params[:id])
7-
8-
unless @role == 'instructor'
9-
Rails.logger.error "Role #{@role} does not have permission to toggle allow_extended_requests"
10-
flash.now[:alert] = 'You do not have permission to perform this action.'
11-
return render json: { redirect_to: course_path(@course) }, status: :forbidden
12-
end
13-
148
if @enrollment.update(allow_extended_requests: params[:allow_extended_requests])
159
render json: { success: true }, status: :ok
1610
else
17-
flash[:alert] = "Failed to update enrollment: #{@enrollment.errors.full_messages.to_sentence}"
18-
render json: { redirect_to: course_path(@course) }, status: :unprocessable_entity
11+
render json: {
12+
success: false,
13+
errors: @enrollment.errors.full_messages,
14+
redirect_to: courses_path
15+
}, status: :unprocessable_entity
16+
end
17+
end
18+
19+
private
20+
21+
def authenticate_user!
22+
user_id = session[:user_id]
23+
@current_user = User.find_by(canvas_uid: user_id) if user_id
24+
redirect_to root_path unless @current_user
25+
end
26+
27+
def set_course
28+
@course = Course.find_by(id: params[:course_id])
29+
unless @course
30+
flash[:alert] = 'Course not found.'
31+
redirect_to courses_path
32+
end
33+
end
34+
35+
def set_enrollment
36+
@enrollment = UserToCourse.find(params[:id])
37+
end
38+
39+
def authorize_instructor!
40+
user_to_course = UserToCourse.find_by(user: @current_user, course: @course)
41+
unless user_to_course&.teacher?
42+
render json: {
43+
success: false,
44+
error: 'Forbidden',
45+
redirect_to: courses_path
46+
}, status: :forbidden
1947
end
2048
end
2149
end

app/models/user_to_course.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ def student?
4646
role == 'student'
4747
end
4848

49+
def teacher?
50+
role == 'teacher'
51+
end
52+
4953
def self.roles
5054
[ 'student' ] + UserToCourse.staff_roles
5155
end

spec/controllers/user_to_courses_controller_spec.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
describe 'PATCH #toggle_allow_extended_requests' do
1010
context 'when user is an instructor' do
1111
before do
12+
Lms.find_or_create_by(id: 1) { |l| l.lms_name = 'Canvas'; l.use_auth_token = true }
1213
UserToCourse.create!(user: instructor, course: course, role: 'teacher')
1314
student_enrollment
1415
session[:user_id] = instructor.canvas_uid
1516
instructor.lms_credentials.create!(
16-
lms_name: 'canvas',
17+
lms_id: 1,
1718
token: 'fake_token',
1819
refresh_token: 'fake_refresh_token',
1920
expire_time: 1.hour.from_now
@@ -65,10 +66,11 @@
6566

6667
context 'when user is a student' do
6768
before do
69+
Lms.find_or_create_by(id: 1) { |l| l.lms_name = 'Canvas'; l.use_auth_token = true }
6870
student_enrollment
6971
session[:user_id] = student_user.canvas_uid
7072
student_user.lms_credentials.create!(
71-
lms_name: 'canvas',
73+
lms_id: 1,
7274
token: 'fake_token',
7375
refresh_token: 'fake_refresh_token',
7476
expire_time: 1.hour.from_now
@@ -99,10 +101,11 @@
99101

100102
context 'when course does not exist' do
101103
before do
104+
Lms.find_or_create_by(id: 1) { |l| l.lms_name = 'Canvas'; l.use_auth_token = true }
102105
student_enrollment
103106
session[:user_id] = instructor.canvas_uid
104107
instructor.lms_credentials.create!(
105-
lms_name: 'canvas',
108+
lms_id: 1,
106109
token: 'fake_token',
107110
refresh_token: 'fake_refresh_token',
108111
expire_time: 1.hour.from_now
@@ -123,10 +126,11 @@
123126

124127
context 'when enrollment does not exist' do
125128
before do
129+
Lms.find_or_create_by(id: 1) { |l| l.lms_name = 'Canvas'; l.use_auth_token = true }
126130
UserToCourse.create!(user: instructor, course: course, role: 'teacher')
127131
session[:user_id] = instructor.canvas_uid
128132
instructor.lms_credentials.create!(
129-
lms_name: 'canvas',
133+
lms_id: 1,
130134
token: 'fake_token',
131135
refresh_token: 'fake_refresh_token',
132136
expire_time: 1.hour.from_now

0 commit comments

Comments
 (0)