# safachaabane/padel-dashboard architecture

> Architecture diagram of the GitHub repository safachaabane/padel-dashboard, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/safachaabane/padel-dashboard
- Repository: https://github.com/safachaabane/padel-dashboard

## Overview

Padel Club manages dated court-slot reservations for clients and staff, from calendar and slot selection through registration, administrator review, and confirmation or cancellation. Users can also manage reservations and submit post-match satisfaction; administrators manage slots, settings, registrations, and reports. The frontend communicates with an Express API backed by MongoDB, with email and scheduled reporting features. Several route and page implementations were not excerpted, so their documented capabilities are shown, but uncertain internal call paths are omitted.

Main entry points: [`backend/src/index.js`](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/index.js) (Express application), [`backend/src/routes/inscriptions.js`](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/inscriptions.js) (Registration routes), [`frontend/src/utils/api.ts`](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/utils/api.ts) (API client), [`backend/src/routes/creneaux.js`](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/creneaux.js) (Slot routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_booking["Reservation experience"]
  node_client_form["Client registration<br/>[FormClientPage.tsx]"]
  node_staff_form["Staff registration"]
  node_date_selector["Date calendar<br/>[DateSelector.tsx]"]
  node_slot_selector["Slot availability"]
  node_reservation_page["My reservation"]
  node_satisfaction_page["Satisfaction form"]
end

subgraph group_admin["Administration"]
  node_admin_pages["Admin screens"]
  node_admin_detail["Registration details"]
end

subgraph group_api["API and access"]
  node_auth_state["Admin auth state<br/>[useAuth.tsx]"]
  node_frontend_api["API client<br/>[api.ts]"]
  node_server["Express application<br/>[index.js]"]
  node_auth_routes["Authentication routes<br/>[auth.js]"]
  node_auth_middleware["JWT authorization<br/>[auth.js]"]
  node_role_middleware["Role authorization<br/>[role.js]"]
  node_slot_routes["Slot routes<br/>[creneaux.js]"]
  node_registration_routes["Registration routes<br/>[inscriptions.js]"]
  node_other_routes["Other API routes"]
end

subgraph group_domain["Reservation domain"]
  node_slot_model["Slot model<br/>[Creneau.js]"]
  node_registration_model["Registration model<br/>[Inscription.js]"]
  node_admin_model["Admin model<br/>[Admin.js]"]
  node_settings["Reservation settings<br/>[parametres.js]"]
  node_date_rules["Date rules<br/>[dateUtils.js]"]
  node_mongo[("MongoDB")]
end

subgraph group_ops["Notifications and reporting"]
  node_email["Email delivery<br/>[email.js]"]
  node_export["Excel export<br/>[exportExcel.js]"]
  node_periodic_report["Periodic reports"]
  node_satisfaction_cron["Satisfaction scheduling"]
end

node_participants(("Participants"))
node_admin_users(("Administrators"))

node_participants -->|"registers as client"| node_client_form
node_participants -->|"registers as staff"| node_staff_form
node_client_form -->|"selects date"| node_date_selector
node_client_form -->|"selects slot"| node_slot_selector
node_staff_form -->|"selects date"| node_date_selector
node_staff_form -->|"selects slot"| node_slot_selector
node_client_form -->|"posts registration"| node_frontend_api
node_date_selector -->|"loads settings"| node_frontend_api
node_slot_selector -->|"loads availability"| node_frontend_api
node_reservation_page -->|"manages reservation"| node_frontend_api
node_satisfaction_page -->|"submits feedback"| node_frontend_api
node_admin_users -->|"manages bookings"| node_admin_pages
node_admin_detail -->|"loads details"| node_frontend_api
node_admin_detail -->|"offers export"| node_export
node_auth_state -->|"authenticates via"| node_frontend_api
node_server -->|"mounts routes"| node_auth_routes
node_server -->|"mounts routes"| node_slot_routes
node_server -->|"mounts routes"| node_registration_routes
node_server -->|"mounts routes"| node_other_routes
node_server -->|"connects to"| node_mongo
node_auth_routes -->|"queries admins"| node_admin_model
node_auth_middleware -->|"loads admin"| node_admin_model
node_slot_routes -->|"queries slots"| node_slot_model
node_slot_routes -->|"checks bookings"| node_registration_model
node_slot_routes -->|"reads settings"| node_settings
node_slot_routes -->|"uses date rules"| node_date_rules
node_registration_routes -->|"creates bookings"| node_registration_model
node_registration_routes -->|"checks slots"| node_slot_model
node_registration_routes -->|"sends notices"| node_email
node_registration_routes -->|"exports records"| node_export
node_registration_routes -->|"reads settings"| node_settings
node_registration_routes -->|"applies date rules"| node_date_rules
node_other_routes -->|"supports feedback"| node_registration_model
node_server -->|"starts scheduler"| node_periodic_report
node_server -->|"starts scheduler"| node_satisfaction_cron
node_periodic_report -->|"reads bookings"| node_registration_model
node_periodic_report -->|"sends reports"| node_email
node_periodic_report -->|"creates report"| node_export

click node_client_form "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/FormClientPage.tsx"
click node_staff_form "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/FormPersonnelPage.tsx"
click node_date_selector "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/components/forms/DateSelector.tsx"
click node_slot_selector "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/components/forms/CreneauSelector.tsx"
click node_reservation_page "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/MaReservationPage.tsx"
click node_satisfaction_page "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/SatisfactionPage.tsx"
click node_admin_pages "https://github.com/safachaabane/padel-dashboard/tree/main/frontend/src/pages/admin"
click node_admin_detail "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/admin/DetailsInscriptionsPage.tsx"
click node_auth_state "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/hooks/useAuth.tsx"
click node_frontend_api "https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/utils/api.ts"
click node_server "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/index.js"
click node_auth_routes "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/auth.js"
click node_auth_middleware "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/middleware/auth.js"
click node_role_middleware "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/middleware/role.js"
click node_slot_routes "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/creneaux.js"
click node_registration_routes "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/inscriptions.js"
click node_other_routes "https://github.com/safachaabane/padel-dashboard/tree/main/backend/src/routes"
click node_slot_model "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Creneau.js"
click node_registration_model "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Inscription.js"
click node_admin_model "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Admin.js"
click node_settings "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/parametres.js"
click node_date_rules "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/dateUtils.js"
click node_email "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/email.js"
click node_export "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/exportExcel.js"
click node_periodic_report "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/rapportPeriodiqueCron.js"
click node_satisfaction_cron "https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/satisfactionCron.js"

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_client_form,node_staff_form,node_date_selector,node_slot_selector,node_reservation_page,node_satisfaction_page toneBlue
class node_admin_pages,node_admin_detail toneAmber
class node_auth_state,node_frontend_api,node_server,node_auth_routes,node_auth_middleware,node_role_middleware,node_slot_routes,node_registration_routes,node_other_routes toneMint
class node_slot_model,node_registration_model,node_admin_model,node_settings,node_date_rules,node_mongo toneRose
class node_email,node_export,node_periodic_report,node_satisfaction_cron,node_participants,node_admin_users toneIndigo
```

## Components

### Reservation experience

- [Client registration](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/FormClientPage.tsx): `frontend/src/pages/FormClientPage.tsx`
- [Staff registration](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/FormPersonnelPage.tsx): `frontend/src/pages/FormPersonnelPage.tsx`
- [Date calendar](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/components/forms/DateSelector.tsx): `frontend/src/components/forms/DateSelector.tsx`
- [Slot availability](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/components/forms/CreneauSelector.tsx): `frontend/src/components/forms/CreneauSelector.tsx`
- [My reservation](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/MaReservationPage.tsx): `frontend/src/pages/MaReservationPage.tsx`
- [Satisfaction form](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/SatisfactionPage.tsx): `frontend/src/pages/SatisfactionPage.tsx`

### Administration

- [Admin screens](https://github.com/safachaabane/padel-dashboard/tree/main/frontend/src/pages/admin): `frontend/src/pages/admin`
- [Registration details](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/pages/admin/DetailsInscriptionsPage.tsx): `frontend/src/pages/admin/DetailsInscriptionsPage.tsx`

### API and access

- [Admin auth state](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/hooks/useAuth.tsx): `frontend/src/hooks/useAuth.tsx`
- [API client](https://github.com/safachaabane/padel-dashboard/blob/main/frontend/src/utils/api.ts): `frontend/src/utils/api.ts`
- [Express application](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/index.js): `backend/src/index.js`
- [Authentication routes](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/auth.js): `backend/src/routes/auth.js`
- [JWT authorization](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/middleware/auth.js): `backend/src/middleware/auth.js`
- [Role authorization](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/middleware/role.js): `backend/src/middleware/role.js`
- [Slot routes](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/creneaux.js): `backend/src/routes/creneaux.js`
- [Registration routes](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/routes/inscriptions.js): `backend/src/routes/inscriptions.js`
- [Other API routes](https://github.com/safachaabane/padel-dashboard/tree/main/backend/src/routes): `backend/src/routes`

### Reservation domain

- [Slot model](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Creneau.js): `backend/src/models/Creneau.js`
- [Registration model](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Inscription.js): `backend/src/models/Inscription.js`
- [Admin model](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/models/Admin.js): `backend/src/models/Admin.js`
- [Reservation settings](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/parametres.js): `backend/src/utils/parametres.js`
- [Date rules](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/dateUtils.js): `backend/src/utils/dateUtils.js`
- **MongoDB**

### Notifications and reporting

- [Email delivery](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/email.js): `backend/src/utils/email.js`
- [Excel export](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/exportExcel.js): `backend/src/utils/exportExcel.js`
- [Periodic reports](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/rapportPeriodiqueCron.js): `backend/src/utils/rapportPeriodiqueCron.js`
- [Satisfaction scheduling](https://github.com/safachaabane/padel-dashboard/blob/main/backend/src/utils/satisfactionCron.js): `backend/src/utils/satisfactionCron.js`

### Other components

- **Participants**
- **Administrators**

## Connections

- Participants → Client registration: registers as client
- Participants → Staff registration: registers as staff
- Client registration → Date calendar: selects date (evidence: `frontend/src/pages/FormClientPage.tsx`)
- Client registration → Slot availability: selects slot (evidence: `frontend/src/pages/FormClientPage.tsx`)
- Staff registration → Date calendar: selects date (evidence: `frontend/src/pages/FormPersonnelPage.tsx`)
- Staff registration → Slot availability: selects slot (evidence: `frontend/src/pages/FormPersonnelPage.tsx`)
- Client registration → API client: posts registration (evidence: `frontend/src/pages/FormClientPage.tsx`)
- Date calendar → API client: loads settings (evidence: `frontend/src/components/forms/DateSelector.tsx`)
- Slot availability → API client: loads availability (evidence: `frontend/src/components/forms/CreneauSelector.tsx`)
- My reservation → API client: manages reservation (evidence: `frontend/src/pages/MaReservationPage.tsx`)
- Satisfaction form → API client: submits feedback (evidence: `frontend/src/pages/SatisfactionPage.tsx`)
- Administrators → Admin screens: manages bookings
- Registration details → API client: loads details (evidence: `frontend/src/pages/admin/DetailsInscriptionsPage.tsx`)
- Registration details → Excel export: offers export
- Admin auth state → API client: authenticates via (evidence: `frontend/src/hooks/useAuth.tsx`)
- Express application → Authentication routes: mounts routes (evidence: `backend/src/index.js`)
- Express application → Slot routes: mounts routes (evidence: `backend/src/index.js`)
- Express application → Registration routes: mounts routes (evidence: `backend/src/index.js`)
- Express application → Other API routes: mounts routes (evidence: `backend/src/index.js`)
- Express application → MongoDB: connects to (evidence: `backend/src/index.js`)
- Authentication routes → Admin model: queries admins (evidence: `backend/src/routes/auth.js`)
- JWT authorization → Admin model: loads admin (evidence: `backend/src/middleware/auth.js`)
- Slot routes → Slot model: queries slots (evidence: `backend/src/routes/creneaux.js`)
- Slot routes → Registration model: checks bookings (evidence: `backend/src/routes/creneaux.js`)
- Slot routes → Reservation settings: reads settings (evidence: `backend/src/routes/creneaux.js`)
- Slot routes → Date rules: uses date rules (evidence: `backend/src/routes/creneaux.js`)
- Registration routes → Registration model: creates bookings (evidence: `backend/src/routes/inscriptions.js`)
- Registration routes → Slot model: checks slots (evidence: `backend/src/routes/inscriptions.js`)
- Registration routes → Email delivery: sends notices (evidence: `backend/src/routes/inscriptions.js`)
- Registration routes → Excel export: exports records (evidence: `backend/src/routes/inscriptions.js`)
- Registration routes → Reservation settings: reads settings (evidence: `backend/src/routes/inscriptions.js`)
- Registration routes → Date rules: applies date rules (evidence: `backend/src/routes/inscriptions.js`)
- Other API routes → Registration model: supports feedback (evidence: `backend/src/routes/satisfaction.js`)
- Express application → Periodic reports: starts scheduler (evidence: `backend/src/index.js`)
- Express application → Satisfaction scheduling: starts scheduler (evidence: `backend/src/index.js`)
- Periodic reports → Registration model: reads bookings (evidence: `backend/src/utils/rapportPeriodiqueCron.js`)
- Periodic reports → Email delivery: sends reports (evidence: `backend/src/utils/rapportPeriodiqueCron.js`)
- Periodic reports → Excel export: creates report (evidence: `backend/src/utils/rapportPeriodiqueCron.js`)
