Skip to content

Commit f61a045

Browse files
Refactor student removal and project user fetching logic
Co-authored-by: adrian.lansdown <adrian.lansdown@raspberrypi.org>
1 parent f64fe1d commit f61a045

3 files changed

Lines changed: 34 additions & 10 deletions

File tree

app/models/project.rb

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,30 @@ module Types
4343
)
4444

4545
def self.users(current_user)
46-
school = School.find_by(id: pluck(:school_id))
47-
SchoolStudent::List.call(school:, token: current_user.token, student_ids: pluck(:user_id).uniq)[:school_students] || []
46+
return [] unless current_user&.token
47+
48+
projects_scope = all
49+
school_user_pairs = projects_scope.pluck(:school_id, :user_id)
50+
user_ids_by_school = school_user_pairs.each_with_object(Hash.new { |h, k| h[k] = [] }) do |(school_id, user_id), memo|
51+
next if user_id.blank?
52+
53+
memo[school_id] << user_id
54+
end
55+
56+
school_lookup = School.where(id: user_ids_by_school.keys.compact).index_by(&:id)
57+
58+
user_ids_by_school.each_with_object([]) do |(school_id, user_ids), users|
59+
school = school_lookup[school_id]
60+
next unless school
61+
62+
response = SchoolStudent::List.call(
63+
school:,
64+
token: current_user.token,
65+
student_ids: user_ids.uniq
66+
)
67+
68+
users.concat(response.fetch(:school_students, []))
69+
end
4870
end
4971

5072
def self.with_users(current_user)

app/models/school_class.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class SchoolClass < ApplicationRecord
77
has_many :lessons, dependent: :nullify
88
accepts_nested_attributes_for :teachers
99

10-
scope :with_teachers, ->(user_id) { joins(:teachers).where(teachers: { id: user_id }) }
10+
scope :with_teachers, ->(user_id) { joins(:teachers).where(class_teachers: { teacher_id: user_id }) }
1111

1212
before_validation :assign_class_code, on: %i[create import]
1313

app/services/student_removal_service.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,25 @@ def remove_students
1414
@students.each do |user_id|
1515
result = { user_id: }
1616
begin
17-
# Skip if student has projects
18-
projects = Project.where(user_id: user_id)
19-
result[:skipped] = true if projects.length.positive?
17+
projects_scope = Project.where(user_id:, school_id: @school.id)
18+
result[:skipped] = true if projects_scope.exists?
2019

2120
unless result[:skipped]
2221
ActiveRecord::Base.transaction do
23-
# Remove from classes
2422
class_assignments = ClassStudent.where(student_id: user_id)
2523
class_assignments.destroy_all
2624

27-
# Remove roles
2825
roles = Role.student.where(user_id: user_id)
2926
roles.destroy_all
3027
end
3128

32-
# Remove from profile if requested
33-
ProfileApiClient.delete_school_student(token: @token, school_id: @school.id, student_id: user_id) if @remove_from_profile && @token.present?
29+
if @remove_from_profile && @token.present?
30+
ProfileApiClient.delete_school_student(
31+
token: @token,
32+
school_id: @school.id,
33+
student_id: user_id
34+
)
35+
end
3436
end
3537
rescue StandardError => e
3638
result[:error] = "#{e.class}: #{e.message}"

0 commit comments

Comments
 (0)