@@ -110,17 +110,62 @@ def update
110110 end
111111
112112 def destroy
113- result = SchoolStudent ::Delete . call ( school : @school , student_id : params [ :id ] , token : current_user . token )
113+ remove_students ( [ params [ :id ] ] )
114+ end
114115
115- if result . success?
116- head :no_content
117- else
118- render json : { error : result [ :error ] } , status : :unprocessable_entity
116+ def destroy_batch
117+ # DELETE /api/schools/:school_id/students/batch
118+ # Params: { student_ids: ["uuid1", "uuid2", ...] }
119+ #
120+ # Returns 200 OK with one of:
121+ # - Success: { results: [{ user_id: "..." }, ...] }
122+ # - Partial failure: { results: [...], error: "N student(s) failed to be removed" }
123+ #
124+ # Each result may contain:
125+ # - { user_id:, error: } - deletion failed
126+ # - { user_id:, skipped:, reason: } - student skipped (e.g., not in this school)
127+ # - { user_id: } - deletion succeeded
128+
129+ student_ids = student_ids_params
130+
131+ if student_ids . blank?
132+ render json : {
133+ error : 'No student IDs provided' ,
134+ error_type : :unprocessable_entity
135+ } ,
136+ status : :unprocessable_entity
137+ return
119138 end
139+
140+ # Remove duplicates to avoid redundant processing
141+ unique_student_ids = student_ids . uniq
142+ remove_students ( unique_student_ids )
120143 end
121144
122145 private
123146
147+ def remove_students ( student_ids )
148+ service = StudentRemovalService . new (
149+ students : student_ids ,
150+ school : @school ,
151+ remove_from_profile : true ,
152+ token : current_user . token
153+ )
154+
155+ results = service . remove_students
156+
157+ # Check if any errors occurred
158+ errors = results . select { |r | r [ :error ] }
159+ if errors . any?
160+ render json : {
161+ results : results ,
162+ error : "#{ errors . size } student(s) failed to be removed"
163+ } , status : :ok
164+ else
165+ render json : { results : results } , status : :ok
166+ end
167+ end
168+
124169 def school_student_params
125170 params . require ( :school_student ) . permit ( :username , :password , :name )
126171 end
@@ -135,6 +180,10 @@ def school_students_params
135180 end
136181 end
137182
183+ def student_ids_params
184+ params . fetch ( :student_ids , [ ] )
185+ end
186+
138187 def create_safeguarding_flags
139188 create_teacher_safeguarding_flag
140189 create_owner_safeguarding_flag
0 commit comments