diff --git a/app/models/project.rb b/app/models/project.rb index 5bd771747..18fadc031 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -43,8 +43,30 @@ module Types ) def self.users(current_user) - school = School.find_by(id: pluck(:school_id)) - SchoolStudent::List.call(school:, token: current_user.token, student_ids: pluck(:user_id).uniq)[:school_students] || [] + return [] unless current_user&.token + + projects_scope = all + school_user_pairs = projects_scope.pluck(:school_id, :user_id) + user_ids_by_school = school_user_pairs.each_with_object(Hash.new { |h, k| h[k] = [] }) do |(school_id, user_id), memo| + next if user_id.blank? + + memo[school_id] << user_id + end + + school_lookup = School.where(id: user_ids_by_school.keys.compact).index_by(&:id) + + user_ids_by_school.each_with_object([]) do |(school_id, user_ids), users| + school = school_lookup[school_id] + next unless school + + response = SchoolStudent::List.call( + school:, + token: current_user.token, + student_ids: user_ids.uniq + ) + + users.concat(response.fetch(:school_students, [])) + end end def self.with_users(current_user) diff --git a/app/models/school_class.rb b/app/models/school_class.rb index 8cbf0e788..181589f68 100644 --- a/app/models/school_class.rb +++ b/app/models/school_class.rb @@ -7,7 +7,7 @@ class SchoolClass < ApplicationRecord has_many :lessons, dependent: :nullify accepts_nested_attributes_for :teachers - scope :with_teachers, ->(user_id) { joins(:teachers).where(teachers: { id: user_id }) } + scope :with_teachers, ->(user_id) { joins(:teachers).where(class_teachers: { teacher_id: user_id }) } before_validation :assign_class_code, on: %i[create import] diff --git a/app/services/student_removal_service.rb b/app/services/student_removal_service.rb index 0437fd3ba..693f71a96 100644 --- a/app/services/student_removal_service.rb +++ b/app/services/student_removal_service.rb @@ -14,23 +14,25 @@ def remove_students @students.each do |user_id| result = { user_id: } begin - # Skip if student has projects - projects = Project.where(user_id: user_id) - result[:skipped] = true if projects.length.positive? + projects_scope = Project.where(user_id:, school_id: @school.id) + result[:skipped] = true if projects_scope.exists? unless result[:skipped] ActiveRecord::Base.transaction do - # Remove from classes class_assignments = ClassStudent.where(student_id: user_id) class_assignments.destroy_all - # Remove roles roles = Role.student.where(user_id: user_id) roles.destroy_all end - # Remove from profile if requested - ProfileApiClient.delete_school_student(token: @token, school_id: @school.id, student_id: user_id) if @remove_from_profile && @token.present? + if @remove_from_profile && @token.present? + ProfileApiClient.delete_school_student( + token: @token, + school_id: @school.id, + student_id: user_id + ) + end end rescue StandardError => e result[:error] = "#{e.class}: #{e.message}"