# aydeloreabaquita/pick-a-court architecture

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

- Interactive diagram: https://gitdiagram.com/aydeloreabaquita/pick-a-court
- Repository: https://github.com/aydeloreabaquita/pick-a-court

## Overview

CourtBook is a backend for discovering courts, checking availability, holding and managing reservations, collecting payment, and administering bookings. The principal flow is a player querying courts and conflicts, creating a booking hold, then starting checkout; PayMongo’s signed webhook updates payment and booking state. The graph follows documented API behavior and sampled handlers. Database schema and several routes are represented from the tree and README; their internal wiring is not inferred beyond documented behavior.

Main entry points: [`supabase/migrations/001_initial_schema.sql`](https://github.com/aydeloreabaquita/pick-a-court/blob/main/supabase/migrations/001_initial_schema.sql) (Supabase database), [`lib/auth.ts`](https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/auth.ts) (Auth guards), [`app/api/payments/checkout/route.ts`](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/payments/checkout/route.ts) (Checkout creation), [`app/api/webhooks/paymongo/route.ts`](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/webhooks/paymongo/route.ts) (Payment webhook)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_discovery["Court discovery"]
  node_courts_api["Court listing<br/>[route.ts]"]
  node_availability_api["Availability<br/>[route.ts]"]
end

subgraph group_reservations["Reservations"]
  node_bookings_api["Player bookings<br/>[route.ts]"]
  node_booking_item_api["Cancel booking<br/>[route.ts]"]
  node_admin_bookings_api["Admin bookings<br/>[route.ts]"]
end

subgraph group_payments["Payments"]
  node_checkout_api["Checkout creation<br/>[route.ts]"]
  node_webhook_api["Payment webhook<br/>[route.ts]"]
  node_paymongo_lib["PayMongo client<br/>[paymongo.ts]"]
end

subgraph group_access["Access and data"]
  node_health_api["Health check<br/>[route.ts]"]
  node_auth["Auth guards<br/>[auth.ts]"]
  node_server_client["Session client<br/>[server.ts]"]
  node_admin_client["Service client<br/>[admin.ts]"]
  node_database[("Supabase database")]
end

node_player(("Player / client"))
node_admin_actor(("Facility admin"))
node_paymongo(("PayMongo"))

node_player -->|"lists courts"| node_courts_api
node_player -->|"checks slots"| node_availability_api
node_player -->|"manages bookings"| node_bookings_api
node_player -->|"cancels booking"| node_booking_item_api
node_player -->|"starts checkout"| node_checkout_api
node_admin_actor -->|"views bookings"| node_admin_bookings_api
node_paymongo -->|"sends events"| node_webhook_api
node_courts_api -->|"creates client"| node_server_client
node_courts_api -->|"queries courts"| node_database
node_availability_api -->|"creates client"| node_admin_client
node_availability_api -->|"reads conflicts"| node_database
node_bookings_api -->|"requires user"| node_auth
node_bookings_api -->|"reads / creates"| node_database
node_booking_item_api -->|"requires user"| node_auth
node_booking_item_api -->|"reads / updates"| node_database
node_admin_bookings_api -->|"requires admin"| node_auth
node_admin_bookings_api -->|"queries bookings"| node_database
node_checkout_api -->|"requires user"| node_auth
node_checkout_api -->|"reads / records"| node_database
node_checkout_api -->|"creates session"| node_paymongo_lib
node_paymongo_lib -->|"requests checkout"| node_paymongo
node_webhook_api -->|"verifies signature"| node_paymongo_lib
node_webhook_api -->|"creates client"| node_admin_client
node_webhook_api -->|"records / updates"| node_database
node_auth -->|"creates session"| node_server_client
node_auth -->|"checks claims / role"| node_database
node_server_client -->|"auth access"| node_database

click node_courts_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/courts/route.ts"
click node_availability_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/availability/route.ts"
click node_bookings_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/bookings/route.ts"
click node_booking_item_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/bookings/%5Bid%5D/route.ts"
click node_admin_bookings_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/admin/bookings/route.ts"
click node_checkout_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/payments/checkout/route.ts"
click node_webhook_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/webhooks/paymongo/route.ts"
click node_health_api "https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/health/route.ts"
click node_auth "https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/auth.ts"
click node_server_client "https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/supabase/server.ts"
click node_admin_client "https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/supabase/admin.ts"
click node_paymongo_lib "https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/paymongo.ts"
click node_database "https://github.com/aydeloreabaquita/pick-a-court/blob/main/supabase/migrations/001_initial_schema.sql"

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_courts_api,node_availability_api,node_player toneBlue
class node_bookings_api,node_booking_item_api,node_admin_bookings_api toneAmber
class node_checkout_api,node_webhook_api,node_paymongo_lib toneMint
class node_health_api,node_auth,node_server_client,node_admin_client,node_database toneRose
class node_admin_actor,node_paymongo toneIndigo
```

## Components

### Court discovery

- [Court listing](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/courts/route.ts): `app/api/courts/route.ts`
- [Availability](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/availability/route.ts): `app/api/availability/route.ts`

### Reservations

- [Player bookings](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/bookings/route.ts): `app/api/bookings/route.ts`
- [Cancel booking](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/bookings/%5Bid%5D/route.ts): `app/api/bookings/[id]/route.ts`
- [Admin bookings](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/admin/bookings/route.ts): `app/api/admin/bookings/route.ts`

### Payments

- [Checkout creation](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/payments/checkout/route.ts): `app/api/payments/checkout/route.ts`
- [Payment webhook](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/webhooks/paymongo/route.ts): `app/api/webhooks/paymongo/route.ts`
- [PayMongo client](https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/paymongo.ts): `lib/paymongo.ts`

### Access and data

- [Health check](https://github.com/aydeloreabaquita/pick-a-court/blob/main/app/api/health/route.ts): `app/api/health/route.ts`
- [Auth guards](https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/auth.ts): `lib/auth.ts`
- [Session client](https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/supabase/server.ts): `lib/supabase/server.ts`
- [Service client](https://github.com/aydeloreabaquita/pick-a-court/blob/main/lib/supabase/admin.ts): `lib/supabase/admin.ts`
- [Supabase database](https://github.com/aydeloreabaquita/pick-a-court/blob/main/supabase/migrations/001_initial_schema.sql): `supabase/migrations/001_initial_schema.sql`

### Other components

- **Player / client**
- **Facility admin**
- **PayMongo**

## Connections

- Player / client → Court listing: lists courts
- Player / client → Availability: checks slots
- Player / client → Player bookings: manages bookings
- Player / client → Cancel booking: cancels booking
- Player / client → Checkout creation: starts checkout
- Facility admin → Admin bookings: views bookings
- PayMongo → Payment webhook: sends events
- Court listing → Session client: creates client
- Court listing → Supabase database: queries courts
- Availability → Service client: creates client
- Availability → Supabase database: reads conflicts
- Player bookings → Auth guards: requires user
- Player bookings → Supabase database: reads / creates
- Cancel booking → Auth guards: requires user
- Cancel booking → Supabase database: reads / updates
- Admin bookings → Auth guards: requires admin
- Admin bookings → Supabase database: queries bookings
- Checkout creation → Auth guards: requires user
- Checkout creation → Supabase database: reads / records
- Checkout creation → PayMongo client: creates session
- PayMongo client → PayMongo: requests checkout
- Payment webhook → PayMongo client: verifies signature
- Payment webhook → Service client: creates client
- Payment webhook → Supabase database: records / updates
- Auth guards → Session client: creates session
- Auth guards → Supabase database: checks claims / role
- Session client → Supabase database: auth access
