Skip to content

Commit 9e8f879

Browse files
committed
Faster Course#show for v8
Simplify v8 course info Do not return unlockables from v8 api Instance var to regular var in course data core Remove submission information from v8 core courses Faster visible to in core course information Use precomputed unlocks in course info
1 parent 68459b5 commit 9e8f879

File tree

4 files changed

+31
-35
lines changed

4 files changed

+31
-35
lines changed

app/controllers/api/v8/core/courses_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def show
3333
course = Course.find_by!(id: params[:id])
3434
authorize! :read, course
3535
data = { course: CourseInfo.new(current_user, view_context).course_data_core_api(course) }
36-
present data
36+
render json: data
3737
end
3838
end
3939
end

app/models/exercise.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,11 @@ def submittable_by?(user)
188188
# Whether a user may see all metadata about the exercise
189189
def visible_to?(user)
190190
user.administrator? || user.teacher?(course.organization) || user.assistant?(course) ||
191-
(!hidden? && !disabled? && published? && unlock_spec_obj.permits_unlock_for?(user))
191+
_fast_visible_to?(user) && unlock_spec_obj.permits_unlock_for?(user)
192+
end
193+
194+
def _fast_visible_to?(user)
195+
!hidden? && !disabled? && published?
192196
end
193197

194198
# Whether the user may see the scoreboard for the exercise

lib/course_info.rb

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,38 @@ def course_data(organization, course, opts = {})
3131
end
3232

3333
def course_data_core_api(course)
34-
exercises = course.exercises.includes(:course, :available_points).to_a.natsort_by(&:name)
35-
34+
UncomputedUnlock.resolve(course, @user)
3635
@unlocked_exercises = course.unlocks
3736
.where(user_id: @user.id)
3837
.where(['valid_after IS NULL OR valid_after < ?', Time.now])
3938
.pluck(:exercise_name)
4039

41-
submissions_by_exercise = {}
42-
Submission.where(course_id: course.id, user_id: @user.id).each do |sub|
43-
submissions_by_exercise[sub.exercise_name] ||= []
44-
submissions_by_exercise[sub.exercise_name] << sub
45-
end
46-
exercises.each do |ex|
47-
ex.set_submissions_by(@user, submissions_by_exercise[ex.name] || [])
40+
exercises = course.exercises.includes(:course, :available_points)
41+
42+
unless @user.administrator? || @user.teacher?(course.organization) || @user.assistant?(course)
43+
exercises = exercises.where(hidden: false, disabled_status: 0)
44+
exercises = if @unlocked_exercises.empty?
45+
exercises.where(unlock_spec: nil)
46+
else
47+
exercises.where(["unlock_spec IS NULL OR name IN (#{@unlocked_exercises.map {|_| '?'}.join(', ')})", *@unlocked_exercises])
48+
end.select { |e| e._fast_visible_to?(@user)}
4849
end
4950

50-
@course_list.course_data_core_api(course).merge(unlockables: course.unlockable_exercises_for(@user).map(&:name).natsort,
51-
exercises: exercises.map { |ex| exercise_data_core_api(ex) }.reject(&:nil?))
51+
exercises = exercises.to_a.natsort_by(&:name)
52+
53+
{
54+
id: course.id,
55+
name: course.name,
56+
title: course.title,
57+
description: course.description,
58+
details_url: @helpers.api_v8_core_course_url(course),
59+
unlock_url: @helpers.api_v8_core_course_unlock_url(course),
60+
reviews_url: @helpers.api_v8_core_course_reviews_url(course),
61+
comet_url: CometServer.get.client_url,
62+
spyware_urls: SiteSetting.value('spyware_servers'),
63+
unlockables: [],
64+
exercises: exercises.map { |ex| exercise_data_core_api(ex) }
65+
}
5266
end
5367

5468
private
@@ -94,8 +108,6 @@ def exercise_data(exercise)
94108
end
95109

96110
def exercise_data_core_api(exercise)
97-
return nil unless exercise.visible_to?(@user)
98-
99111
# optimization: use @unlocked_exercises to avoid querying unlocks repeatedly
100112
locked = exercise.requires_unlock? && !@unlocked_exercises.include?(exercise.name)
101113

@@ -122,10 +134,6 @@ def exercise_data_core_api(exercise)
122134
}
123135

124136
data[:solution_zip_url] = @helpers.download_api_v8_core_exercise_solution_url(exercise) if @user.administrator?
125-
data[:exercise_submissions_url] = @helpers.api_v8_core_exercise_url(exercise, format: 'json')
126-
last_submission = get_latest_submission(exercise)
127-
data[:latest_submission_url] = @helpers.download_api_v8_core_submission_url(last_submission) unless last_submission.nil?
128-
data[:latest_submission_id] = last_submission.id unless last_submission.nil?
129137

130138
data
131139
end

lib/course_list.rb

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,6 @@ def course_data(organization, course, opts={})
5252
data
5353
end
5454

55-
def course_data_core_api(course)
56-
@course = course
57-
data = {
58-
id: course.id,
59-
name: course.name,
60-
title: course.title,
61-
description: course.description,
62-
details_url: @helpers.api_v8_core_course_url(course),
63-
unlock_url: @helpers.api_v8_core_course_unlock_url(course),
64-
reviews_url: @helpers.api_v8_core_course_reviews_url(course),
65-
comet_url: CometServer.get.client_url,
66-
spyware_urls: SiteSetting.value('spyware_servers'),
67-
}
68-
data
69-
end
70-
7155
private
7256
def exercises
7357
@exercises ||= @course.exercises.select { |e| e.points_visible_to?(@user) }

0 commit comments

Comments
 (0)