Last updated: 2026-05-10
- Next.js App Router scaffolded.
- Clerk installed and configured with
src/proxy.ts. - Clerk provider added in
src/app/layout.tsx. - Sign-in and sign-up routes added.
- Redux Toolkit and RTK Query base setup added.
- Prisma 7 configured for Neon PostgreSQL.
- Neon serverless SQL helper added for raw SQL health checks.
- Initial Prisma migration applied.
- Frappe LMS documented as a reference, not copied source.
/admin/*,/teacher/*,/student/*, and/api/auth/merequire Clerk sign-in.- Server layouts enforce database roles.
/api/auth/mesyncs signed-in Clerk users into the localUsertable.- First admin can be promoted with:
npm run db:make-admin -- user@example.com- Student can now be created before linking a Clerk user.
- Prisma migration applied for optional
Student.userId. - Students validation added with Zod.
- Students service layer added.
- Students API routes added:
GET /api/students
POST /api/students
GET /api/students/:id
PATCH /api/students/:id
DELETE /api/students/:id- RTK Query student endpoints added.
- Backend edge-case tests added for validation and service behavior.
- Classes validation added with Zod.
- Classes service layer added.
- Classes API routes added:
GET /api/classes
POST /api/classes
GET /api/classes/:id
PATCH /api/classes/:id
DELETE /api/classes/:id- RTK Query class endpoints added in
src/store/api/classApi.ts. - Delete is guarded: classes with batches cannot be deleted.
- Backend edge-case tests added for validation and service behavior.
- Batches validation added with Zod.
- Batches service layer added.
- Batches API routes added:
GET /api/batches
POST /api/batches
GET /api/batches/:id
PATCH /api/batches/:id
DELETE /api/batches/:id- RTK Query batch endpoints added.
- Create/update validates class existence.
- Create/update validates teacher existence when
teacherIdis provided. - Delete is guarded: batches with students, assignments, announcements, or attendance cannot be deleted.
- Backend edge-case tests added for validation and service behavior.
- Teachers validation added with Zod.
- Teachers service layer added.
- Teachers API routes added:
GET /api/teachers
POST /api/teachers
GET /api/teachers/:id
PATCH /api/teachers/:id
DELETE /api/teachers/:id- RTK Query teacher endpoints added.
- Teacher profile creation requires an existing
User. - Creating/linking a teacher promotes the linked user to
TEACHER. - Admin users cannot be linked to teacher profiles.
- Users already linked to student or teacher profiles cannot be reused.
- Delete is guarded: teachers with batches cannot be deleted.
- Backend edge-case tests added for validation and service behavior.
- Attendance validation added with Zod.
- Attendance service layer added.
- Attendance API routes added:
GET /api/attendance
POST /api/attendance
GET /api/attendance/:id
PATCH /api/attendance/:id
DELETE /api/attendance/:id- RTK Query attendance endpoints added.
- Attendance dates are accepted as
YYYY-MM-DDand normalized to UTC midnight. ADMINcan read and manage all attendance.TEACHERcan read and manage attendance only for assigned batches.STUDENTcan read only their own attendance.- Create is guarded against duplicate student, batch, and date records.
- Create is guarded so the student must belong to the selected batch.
- Backend edge-case tests added for validation and service behavior.
- Assignments validation added with Zod.
- Assignments service layer added.
- Assignments API routes added:
GET /api/assignments
POST /api/assignments
GET /api/assignments/:id
PATCH /api/assignments/:id
DELETE /api/assignments/:id- RTK Query assignment endpoints added.
- Assignment due dates are accepted as
YYYY-MM-DDand normalized to UTC midnight. - Assignment file uploads stay external; API stores
fileUrlonly. ADMINcan read and manage all assignments.TEACHERcan read and manage assignments only for assigned batches.STUDENTcan read assignments only for their own batch.- Create/update validates batch existence.
- Backend edge-case tests added for validation and service behavior.
- Announcements validation added with Zod.
- Announcements service layer added.
- Announcements API routes added:
GET /api/announcements
POST /api/announcements
GET /api/announcements/:id
PATCH /api/announcements/:id
DELETE /api/announcements/:id- RTK Query announcement endpoints added.
ADMINcan read and manage all announcements.TEACHERcan read and manage announcements only for assigned batches.STUDENTcan read announcements only for their own batch.- Create/update validates batch existence.
- Backend edge-case tests added for validation and service behavior.
- Fees validation added with Zod.
- Fees service layer added.
- Fees API routes added:
GET /api/fees
POST /api/fees
GET /api/fees/:id
PATCH /api/fees/:id
DELETE /api/fees/:id- RTK Query fee endpoints added.
- Fee due dates and paid dates are accepted as
YYYY-MM-DDand normalized to UTC midnight. ADMINcan read and manage all fees.STUDENTcan read only their own fees.TEACHERhas no fee access in the MVP.- Create/update validates student existence.
- Backend edge-case tests added for validation and service behavior.
Latest checks:
npm test
npm run lint
npm run buildCurrent test coverage:
- Student validation rejects invalid UUIDs.
- Student validation rejects short names.
- Student validation rejects suspicious phone values.
- Student update rejects empty payloads.
- Student list validation caps page size.
- Student service rejects missing batches.
- Student service rejects missing linked users.
- Student service rejects users already linked to another student.
- Student service verifies pagination behavior.
- Class validation rejects short names.
- Class validation rejects empty updates.
- Class validation caps page size.
- Class service rejects missing records.
- Class service rejects deletes when batches exist.
- Batch validation rejects invalid time strings.
- Batch validation rejects empty updates.
- Batch validation caps page size.
- Batch service rejects missing classes.
- Batch service rejects missing teachers.
- Batch service rejects deletes when dependent records exist.
- Teacher validation rejects invalid user ids.
- Teacher validation rejects empty updates and normalized-empty updates.
- Teacher validation caps page size.
- Teacher service rejects missing users.
- Teacher service rejects admin users.
- Teacher service rejects users already linked to student or teacher profiles.
- Teacher service verifies role promotion on create.
- Teacher service rejects deletes when batches exist.
- Attendance validation rejects invalid dates.
- Attendance validation rejects invalid statuses.
- Attendance validation rejects empty updates and normalized-empty updates.
- Attendance service rejects unassigned teacher writes.
- Attendance service rejects student writes.
- Attendance service rejects student and batch mismatches.
- Attendance service rejects duplicate attendance.
- Attendance service limits student reads to their own attendance.
- Assignment validation rejects short titles.
- Assignment validation rejects invalid file URLs.
- Assignment validation rejects impossible due dates.
- Assignment validation rejects empty updates and normalized-empty updates.
- Assignment validation caps page size.
- Assignment service rejects unassigned teacher writes.
- Assignment service rejects student writes.
- Assignment service limits student reads to their own batch.
- Announcement validation rejects short titles.
- Announcement validation rejects short messages.
- Announcement validation rejects invalid batch ids.
- Announcement validation rejects empty updates.
- Announcement validation caps page size.
- Announcement service rejects unassigned teacher writes.
- Announcement service rejects student writes.
- Announcement service limits student reads to their own batch.
- Fee validation rejects invalid amounts.
- Fee validation rejects impossible due dates.
- Fee validation rejects invalid statuses.
- Fee validation rejects empty updates.
- Fee validation caps page size.
- Fee service rejects missing students.
- Fee service rejects non-admin writes.
- Fee service limits student reads to their own fees.
Recommended next backend steps:
- Add endpoint-level tests for route responses once test auth helpers are introduced.
- Start UI only after the UI kit is provided.
- Use Prisma for normal CRUD.
- Use
src/lib/neon.tsonly for health checks or direct SQL cases. - Keep role checks in middleware, server layouts, API routes, or auth helpers.
- Do not hardcode role business logic inside components.
- Keep feature files under
src/features/<feature>. - Add edge-case tests whenever adding backend APIs.