# jhansi-07-10/edunova-cr architecture

> Architecture diagram of the GitHub repository jhansi-07-10/edunova-cr, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jhansi-07-10/edunova-cr
- Repository: https://github.com/jhansi-07-10/edunova-cr

## Overview

EduNova is a school ERP and public-facing CMS, with a React frontend and Django/DRF backend backed by Supabase PostgreSQL. Visitors explore school information and admissions; authenticated students, teachers, parents, and administrators use role-specific portals for academic and operational workflows. The graph includes documented OTP authentication and file-storage behavior. Other feature links are represented at subsystem level from the route and module tree; unsampled view implementations limit certainty about their internal call paths.

Main entry points: [`frontend/src/routes/AppRoutes.jsx`](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/routes/AppRoutes.jsx) (Application routes), [`backend/config/urls.py`](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/config/urls.py) (Backend routing), [`frontend/src/lib/useOtpAuth.js`](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/lib/useOtpAuth.js) (OTP client), [`frontend/src/api/portalClient.js`](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/portalClient.js) (Portal API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["React application"]
  node_app_routes["Application routes<br/>[AppRoutes.jsx]"]
  node_public_site["Public website"]
  node_admissions_ui["Admissions pages<br/>[Admissions.jsx]"]
  node_student_portal["Student portal<br/>[StudentRoutes.jsx]"]
  node_teacher_portal["Teacher portal<br/>[TeacherRoutes.jsx]"]
  node_parent_portal["Parent portal<br/>[ParentRoutes.jsx]"]
  node_admin_portal["Admin portal<br/>[AdminRoutes.jsx]"]
  node_otp_auth["OTP client<br/>[useOtpAuth.js]"]
  node_portal_client["Portal API client<br/>[portalClient.js]"]
  node_admissions_api["Admissions API<br/>[admissionsApi.js]"]
  node_cms_api["CMS API<br/>[cmsApi.js]"]
end

subgraph group_backend["Django services"]
  node_backend_urls["Backend routing<br/>[urls.py]"]
  node_auth_views["Authentication<br/>[auth_views.py]"]
  node_email_service["Email delivery<br/>[email_service.py]"]
  node_admissions_service["Admissions service<br/>[views.py]"]
  node_cms_service["CMS service<br/>[views.py]"]
  node_portal_domain["ERP domain"]
  node_models["Data models<br/>[models.py]"]
end

subgraph group_data["Persistence and delivery"]
  node_postgres[("Supabase PostgreSQL")]
  node_file_storage["File storage<br/>[storage.py]"]
  node_supabase_storage[("Supabase Storage")]
  node_local_storage[("Local media")]
  node_email_provider["Brevo / email backend"]
end

subgraph group_external["External actors"]
  node_visitor(("Visitor"))
  node_school_user(("School user"))
end

node_visitor -->|"browses"| node_app_routes
node_school_user -->|"opens portal"| node_app_routes
node_app_routes -->|"routes public pages"| node_public_site
node_app_routes -->|"routes admissions"| node_admissions_ui
node_app_routes -->|"routes student"| node_student_portal
node_app_routes -->|"routes teacher"| node_teacher_portal
node_app_routes -->|"routes parent"| node_parent_portal
node_app_routes -->|"routes admin"| node_admin_portal
node_admissions_ui -->|"uses API"| node_admissions_api
node_public_site -->|"uses API"| node_cms_api
node_student_portal -->|"uses client"| node_portal_client
node_teacher_portal -->|"uses client"| node_portal_client
node_parent_portal -->|"uses client"| node_portal_client
node_admin_portal -->|"uses client"| node_portal_client
node_student_portal -->|"authenticates with"| node_otp_auth
node_teacher_portal -->|"authenticates with"| node_otp_auth
node_parent_portal -->|"authenticates with"| node_otp_auth
node_admin_portal -->|"authenticates with"| node_otp_auth
node_portal_client -->|"sends API requests"| node_backend_urls
node_otp_auth -->|"posts OTP requests"| node_backend_urls
node_admissions_api -->|"sends API requests"| node_backend_urls
node_cms_api -->|"sends API requests"| node_backend_urls
node_backend_urls -->|"dispatches auth"| node_auth_views
node_backend_urls -->|"dispatches admissions"| node_admissions_service
node_backend_urls -->|"dispatches CMS"| node_cms_service
node_auth_views -->|"sends OTP email"| node_email_service
node_email_service -.->|"delivers email"| node_email_provider
node_admissions_service -->|"uses models"| node_models
node_cms_service -->|"uses models"| node_models
node_backend_urls -->|"routes ERP features"| node_portal_domain
node_portal_domain -->|"uses models"| node_models
node_models -->|"persists records"| node_postgres
node_admissions_service -->|"stores uploads"| node_file_storage
node_cms_service -->|"stores media"| node_file_storage
node_file_storage -.->|"uploads and reads"| node_supabase_storage
node_file_storage -->|"falls back to"| node_local_storage

click node_app_routes "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/routes/AppRoutes.jsx"
click node_public_site "https://github.com/jhansi-07-10/edunova-cr/tree/main/frontend/src/portals/public"
click node_admissions_ui "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/public/pages/Admissions.jsx"
click node_student_portal "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/student/StudentRoutes.jsx"
click node_teacher_portal "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/teacher/TeacherRoutes.jsx"
click node_parent_portal "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/parent/ParentRoutes.jsx"
click node_admin_portal "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/admin/AdminRoutes.jsx"
click node_otp_auth "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/lib/useOtpAuth.js"
click node_portal_client "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/portalClient.js"
click node_admissions_api "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/admissionsApi.js"
click node_cms_api "https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/cmsApi.js"
click node_backend_urls "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/config/urls.py"
click node_auth_views "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/auth_views.py"
click node_email_service "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/services/email_service.py"
click node_admissions_service "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/apps/admissions/views.py"
click node_cms_service "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/apps/cms/views.py"
click node_portal_domain "https://github.com/jhansi-07-10/edunova-cr/tree/main/backend/portal"
click node_models "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/models.py"
click node_file_storage "https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/config/storage.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app_routes,node_public_site,node_admissions_ui,node_student_portal,node_teacher_portal,node_parent_portal,node_admin_portal,node_otp_auth,node_portal_client,node_admissions_api,node_cms_api toneBlue
class node_backend_urls,node_auth_views,node_email_service,node_admissions_service,node_cms_service,node_portal_domain,node_models toneAmber
class node_postgres,node_file_storage,node_supabase_storage,node_local_storage,node_email_provider toneMint
class node_visitor,node_school_user toneRose
```

## Components

### React application

- [Application routes](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/routes/AppRoutes.jsx): `frontend/src/routes/AppRoutes.jsx`
- [Public website](https://github.com/jhansi-07-10/edunova-cr/tree/main/frontend/src/portals/public): `frontend/src/portals/public`
- [Admissions pages](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/public/pages/Admissions.jsx): `frontend/src/portals/public/pages/Admissions.jsx`
- [Student portal](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/student/StudentRoutes.jsx): `frontend/src/portals/student/StudentRoutes.jsx`
- [Teacher portal](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/teacher/TeacherRoutes.jsx): `frontend/src/portals/teacher/TeacherRoutes.jsx`
- [Parent portal](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/parent/ParentRoutes.jsx): `frontend/src/portals/parent/ParentRoutes.jsx`
- [Admin portal](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/portals/admin/AdminRoutes.jsx): `frontend/src/portals/admin/AdminRoutes.jsx`
- [OTP client](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/lib/useOtpAuth.js): `frontend/src/lib/useOtpAuth.js`
- [Portal API client](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/portalClient.js): `frontend/src/api/portalClient.js`
- [Admissions API](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/admissionsApi.js): `frontend/src/api/admissionsApi.js`
- [CMS API](https://github.com/jhansi-07-10/edunova-cr/blob/main/frontend/src/api/cmsApi.js): `frontend/src/api/cmsApi.js`

### Django services

- [Backend routing](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/config/urls.py): `backend/config/urls.py`
- [Authentication](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/auth_views.py): `backend/portal/auth_views.py`
- [Email delivery](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/services/email_service.py): `backend/portal/services/email_service.py`
- [Admissions service](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/apps/admissions/views.py): `backend/apps/admissions/views.py`
- [CMS service](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/apps/cms/views.py): `backend/apps/cms/views.py`
- [ERP domain](https://github.com/jhansi-07-10/edunova-cr/tree/main/backend/portal): `backend/portal`
- [Data models](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/portal/models.py): `backend/portal/models.py`

### Persistence and delivery

- **Supabase PostgreSQL**
- [File storage](https://github.com/jhansi-07-10/edunova-cr/blob/main/backend/config/storage.py): `backend/config/storage.py`
- **Supabase Storage**
- **Local media**
- **Brevo / email backend**

### External actors

- **Visitor**
- **School user**

## Connections

- Visitor → Application routes: browses
- School user → Application routes: opens portal
- Application routes → Public website: routes public pages
- Application routes → Admissions pages: routes admissions
- Application routes → Student portal: routes student
- Application routes → Teacher portal: routes teacher
- Application routes → Parent portal: routes parent
- Application routes → Admin portal: routes admin
- Admissions pages → Admissions API: uses API
- Public website → CMS API: uses API
- Student portal → Portal API client: uses client
- Teacher portal → Portal API client: uses client
- Parent portal → Portal API client: uses client
- Admin portal → Portal API client: uses client
- Student portal → OTP client: authenticates with
- Teacher portal → OTP client: authenticates with
- Parent portal → OTP client: authenticates with
- Admin portal → OTP client: authenticates with
- Portal API client → Backend routing: sends API requests
- OTP client → Backend routing: posts OTP requests
- Admissions API → Backend routing: sends API requests
- CMS API → Backend routing: sends API requests
- Backend routing → Authentication: dispatches auth
- Backend routing → Admissions service: dispatches admissions
- Backend routing → CMS service: dispatches CMS
- Authentication → Email delivery: sends OTP email
- Email delivery → Brevo / email backend: delivers email
- Admissions service → Data models: uses models
- CMS service → Data models: uses models
- Backend routing → ERP domain: routes ERP features
- ERP domain → Data models: uses models
- Data models → Supabase PostgreSQL: persists records
- Admissions service → File storage: stores uploads
- CMS service → File storage: stores media
- File storage → Supabase Storage: uploads and reads
- File storage → Local media: falls back to
