Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

02 — User Personas (Academics Module)

Personas for the Academics module, derived from blueprint 01-Product/USER_PERSONAS.md role model (roles examples: Super Admin, Organization Admin, Teacher, Parent, Student — COLLECTIONS.md:600-623) and the endpoints/semantics in src/modules/academics/**. Permission notes reflect the actual guard state: every endpoint is JWT-authenticated but no academics.* permission exists yet (rbac/permissions.constants.ts:1-97, OQ-1 in 01_Product_Overview.md) — so the "can do X" columns below are the intended mapping, marked accordingly.


P1 — Organization Admin ("Nishant")

AttributeValue
Role / contextOwner/admin of one school tenant; member with organization.* perms; sees everything (base.repository.ts:20-30 scoping)
TechTablet (Galaxy Tab S8) + desktop web; occasional phone
GoalsSet up the school's academic skeleton once: create the year, the grade ladder, sections, classes, subjects; flip set-current at rollover; keep one source of truth
Pain pointsRebuilding structure every year manually; accidental duplicates ("Grade 1" created twice); forgetting to demote the old current year
Key flowsCreate academic year → set current → bulk-create grades → create classes with sections; monitor statuses
Kill featurePATCH /academic-years/:id/set-current — one tap demotes all others and activates the new year (academic-year.service.ts:69-83)
Perms (intended)Full CRUD on all six entities (none enforced today)

P2 — Academic Coordinator ("Meera")

AttributeValue
Role / contextSenior teacher or dedicated coordinator; the day-to-day owner of the structure after the admin seeds it
TechDesktop web primary, phone for spot checks
GoalsWire subjects + teachers to classes per year; keep section/class lists accurate; spot gaps (a class with no subjects, a teacher with no assignments) before timetabling
Pain pointsAssignment matrix gets large (classes × subjects × teachers); no bulk ops; removing a bad assignment requires delete + recreate (subject-assignment.controller.ts:19-39)
Key flowsBrowse hierarchy per year → open class → view subjects+teachers → add/remove assignments; fix conflicts
Kill featureGET /subject-assignments/by-class/:classId?academicYearId= — the per-class teaching roster (subject-assignment.controller.ts:24-29)
Perms (intended)Read all; create/delete assignments; update class/grade metadata

P3 — Teacher ("Mr. Okafor")

AttributeValue
Role / contextClass teacher of "Grade 10 - A" (via classTeacherId), subject teacher via assignments
TechPhone (Pixel 8) mostly; tablet in classroom
GoalsSee which classes/sections/subjects they teach this year; know their class's structure; enter timetable/attendance against the right classId
Pain pointsYears change → roster changes; needs year-scoped view, not a global dump
Key flowsMy classes (by-teacher) → class detail → subjects; timetable for own class
Kill featureGET /subject-assignments/by-teacher/:teacherId?academicYearId= — year-scoped teaching load (subject-assignment.controller.ts:30-35)
Perms (intended)Read structure; no writes (structure is admin/coordinator-owned)

P4 — Student / Parent (read-only)

AttributeValue
Role / contextStudent profile linked to a class via class_enrollments (RELATIONSHIPS.md:63-65); parent linked to student
TechPhone; light usage
GoalsSee "my grade, my section, my class, my subjects" for the current year; understand report/timetable references
Pain pointsCurrently no client-scoped endpoint: the API returns all classes/subjects per tenant — the client must resolve "my class" from enrollment data (Students module) then render its structure
Key flowsHome → Academics (read-only) → structure browse filtered to own class
Kill featureSubject list of their class + academic year status (upcoming/active/archived badge)
Perms (intended)Read only; server has no read-scoping filter — flag OQ-1 in 01_Product_Overview.md

Persona → capability matrix (intended; not enforced by API today)

CapabilityAdminCoordinatorTeacherStudent/Parent
CRUD academic year + set-current
CRUD grade / section / class✅ (coordinated)
CRUD subject
Create/delete subject assignments
Read structure (all, tenant-scoped)✅ (needs own-class filter, client-side)
by-class / by-teacher rosters

Every write above currently requires only a valid JWT (academics.module.ts:46, controllers @UseGuards(JwtAuthGuard)). The matrix is the design target; enforcement is (planned) (OQ-1).