Phase 3: Classes
Phase 3 delivers class management -- creating classes, enrolling students, assigning teachers, and managing class subjects and materials.
Purpose
Classes bring together students, teachers, and subjects for a given academic year. This phase wires up the ClassTeacher and ClassSubject queries in auth.ts to populate SA3Session.classIds.
Key Models
| Model | Purpose |
|---|---|
Class | Core class entity (name, yearGroup, academicYear, optional class teacher) |
ClassStudent | Student enrollment in a class (composite PK) |
ClassTeacher | Teacher assignment to a class (composite PK) |
ClassSubject | Links class + subject + optional teacher for subject-level scope |
ClassMaterial | S3-backed file attached to a class |
Permission Pattern
- Read operations: Any role that covers the class (permission is not null).
- Write operations: Require ADMIN or PRINCIPAL (
PERMISSION_ORDER >= 90).
All routes use resolvePermissionsForResource with { resourceType: 'Class', classId }.
API Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET/POST | /api/admin/classes | List / create classes |
| GET/PATCH/DELETE | /api/admin/classes/[id] | Class CRUD (soft delete: isArchived = true) |
| GET/POST | /api/admin/classes/[id]/students | List / enrol students |
| DELETE | /api/admin/classes/[id]/students/[studentId] | Unenrol student |
| GET/POST | /api/admin/classes/[id]/teachers | List / assign teachers |
| DELETE | /api/admin/classes/[id]/teachers/[staffId] | Remove teacher |
| GET/POST | /api/admin/classes/[id]/subjects | List / add subjects |
| PATCH/DELETE | /api/admin/classes/[id]/subjects/[csId] | Update / remove subject |
| GET/POST | /api/admin/classes/[id]/materials | List / upload materials |
| DELETE | /api/admin/classes/[id]/materials/[materialId] | Remove material |
| GET | /api/admin/classes/[id]/materials/[materialId]/download-url | Presigned download |
Key Files
src/app/admin/classes/-- Class management UI with tabs for students, teachers, subjects, materialssrc/lib/auth.ts-- Updated with real ClassTeacher/ClassSubject queries