# connielwy/emb-assessment architecture

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

- Interactive diagram: https://gitdiagram.com/connielwy/emb-assessment
- Repository: https://github.com/connielwy/emb-assessment

## Overview

This is a live EV-charger status and reservation application. Users view public charger status, sign in, book or cancel time slots, and inspect their reservations; the dashboard also offers a concurrency demonstration. The React dashboard uses REST and WebSocket APIs backed by a Go service and PostgreSQL. The README documents simulated status changes, reservation lifecycle reconciliation, and persistent reservations. Backend implementation relationships are limited here: source excerpts show frontend wiring, but not backend call sites, so uncertain backend edges are omitted.

Main entry points: [`frontend/src/lib/api.ts`](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/lib/api.ts) (HTTP and WS client), [`frontend/src/App.tsx`](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/App.tsx) (Dashboard), [`backend/internal/charger/handler.go`](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/handler.go) (Charger endpoints), [`frontend/src/hooks/useAuth.ts`](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useAuth.ts) (Session hook)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_dashboard["Dashboard"]
  node_app["Dashboard<br/>[App.tsx]"]
  node_authhook["Session hook<br/>[useAuth.ts]"]
  node_chargerhook["Live charger hook<br/>[useChargers.ts]"]
  node_reservationhook["Reservation hook<br/>[useReservations.ts]"]
  node_reservationdialog["Booking dialog"]
  node_reservationrow["Reservation row<br/>[ReservationRow.tsx]"]
  node_concurrencyui["Concurrency demo"]
end

subgraph group_api["Application API"]
  node_api_client["HTTP and WS client<br/>[api.ts]"]
  node_server["Go HTTP server<br/>[main.go]"]
  node_router["API routing<br/>[router.go]"]
end

subgraph group_domain["Charger and booking"]
  node_auth["Authentication<br/>[service.go]"]
  node_auth_handler["Auth endpoints<br/>[handler.go]"]
  node_charger_handler["Charger endpoints<br/>[handler.go]"]
  node_charger_service["Charger service<br/>[service.go]"]
  node_reservation_store["Reservation storage<br/>[store.go]"]
  node_lifecycle["Reservation lifecycle<br/>[lifecycle.go]"]
  node_simulator["Status simulator<br/>[simulator.go]"]
end

subgraph group_state["Persistence and live state"]
  node_realtime["WebSocket hub<br/>[hub.go]"]
  node_database[("PostgreSQL<br/>[database.go]")]
  node_migrations["Schema and seed data"]
end

node_user(("Dashboard user"))

node_user -->|"uses"| node_app
node_app -->|"uses"| node_authhook
node_app -->|"uses"| node_chargerhook
node_app -->|"uses"| node_reservationhook
node_app -->|"renders"| node_reservationdialog
node_app -->|"renders"| node_reservationrow
node_app -->|"renders"| node_concurrencyui
node_authhook -->|"calls"| node_api_client
node_chargerhook -->|"fetches and connects"| node_api_client
node_reservationhook -->|"fetches"| node_api_client
node_reservationdialog -->|"submits booking"| node_api_client
node_reservationrow -->|"cancels booking"| node_api_client
node_concurrencyui -->|"runs demo"| node_api_client
node_api_client -->|"requests auth routes"| node_auth_handler
node_api_client -->|"requests charger routes"| node_charger_handler
node_api_client -.->|"requests API routes"| node_router
node_user -.->|"views live status"| node_charger_handler
node_simulator -.->|"publishes status"| node_realtime
node_charger_handler -.->|"serves live feed"| node_realtime
node_reservation_store -.->|"persists bookings"| node_database
node_lifecycle -.->|"reconciles bookings"| node_reservation_store
node_migrations -->|"defines schema"| node_database

click node_app "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/App.tsx"
click node_authhook "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useAuth.ts"
click node_chargerhook "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useChargers.ts"
click node_reservationhook "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useReservations.ts"
click node_reservationdialog "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ReservationDialog.tsx"
click node_reservationrow "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ReservationRow.tsx"
click node_concurrencyui "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ConcurrencyDemo.tsx"
click node_api_client "https://github.com/connielwy/emb-assessment/blob/main/frontend/src/lib/api.ts"
click node_server "https://github.com/connielwy/emb-assessment/blob/main/backend/cmd/server/main.go"
click node_router "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/server/router.go"
click node_auth "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/auth/service.go"
click node_auth_handler "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/auth/handler.go"
click node_charger_handler "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/handler.go"
click node_charger_service "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/service.go"
click node_reservation_store "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/store.go"
click node_lifecycle "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/lifecycle.go"
click node_simulator "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/simulator/simulator.go"
click node_realtime "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/realtime/hub.go"
click node_database "https://github.com/connielwy/emb-assessment/blob/main/backend/internal/database/database.go"
click node_migrations "https://github.com/connielwy/emb-assessment/tree/main/migrations"

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,node_authhook,node_chargerhook,node_reservationhook,node_reservationdialog,node_reservationrow,node_concurrencyui,node_user toneBlue
class node_api_client,node_server,node_router toneAmber
class node_auth,node_auth_handler,node_charger_handler,node_charger_service,node_reservation_store,node_lifecycle,node_simulator toneMint
class node_realtime,node_database,node_migrations toneRose
```

## Components

### Dashboard

- [Dashboard](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Session hook](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useAuth.ts): `frontend/src/hooks/useAuth.ts`
- [Live charger hook](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useChargers.ts): `frontend/src/hooks/useChargers.ts`
- [Reservation hook](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/hooks/useReservations.ts): `frontend/src/hooks/useReservations.ts`
- [Booking dialog](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ReservationDialog.tsx): `frontend/src/components/ReservationDialog.tsx`
- [Reservation row](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ReservationRow.tsx): `frontend/src/components/ReservationRow.tsx`
- [Concurrency demo](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/components/ConcurrencyDemo.tsx): `frontend/src/components/ConcurrencyDemo.tsx`

### Application API

- [HTTP and WS client](https://github.com/connielwy/emb-assessment/blob/main/frontend/src/lib/api.ts): `frontend/src/lib/api.ts`
- [Go HTTP server](https://github.com/connielwy/emb-assessment/blob/main/backend/cmd/server/main.go): `backend/cmd/server/main.go`
- [API routing](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/server/router.go): `backend/internal/server/router.go`

### Charger and booking

- [Authentication](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/auth/service.go): `backend/internal/auth/service.go`
- [Auth endpoints](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/auth/handler.go): `backend/internal/auth/handler.go`
- [Charger endpoints](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/handler.go): `backend/internal/charger/handler.go`
- [Charger service](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/service.go): `backend/internal/charger/service.go`
- [Reservation storage](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/store.go): `backend/internal/charger/store.go`
- [Reservation lifecycle](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/charger/lifecycle.go): `backend/internal/charger/lifecycle.go`
- [Status simulator](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/simulator/simulator.go): `backend/internal/simulator/simulator.go`

### Persistence and live state

- [WebSocket hub](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/realtime/hub.go): `backend/internal/realtime/hub.go`
- [PostgreSQL](https://github.com/connielwy/emb-assessment/blob/main/backend/internal/database/database.go): `backend/internal/database/database.go`
- [Schema and seed data](https://github.com/connielwy/emb-assessment/tree/main/migrations): `migrations`

### Other components

- **Dashboard user**

## Connections

- Dashboard user → Dashboard: uses (evidence: `README.md`)
- Dashboard → Session hook: uses (evidence: `frontend/src/App.tsx`)
- Dashboard → Live charger hook: uses (evidence: `frontend/src/App.tsx`)
- Dashboard → Reservation hook: uses (evidence: `frontend/src/App.tsx`)
- Dashboard → Booking dialog: renders (evidence: `frontend/src/App.tsx`)
- Dashboard → Reservation row: renders (evidence: `frontend/src/App.tsx`)
- Dashboard → Concurrency demo: renders (evidence: `frontend/src/App.tsx`)
- Session hook → HTTP and WS client: calls (evidence: `frontend/src/hooks/useAuth.ts`)
- Live charger hook → HTTP and WS client: fetches and connects (evidence: `frontend/src/hooks/useChargers.ts`)
- Reservation hook → HTTP and WS client: fetches (evidence: `frontend/src/hooks/useReservations.ts`)
- Booking dialog → HTTP and WS client: submits booking (evidence: `frontend/src/components/ReservationDialog.tsx`)
- Reservation row → HTTP and WS client: cancels booking (evidence: `frontend/src/components/ReservationRow.tsx`)
- Concurrency demo → HTTP and WS client: runs demo (evidence: `frontend/src/components/ConcurrencyDemo.tsx`)
- HTTP and WS client → Auth endpoints: requests auth routes (evidence: `frontend/src/lib/api.ts`)
- HTTP and WS client → Charger endpoints: requests charger routes (evidence: `frontend/src/lib/api.ts`)
- HTTP and WS client → API routing: requests API routes
- Dashboard user → Charger endpoints: views live status (evidence: `README.md`)
- Status simulator → WebSocket hub: publishes status (evidence: `README.md`)
- Charger endpoints → WebSocket hub: serves live feed (evidence: `README.md`)
- Reservation storage → PostgreSQL: persists bookings (evidence: `README.md`)
- Reservation lifecycle → Reservation storage: reconciles bookings (evidence: `README.md`)
- Schema and seed data → PostgreSQL: defines schema (evidence: `README.md`)
