50 lines
3.3 KiB
Markdown
50 lines
3.3 KiB
Markdown
# EDU-012 — Classes and education relationships
|
|
|
|
- **Status:** implemented
|
|
- **Type:** bounded vertical capability
|
|
- **Phase:** 4
|
|
- **Decision:** Education owns tenant-local classes and student/teacher relationships to existing Member identities. System RBAC remains the action-authorization boundary; class roles never become System roles. No platform tenant-ignore endpoint or supervision model is introduced in this slice.
|
|
|
|
## Tenant-admin outcome
|
|
|
|
Tenant administrators manage classes, student education relationships, invitations, and supervision within explicit tenant and row-level scopes while Member/System remain the owners of generic users and roles.
|
|
|
|
## Scope
|
|
|
|
- Education class entity and membership relationships.
|
|
- Student/teacher/class domain roles without duplicating System RBAC.
|
|
- Invitations and duplicate-safe acceptance.
|
|
- Education profile extensions.
|
|
- Supervision relationships and data scopes if retained.
|
|
- Audit and operation logging.
|
|
|
|
## Delivered contract
|
|
|
|
- V4140 creates `education_class`, `education_class_member`, `education_class_invitation`, and append-only invitation audit.
|
|
- Both students and teachers are existing tenant-scoped Member users validated through `MemberUserApi`; Education stores only IDs and domain roles.
|
|
- Management permissions are independent: `education:class:create`, `education:class:query`, `education:class-member:query`, and `education:class-invitation:create`. Permissions are provisioned separately by System RBAC and are not represented in class relationships.
|
|
- All aggregate tenant IDs come from `TenantContextHolder`; tenant-qualified mapper predicates and PostgreSQL triggers reject cross-tenant relationships.
|
|
- Invitation creation is idempotent per tenant, actor, and key with request-hash conflict detection. Acceptance locks the invitation, checks invitee and expiry, and writes relationship plus audit in one transaction.
|
|
- This bounded slice intentionally excludes account creation, password handling, platform tenant-ignore operations, education profile duplication, and supervision relationships.
|
|
|
|
## Role and permission semantics
|
|
|
|
- `STUDENT` and `TEACHER` are Education relationship labels only; they do not grant System RBAC permissions or authorize administrative endpoints.
|
|
- Tenant administrators act through explicit System permissions (`education:class:*` and `education:class-invitation:*`).
|
|
- A Member principal may only accept an invitation addressed to their own member user ID; accepting a `STUDENT` or `TEACHER` invitation creates that relationship but no additional API authority in this bounded slice.
|
|
- Future teacher actions require a separate permission matrix and endpoints; no implicit role-based elevation is implemented.
|
|
|
|
## Acceptance criteria
|
|
|
|
- [x] Generic account, password, token, tenant, and role tables are not duplicated.
|
|
- [x] Student/teacher/class permission matrix is documented and tested.
|
|
- [x] Cross-class and cross-tenant access is denied.
|
|
- [x] Invitation acceptance is idempotent and auditable.
|
|
- [x] Platform-admin tenant-ignore operations are explicit and permission guarded (none are exposed by this bounded capability).
|
|
- [x] Database changes use `flyway-postgresql`.
|
|
|
|
## Risk and rollback
|
|
|
|
- **Risk:** High authorization and relationship-integrity risk.
|
|
- **Rollback:** Disable management endpoints and correct relationships through audited forward operations.
|