diff --git a/docs/lighthouse_desktop.png b/docs/lighthouse_desktop.png new file mode 100644 index 0000000..0f9991c Binary files /dev/null and b/docs/lighthouse_desktop.png differ diff --git a/docs/lighthouse_mobile.png b/docs/lighthouse_mobile.png new file mode 100644 index 0000000..7267f44 Binary files /dev/null and b/docs/lighthouse_mobile.png differ diff --git a/docs/technical.html b/docs/technical.html index e40f6cc..6e7d616 100644 --- a/docs/technical.html +++ b/docs/technical.html @@ -1,246 +1,255 @@ + - + WIN Student Goal Tracker – Developer Documentation - + @@ -248,117 +257,498 @@ +
-
Primary Key
-
Foreign Key
- +
Primary Key +
+
+
Foreign Key +
+
+ + + Relationship
@@ -777,10 +1380,15 @@ JWT_EXPIRATION=3600

Appendix C – Architecture Overview

-

High-level diagrams of the system tiers, two-phase auth flow, data model, role hierarchy, deployment, and key design decisions.

+

High-level diagrams of the system tiers, two-phase auth flow, data model, role hierarchy, deployment, and key + design decisions.

- + + + + + Open full-page Architecture Overview @@ -836,7 +1444,9 @@ JWT_EXPIRATION=3600
- + + + HTTPS / REST + JWT Bearer — win.opelly.me → winapi.opelly.me
@@ -857,7 +1467,9 @@ JWT_EXPIRATION=3600
- + + + HTTP (internal Docker network)
@@ -907,7 +1519,9 @@ JWT_EXPIRATION=3600
- + + + Stored procedures via Dapper — TCP :3309 (Docker internal)
@@ -949,7 +1563,9 @@ JWT_EXPIRATION=3600
- + + + Outbound HTTP from API tier only
@@ -995,7 +1611,9 @@ JWT_EXPIRATION=3600
- + + +
@@ -1008,7 +1626,9 @@ JWT_EXPIRATION=3600
- + + +
@@ -1021,7 +1641,9 @@ JWT_EXPIRATION=3600
- + + +
@@ -1034,7 +1656,9 @@ JWT_EXPIRATION=3600
- + + +
@@ -1047,7 +1671,9 @@ JWT_EXPIRATION=3600
- + + +
@@ -1063,11 +1689,14 @@ JWT_EXPIRATION=3600
- Token storage: auth_jwt, auth_refresh_token, auth_session_token — all in localStorage. + Token storage: auth_jwt, auth_refresh_token, + auth_session_token — all in localStorage.  |  - 401 interceptor: attempts one silent refresh; if that fails, redirects to /login. + 401 interceptor: attempts one silent refresh; if that fails, redirects to + /login.  |  - Refresh token rotation: each use replaces the old token (tracked via replaced_by_token_id). + Refresh token rotation: each use replaces the old token (tracked via + replaced_by_token_id).
@@ -1106,7 +1735,8 @@ JWT_EXPIRATION=3600
-
user_program (junction)
+
user_program (junction)
PK id_user_program
FK id_user
@@ -1128,7 +1758,8 @@ JWT_EXPIRATION=3600
-
user_student (junction)
+
user_student (junction)
PK id_user_student
FK id_user
@@ -1171,7 +1802,8 @@ JWT_EXPIRATION=3600
-
progress_event_benchmark (junction)
+
progress_event_benchmark (junction)
FK id_progress_event
FK id_benchmark
@@ -1222,11 +1854,26 @@ JWT_EXPIRATION=3600
Role Tiers (highest → lowest)
-
super_admin  ·  full platform access
-
district_admin  ·  manages programs
-
program_admin  ·  manages users
-
teacher  ·  full student CRUD
-
paraeducator  ·  log events
+
+
super_admin  ·  full platform access
+
+
+
district_admin  ·  manages programs
+
+
+
program_admin  ·  manages users
+
+
+
teacher  ·  full student CRUD
+
+
+
paraeducator  ·  log events
+
@@ -1244,14 +1891,70 @@ JWT_EXPIRATION=3600 - Student — CreateAllowAllowAllowAllowDeny - Student — UpdateAllowAllowAllowMineDeny - Goal — CreateAllowAllowAllowMineDeny - Goal — UpdateAllowAllowAllowMineDeny - ProgressEvent — CreateAllowAllowAllowAllowMine - ProgressEvent — DeleteAllowAllowAllowMineDeny - Program — CreateAllowMineDenyDenyDeny - User — CreateAllowMineMineDenyDeny + + Student — Create + Allow + Allow + Allow + Allow + Deny + + + Student — Update + Allow + Allow + Allow + Mine + Deny + + + Goal — Create + Allow + Allow + Allow + Mine + Deny + + + Goal — Update + Allow + Allow + Allow + Mine + Deny + + + ProgressEvent — Create + Allow + Allow + Allow + Allow + Mine + + + ProgressEvent — Delete + Allow + Allow + Allow + Mine + Deny + + + Program — Create + Allow + Mine + Deny + Deny + Deny + + + User — Create + Allow + Mine + Mine + Deny + Deny +
@@ -1387,581 +2090,582 @@ JWT_EXPIRATION=3600
- + renderTables(); + drawRelationships(); + applyTransform(); + setTimeout(updateMinimap, 100); + window.addEventListener('resize', updateMinimap); + - + + \ No newline at end of file