# bakary16/voisilab architecture

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

- Interactive diagram: https://gitdiagram.com/bakary16/voisilab
- Repository: https://github.com/bakary16/voisilab

## Overview

VoisiLab is a FabLab platform with a public site, an admin CMS, and an API. The principal workflow is that visitors browse FabLab content or submit project/workshop requests; administrators manage content, submissions, users, and operations. The supplied evidence describes both a Supabase-backed public/admin setup and an Express/MySQL API, so the graph keeps these as distinct documented subsystems rather than assuming they share a runtime data path. Several domain routes are listed in the source index but were not sampled, so their internal calls are omitted.

Main entry points: [`server/src/server.ts`](https://github.com/bakary16/voisilab/blob/main/server/src/server.ts) (Express server), [`server/src/routes/projectSubmissionRoutes.ts`](https://github.com/bakary16/voisilab/blob/main/server/src/routes/projectSubmissionRoutes.ts) (Project submissions), [`server/src/config/database.ts`](https://github.com/bakary16/voisilab/blob/main/server/src/config/database.ts) (MySQL pool), [`front-end/lib/supabase/email.service.ts`](https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/email.service.ts) (Project email flow)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public Site"]
  node_public_site["Public site"]
  node_project_form["Project requests<br/>[form.tsx]"]
  node_project_submit["Submission handler<br/>[route.ts]"]
  node_public_domain["FabLab content"]
  node_ppn_map["PPN map<br/>[ppn-map.tsx]"]
end

subgraph group_admin["Admin CMS"]
  node_admin_app["Admin application<br/>[App.jsx]"]
  node_admin_routes["Admin routing<br/>[MainRoutes.jsx]"]
  node_admin_content["CMS management"]
  node_admin_auth["Admin sign-in<br/>[Login.jsx]"]
end

subgraph group_api["Backend API"]
  node_api_server["Express server<br/>[server.ts]"]
  node_api_routes["Domain routes"]
  node_project_routes["Project submissions"]
  node_team_routes["Team API<br/>[teamRoutes.ts]"]
  node_stats_routes["Statistics API<br/>[statsRoutes.ts]"]
  node_blog_controller["Blog management<br/>[blogController.ts]"]
  node_workshop_controller["Workshop management"]
  node_notification_controller["Notifications"]
  node_auth_middleware["Access control<br/>[auth.ts]"]
  node_uploads["File uploads<br/>[uploadRoutes.ts]"]
end

subgraph group_data["Data and Integrations"]
  node_supabase_client["Supabase client<br/>[client.ts]"]
  node_public_services["Public data services"]
  node_project_service["Project persistence"]
  node_upload_service["Supabase storage<br/>[upload.service.ts]"]
  node_project_email["Project email flow<br/>[email.service.ts]"]
  node_mysql_pool[("MySQL pool<br/>[database.ts]")]
  node_email_service["Email notifications<br/>[emailService.ts]"]
end

node_visitor(("Visitor"))
node_admin_user(("Administrator"))

node_visitor -->|"browses"| node_public_site
node_visitor -->|"requests project"| node_project_form
node_project_form -.->|"submits"| node_project_submit
node_project_submit -.->|"saves submission"| node_project_service
node_public_site -.->|"loads content"| node_public_services
node_public_site -.->|"shows network"| node_ppn_map
node_admin_user -->|"manages platform"| node_admin_app
node_admin_app -->|"routes views"| node_admin_routes
node_admin_routes -.->|"opens CMS"| node_admin_content
node_admin_app -.->|"provides sign-in"| node_admin_auth
node_api_server -->|"mounts routes"| node_api_routes
node_api_server -->|"mounts submissions"| node_project_routes
node_api_server -->|"mounts team"| node_team_routes
node_api_server -->|"mounts statistics"| node_stats_routes
node_api_routes -.->|"dispatches blog"| node_blog_controller
node_project_routes -->|"reads and writes"| node_mysql_pool
node_project_routes -->|"creates notifications"| node_notification_controller
node_project_routes -->|"protects admin actions"| node_auth_middleware
node_blog_controller -->|"reads and writes"| node_mysql_pool
node_blog_controller -->|"creates notifications"| node_notification_controller
node_workshop_controller -->|"reads and writes"| node_mysql_pool
node_workshop_controller -->|"creates notifications"| node_notification_controller
node_project_service -->|"uses client"| node_supabase_client
node_upload_service -->|"uses client"| node_supabase_client
node_project_email -->|"uploads attachments"| node_upload_service
node_project_email -->|"saves submission"| node_project_service
node_project_email -.->|"emails parties"| node_email_service
node_api_server -->|"checks database"| node_mysql_pool

click node_public_site "https://github.com/bakary16/voisilab/tree/main/front-end/app"
click node_project_form "https://github.com/bakary16/voisilab/blob/main/front-end/app/projet/form.tsx"
click node_project_submit "https://github.com/bakary16/voisilab/blob/main/front-end/app/api/submit-project/route.ts"
click node_public_domain "https://github.com/bakary16/voisilab/tree/main/front-end/app"
click node_ppn_map "https://github.com/bakary16/voisilab/blob/main/front-end/map/ppn-map.tsx"
click node_admin_app "https://github.com/bakary16/voisilab/blob/main/admins/src/App.jsx"
click node_admin_routes "https://github.com/bakary16/voisilab/blob/main/admins/src/routes/MainRoutes.jsx"
click node_admin_content "https://github.com/bakary16/voisilab/tree/main/admins/src/pages/voisilab"
click node_admin_auth "https://github.com/bakary16/voisilab/blob/main/admins/src/pages/auth/Login.jsx"
click node_api_server "https://github.com/bakary16/voisilab/blob/main/server/src/server.ts"
click node_api_routes "https://github.com/bakary16/voisilab/tree/main/server/src/routes"
click node_project_routes "https://github.com/bakary16/voisilab/blob/main/server/src/routes/projectSubmissionRoutes.ts"
click node_team_routes "https://github.com/bakary16/voisilab/blob/main/server/src/routes/teamRoutes.ts"
click node_stats_routes "https://github.com/bakary16/voisilab/blob/main/server/src/routes/statsRoutes.ts"
click node_blog_controller "https://github.com/bakary16/voisilab/blob/main/server/src/controllers/blogController.ts"
click node_workshop_controller "https://github.com/bakary16/voisilab/blob/main/server/src/controllers/workshopController.ts"
click node_notification_controller "https://github.com/bakary16/voisilab/blob/main/server/src/controllers/notificationsController.ts"
click node_auth_middleware "https://github.com/bakary16/voisilab/blob/main/server/src/middlewares/auth.ts"
click node_uploads "https://github.com/bakary16/voisilab/blob/main/server/src/routes/uploadRoutes.ts"
click node_supabase_client "https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/client.ts"
click node_public_services "https://github.com/bakary16/voisilab/tree/main/front-end/lib/supabase"
click node_project_service "https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/projects.service.ts"
click node_upload_service "https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/upload.service.ts"
click node_project_email "https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/email.service.ts"
click node_mysql_pool "https://github.com/bakary16/voisilab/blob/main/server/src/config/database.ts"
click node_email_service "https://github.com/bakary16/voisilab/blob/main/server/src/utils/emailService.ts"

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_public_site,node_project_form,node_project_submit,node_public_domain,node_ppn_map toneBlue
class node_admin_app,node_admin_routes,node_admin_content,node_admin_auth toneAmber
class node_api_server,node_api_routes,node_project_routes,node_team_routes,node_stats_routes,node_blog_controller,node_workshop_controller,node_notification_controller,node_auth_middleware,node_uploads toneMint
class node_supabase_client,node_public_services,node_project_service,node_upload_service,node_project_email,node_mysql_pool,node_email_service toneRose
class node_visitor,node_admin_user toneIndigo
```

## Components

### Public Site

- [Public site](https://github.com/bakary16/voisilab/tree/main/front-end/app): `front-end/app`
- [Project requests](https://github.com/bakary16/voisilab/blob/main/front-end/app/projet/form.tsx): `front-end/app/projet/form.tsx`
- [Submission handler](https://github.com/bakary16/voisilab/blob/main/front-end/app/api/submit-project/route.ts): `front-end/app/api/submit-project/route.ts`
- [FabLab content](https://github.com/bakary16/voisilab/tree/main/front-end/app): `front-end/app`
- [PPN map](https://github.com/bakary16/voisilab/blob/main/front-end/map/ppn-map.tsx): `front-end/map/ppn-map.tsx`

### Admin CMS

- [Admin application](https://github.com/bakary16/voisilab/blob/main/admins/src/App.jsx): `admins/src/App.jsx`
- [Admin routing](https://github.com/bakary16/voisilab/blob/main/admins/src/routes/MainRoutes.jsx): `admins/src/routes/MainRoutes.jsx`
- [CMS management](https://github.com/bakary16/voisilab/tree/main/admins/src/pages/voisilab): `admins/src/pages/voisilab`
- [Admin sign-in](https://github.com/bakary16/voisilab/blob/main/admins/src/pages/auth/Login.jsx): `admins/src/pages/auth/Login.jsx`

### Backend API

- [Express server](https://github.com/bakary16/voisilab/blob/main/server/src/server.ts): `server/src/server.ts`
- [Domain routes](https://github.com/bakary16/voisilab/tree/main/server/src/routes): `server/src/routes`
- [Project submissions](https://github.com/bakary16/voisilab/blob/main/server/src/routes/projectSubmissionRoutes.ts): `server/src/routes/projectSubmissionRoutes.ts`
- [Team API](https://github.com/bakary16/voisilab/blob/main/server/src/routes/teamRoutes.ts): `server/src/routes/teamRoutes.ts`
- [Statistics API](https://github.com/bakary16/voisilab/blob/main/server/src/routes/statsRoutes.ts): `server/src/routes/statsRoutes.ts`
- [Blog management](https://github.com/bakary16/voisilab/blob/main/server/src/controllers/blogController.ts): `server/src/controllers/blogController.ts`
- [Workshop management](https://github.com/bakary16/voisilab/blob/main/server/src/controllers/workshopController.ts): `server/src/controllers/workshopController.ts`
- [Notifications](https://github.com/bakary16/voisilab/blob/main/server/src/controllers/notificationsController.ts): `server/src/controllers/notificationsController.ts`
- [Access control](https://github.com/bakary16/voisilab/blob/main/server/src/middlewares/auth.ts): `server/src/middlewares/auth.ts`
- [File uploads](https://github.com/bakary16/voisilab/blob/main/server/src/routes/uploadRoutes.ts): `server/src/routes/uploadRoutes.ts`

### Data and Integrations

- [Supabase client](https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/client.ts): `front-end/lib/supabase/client.ts`
- [Public data services](https://github.com/bakary16/voisilab/tree/main/front-end/lib/supabase): `front-end/lib/supabase`
- [Project persistence](https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/projects.service.ts): `front-end/lib/supabase/projects.service.ts`
- [Supabase storage](https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/upload.service.ts): `front-end/lib/supabase/upload.service.ts`
- [Project email flow](https://github.com/bakary16/voisilab/blob/main/front-end/lib/supabase/email.service.ts): `front-end/lib/supabase/email.service.ts`
- [MySQL pool](https://github.com/bakary16/voisilab/blob/main/server/src/config/database.ts): `server/src/config/database.ts`
- [Email notifications](https://github.com/bakary16/voisilab/blob/main/server/src/utils/emailService.ts): `server/src/utils/emailService.ts`

### Other components

- **Visitor**
- **Administrator**

## Connections

- Visitor → Public site: browses (evidence: `README.md`)
- Visitor → Project requests: requests project (evidence: `README.md`)
- Project requests → Submission handler: submits
- Submission handler → Project persistence: saves submission
- Public site → Public data services: loads content
- Public site → PPN map: shows network
- Administrator → Admin application: manages platform (evidence: `README.md`)
- Admin application → Admin routing: routes views (evidence: `admins/src/App.jsx`)
- Admin routing → CMS management: opens CMS
- Admin application → Admin sign-in: provides sign-in
- Express server → Domain routes: mounts routes (evidence: `server/src/server.ts`)
- Express server → Project submissions: mounts submissions (evidence: `server/src/server.ts`)
- Express server → Team API: mounts team (evidence: `server/src/server.ts`)
- Express server → Statistics API: mounts statistics (evidence: `server/src/server.ts`)
- Domain routes → Blog management: dispatches blog (evidence: `server/src/routes/blogRoutes.ts`)
- Project submissions → MySQL pool: reads and writes (evidence: `server/src/routes/projectSubmissionRoutes.ts`)
- Project submissions → Notifications: creates notifications (evidence: `server/src/routes/projectSubmissionRoutes.ts`)
- Project submissions → Access control: protects admin actions (evidence: `server/src/routes/projectSubmissionRoutes.ts`)
- Blog management → MySQL pool: reads and writes (evidence: `server/src/controllers/blogController.ts`)
- Blog management → Notifications: creates notifications (evidence: `server/src/controllers/blogController.ts`)
- Workshop management → MySQL pool: reads and writes (evidence: `server/src/controllers/workshopController.ts`)
- Workshop management → Notifications: creates notifications (evidence: `server/src/controllers/workshopController.ts`)
- Project persistence → Supabase client: uses client (evidence: `front-end/lib/supabase/projects.service.ts`)
- Supabase storage → Supabase client: uses client (evidence: `front-end/lib/supabase/upload.service.ts`)
- Project email flow → Supabase storage: uploads attachments (evidence: `front-end/lib/supabase/email.service.ts`)
- Project email flow → Project persistence: saves submission (evidence: `front-end/lib/supabase/email.service.ts`)
- Project email flow → Email notifications: emails parties
- Express server → MySQL pool: checks database (evidence: `server/src/server.ts`)
