# escalacodes/picklepro architecture

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

- Interactive diagram: https://gitdiagram.com/escalacodes/picklepro
- Repository: https://github.com/escalacodes/picklepro

## Overview

PicklePro is a court-booking application: visitors browse courts and availability, users authenticate and book or manage reservations, and administrators manage courts, bookings, payments, users, schedules, and site rules. The React client reaches Spring REST controllers through a shared API client; controllers perform domain checks and read or write PostgreSQL through repositories. The README documents the broader admin capabilities; controller-level wiring is sampled for bookings, courts, authentication, users, and settings, while other UI/API details are documented but not sampled.

Main entry points: [`frontend/src/api.js`](https://github.com/escalacodes/picklepro/blob/main/frontend/src/api.js) (API client), [`frontend/src/App.jsx`](https://github.com/escalacodes/picklepro/blob/main/frontend/src/App.jsx) (Routes and layout), [`backend/src/main/java/com/picklepro/controller/BookingController.java`](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/BookingController.java) (Booking endpoints), [`backend/src/main/java/com/picklepro/controller/CourtController.java`](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/CourtController.java) (Court endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_app["Routes and layout<br/>[App.jsx]"]
  node_authmodal["Login / register<br/>[AuthModal.jsx]"]
  node_authctx["Auth state<br/>[AuthContext.jsx]"]
  node_settingsctx["Settings state"]
  node_apiclient["API client<br/>[api.js]"]
  node_browse["Court discovery<br/>[Courts.jsx]"]
  node_bookui["Booking flow<br/>[Book.jsx]"]
  node_mybookings["My bookings<br/>[MyBookings.jsx]"]
  node_profile["Profile settings<br/>[Profile.jsx]"]
  node_admindash["Admin navigation<br/>[AdminDashboard.jsx]"]
  node_adminviews["Admin tools"]
end

subgraph group_booking["Booking domain"]
  node_courtcontroller["Court endpoints"]
  node_bookingcontroller["Booking endpoints"]
end

subgraph group_admin["Venue administration"]
  node_settingscontroller["Settings endpoints"]
end

subgraph group_identity["Identity and access"]
  node_authcontroller["Auth endpoints"]
  node_usercontroller["User endpoints"]
  node_jwtfilter["JWT request filter<br/>[JwtAuthFilter.java]"]
  node_jwtutils["JWT utilities<br/>[JwtUtils.java]"]
  node_security["Security rules"]
end

subgraph group_persistence["Persistence"]
  node_bookingsrepo["Booking repository"]
  node_courtsrepo["Court repository"]
  node_usersrepo["User repository"]
  node_settingsrepo["Settings repository"]
  node_postgres[("PostgreSQL")]
end

node_visitor(("Visitor / user"))

node_visitor -->|"uses"| node_app
node_app -->|"routes to"| node_browse
node_app -->|"routes to"| node_bookui
node_app -->|"routes to"| node_mybookings
node_app -->|"routes to"| node_profile
node_app -->|"routes to"| node_admindash
node_admindash -->|"navigates"| node_adminviews
node_visitor -->|"submits credentials"| node_authmodal
node_authmodal -->|"invokes"| node_authctx
node_authctx -->|"requests"| node_apiclient
node_browse -->|"requests"| node_apiclient
node_bookui -->|"requests"| node_apiclient
node_mybookings -->|"requests"| node_apiclient
node_profile -->|"requests"| node_apiclient
node_adminviews -->|"requests"| node_apiclient
node_settingsctx -->|"loads settings"| node_apiclient
node_apiclient -->|"HTTP requests"| node_authcontroller
node_apiclient -->|"HTTP requests"| node_usercontroller
node_apiclient -->|"HTTP requests"| node_courtcontroller
node_apiclient -->|"HTTP requests"| node_bookingcontroller
node_apiclient -->|"HTTP requests"| node_settingscontroller
node_authcontroller -->|"reads / writes"| node_usersrepo
node_authcontroller -->|"creates token"| node_jwtutils
node_usercontroller -->|"reads / writes"| node_usersrepo
node_bookingcontroller -->|"reads / writes"| node_bookingsrepo
node_bookingcontroller -->|"checks court"| node_courtsrepo
node_bookingcontroller -->|"loads user"| node_usersrepo
node_bookingcontroller -->|"loads rules"| node_settingsrepo
node_courtcontroller -->|"reads / writes"| node_courtsrepo
node_courtcontroller -->|"checks reservations"| node_bookingsrepo
node_courtcontroller -->|"loads slot rules"| node_settingsrepo
node_settingscontroller -->|"reads / writes"| node_settingsrepo
node_security -->|"configures"| node_jwtfilter
node_jwtfilter -->|"validates token"| node_jwtutils
node_bookingsrepo -->|"persists bookings"| node_postgres
node_courtsrepo -->|"persists courts"| node_postgres
node_usersrepo -->|"persists users"| node_postgres
node_settingsrepo -->|"persists settings"| node_postgres

click node_app "https://github.com/escalacodes/picklepro/blob/main/frontend/src/App.jsx"
click node_authmodal "https://github.com/escalacodes/picklepro/blob/main/frontend/src/components/AuthModal.jsx"
click node_authctx "https://github.com/escalacodes/picklepro/blob/main/frontend/src/context/AuthContext.jsx"
click node_settingsctx "https://github.com/escalacodes/picklepro/blob/main/frontend/src/context/SettingsContext.jsx"
click node_apiclient "https://github.com/escalacodes/picklepro/blob/main/frontend/src/api.js"
click node_browse "https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Courts.jsx"
click node_bookui "https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Book.jsx"
click node_mybookings "https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/MyBookings.jsx"
click node_profile "https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Profile.jsx"
click node_admindash "https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/admin/AdminDashboard.jsx"
click node_adminviews "https://github.com/escalacodes/picklepro/tree/main/frontend/src/pages/admin"
click node_authcontroller "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/AuthController.java"
click node_usercontroller "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/UserController.java"
click node_jwtfilter "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/security/JwtAuthFilter.java"
click node_jwtutils "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/security/JwtUtils.java"
click node_security "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/config/SecurityConfig.java"
click node_courtcontroller "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/CourtController.java"
click node_bookingcontroller "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/BookingController.java"
click node_settingscontroller "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/SettingsController.java"
click node_bookingsrepo "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/BookingRepository.java"
click node_courtsrepo "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/CourtRepository.java"
click node_usersrepo "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/UserRepository.java"
click node_settingsrepo "https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/SettingsRepository.java"

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_authmodal,node_authctx,node_settingsctx,node_apiclient,node_browse,node_bookui,node_mybookings,node_profile,node_admindash,node_adminviews,node_visitor toneBlue
class node_courtcontroller,node_bookingcontroller toneAmber
class node_settingscontroller toneMint
class node_authcontroller,node_usercontroller,node_jwtfilter,node_jwtutils,node_security toneRose
class node_bookingsrepo,node_courtsrepo,node_usersrepo,node_settingsrepo,node_postgres toneIndigo
```

## Components

### Web client

- [Routes and layout](https://github.com/escalacodes/picklepro/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Login / register](https://github.com/escalacodes/picklepro/blob/main/frontend/src/components/AuthModal.jsx): `frontend/src/components/AuthModal.jsx`
- [Auth state](https://github.com/escalacodes/picklepro/blob/main/frontend/src/context/AuthContext.jsx): `frontend/src/context/AuthContext.jsx`
- [Settings state](https://github.com/escalacodes/picklepro/blob/main/frontend/src/context/SettingsContext.jsx): `frontend/src/context/SettingsContext.jsx`
- [API client](https://github.com/escalacodes/picklepro/blob/main/frontend/src/api.js): `frontend/src/api.js`
- [Court discovery](https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Courts.jsx): `frontend/src/pages/Courts.jsx`
- [Booking flow](https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Book.jsx): `frontend/src/pages/Book.jsx`
- [My bookings](https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/MyBookings.jsx): `frontend/src/pages/MyBookings.jsx`
- [Profile settings](https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/Profile.jsx): `frontend/src/pages/Profile.jsx`
- [Admin navigation](https://github.com/escalacodes/picklepro/blob/main/frontend/src/pages/admin/AdminDashboard.jsx): `frontend/src/pages/admin/AdminDashboard.jsx`
- [Admin tools](https://github.com/escalacodes/picklepro/tree/main/frontend/src/pages/admin): `frontend/src/pages/admin`

### Booking domain

- [Court endpoints](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/CourtController.java): `backend/src/main/java/com/picklepro/controller/CourtController.java`
- [Booking endpoints](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/BookingController.java): `backend/src/main/java/com/picklepro/controller/BookingController.java`

### Venue administration

- [Settings endpoints](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/SettingsController.java): `backend/src/main/java/com/picklepro/controller/SettingsController.java`

### Identity and access

- [Auth endpoints](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/AuthController.java): `backend/src/main/java/com/picklepro/controller/AuthController.java`
- [User endpoints](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/controller/UserController.java): `backend/src/main/java/com/picklepro/controller/UserController.java`
- [JWT request filter](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/security/JwtAuthFilter.java): `backend/src/main/java/com/picklepro/security/JwtAuthFilter.java`
- [JWT utilities](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/security/JwtUtils.java): `backend/src/main/java/com/picklepro/security/JwtUtils.java`
- [Security rules](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/config/SecurityConfig.java): `backend/src/main/java/com/picklepro/config/SecurityConfig.java`

### Persistence

- [Booking repository](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/BookingRepository.java): `backend/src/main/java/com/picklepro/repository/BookingRepository.java`
- [Court repository](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/CourtRepository.java): `backend/src/main/java/com/picklepro/repository/CourtRepository.java`
- [User repository](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/UserRepository.java): `backend/src/main/java/com/picklepro/repository/UserRepository.java`
- [Settings repository](https://github.com/escalacodes/picklepro/blob/main/backend/src/main/java/com/picklepro/repository/SettingsRepository.java): `backend/src/main/java/com/picklepro/repository/SettingsRepository.java`
- **PostgreSQL**

### Other components

- **Visitor / user**

## Connections

- Visitor / user → Routes and layout: uses
- Routes and layout → Court discovery: routes to
- Routes and layout → Booking flow: routes to
- Routes and layout → My bookings: routes to
- Routes and layout → Profile settings: routes to
- Routes and layout → Admin navigation: routes to
- Admin navigation → Admin tools: navigates
- Visitor / user → Login / register: submits credentials
- Login / register → Auth state: invokes
- Auth state → API client: requests
- Court discovery → API client: requests
- Booking flow → API client: requests
- My bookings → API client: requests
- Profile settings → API client: requests
- Admin tools → API client: requests
- Settings state → API client: loads settings
- API client → Auth endpoints: HTTP requests
- API client → User endpoints: HTTP requests
- API client → Court endpoints: HTTP requests
- API client → Booking endpoints: HTTP requests
- API client → Settings endpoints: HTTP requests
- Auth endpoints → User repository: reads / writes
- Auth endpoints → JWT utilities: creates token
- User endpoints → User repository: reads / writes
- Booking endpoints → Booking repository: reads / writes
- Booking endpoints → Court repository: checks court
- Booking endpoints → User repository: loads user
- Booking endpoints → Settings repository: loads rules
- Court endpoints → Court repository: reads / writes
- Court endpoints → Booking repository: checks reservations
- Court endpoints → Settings repository: loads slot rules
- Settings endpoints → Settings repository: reads / writes
- Security rules → JWT request filter: configures
- JWT request filter → JWT utilities: validates token
- Booking repository → PostgreSQL: persists bookings
- Court repository → PostgreSQL: persists courts
- User repository → PostgreSQL: persists users
- Settings repository → PostgreSQL: persists settings
