# sauwin/trip-planner-backend architecture

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

- Interactive diagram: https://gitdiagram.com/sauwin/trip-planner-backend
- Repository: https://github.com/sauwin/trip-planner-backend
- Video tour (about a minute): https://gitdiagram.com/sauwin/trip-planner-backend/video

## Overview

This is a Trip Planner backend exposing authenticated and public HTTP APIs. The main workflow is a user calling the API to discover destinations, organize them into dated trips, and track trip expenses; separate branches handle accounts, preferences, recommendations, and interactions. Routes connect requests to controllers, which delegate domain work to services and shared persistence. The sampled code confirms the trip and authentication flows; several other service implementations were not sampled, so their internal behavior is not expanded here.

Main entry points: [`src/routes`](https://github.com/sauwin/trip-planner-backend/tree/main/src/routes) (Feature routes), [`src/index.ts`](https://github.com/sauwin/trip-planner-backend/blob/main/src/index.ts) (Express server), [`src/routes/trips.routes.ts`](https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/trips.routes.ts) (Trip routes), [`src/services/auth.service.ts`](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/auth.service.ts) (Account service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["HTTP API"]
  node_server["Express server<br/>[index.ts]"]
  node_auth_routes["Auth routes<br/>[auth.routes.ts]"]
  node_destination_routes["Destination routes"]
  node_trip_routes["Trip routes<br/>[trips.routes.ts]"]
  node_other_routes["Feature routes"]
  node_validation["Request validation<br/>[validate.ts]"]
end

subgraph group_identity["Identity"]
  node_auth_middleware["Auth middleware<br/>[auth.middleware.ts]"]
  node_auth_controller["Auth controller<br/>[auth.controller.ts]"]
  node_auth_service["Account service<br/>[auth.service.ts]"]
  node_email_service["Email service<br/>[email.service.ts]"]
  node_jwt["Token utilities<br/>[jwt.ts]"]
end

subgraph group_planning["Trip Planning"]
  node_trip_controller["Trip controller"]
  node_trip_service["Trip service<br/>[trips.service.ts]"]
  node_expense_controller["Expense controller"]
  node_expense_service["Expense service"]
end

subgraph group_discovery["Discovery"]
  node_destination_controller["Destination controller"]
  node_destination_service["Destination service"]
  node_preferences["Preferences"]
  node_recommendations["Recommendations"]
  node_interactions["Interactions"]
  node_metadata["Metadata<br/>[meta.service.ts]"]
end

node_traveler(("API client"))
node_database[("PostgreSQL<br/>[prisma.ts]")]
node_mail_provider["Mail provider"]

node_traveler -->|"sends requests"| node_server
node_server -->|"mounts"| node_auth_routes
node_server -->|"mounts"| node_destination_routes
node_server -->|"mounts"| node_trip_routes
node_server -->|"mounts"| node_other_routes
node_auth_routes -->|"validates input"| node_validation
node_destination_routes -->|"validates input"| node_validation
node_trip_routes -->|"validates input"| node_validation
node_auth_routes -->|"dispatches"| node_auth_controller
node_destination_routes -->|"dispatches"| node_destination_controller
node_trip_routes -->|"protects routes"| node_auth_middleware
node_trip_routes -->|"dispatches"| node_trip_controller
node_other_routes -->|"protects routes"| node_auth_middleware
node_auth_controller -->|"calls"| node_auth_service
node_auth_service -->|"issues tokens"| node_jwt
node_auth_service -->|"requests reset email"| node_email_service
node_email_service -.->|"sends email"| node_mail_provider
node_auth_service -->|"reads and writes"| node_database
node_auth_middleware -->|"verifies tokens"| node_jwt
node_trip_controller -->|"calls"| node_trip_service
node_trip_service -->|"reads and writes"| node_database
node_trip_routes -->|"dispatches nested routes"| node_expense_controller
node_expense_controller -->|"calls"| node_expense_service
node_expense_service -->|"reads and writes"| node_database
node_destination_controller -->|"calls"| node_destination_service
node_destination_service -->|"reads and writes"| node_database
node_other_routes -->|"dispatches"| node_preferences
node_other_routes -->|"dispatches"| node_recommendations
node_other_routes -->|"dispatches"| node_interactions
node_other_routes -->|"dispatches"| node_metadata

click node_server "https://github.com/sauwin/trip-planner-backend/blob/main/src/index.ts"
click node_auth_routes "https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/auth.routes.ts"
click node_destination_routes "https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/destinations.routes.ts"
click node_trip_routes "https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/trips.routes.ts"
click node_other_routes "https://github.com/sauwin/trip-planner-backend/tree/main/src/routes"
click node_validation "https://github.com/sauwin/trip-planner-backend/blob/main/src/middleware/validate.ts"
click node_auth_middleware "https://github.com/sauwin/trip-planner-backend/blob/main/src/middleware/auth.middleware.ts"
click node_auth_controller "https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/auth.controller.ts"
click node_auth_service "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/auth.service.ts"
click node_email_service "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/email.service.ts"
click node_jwt "https://github.com/sauwin/trip-planner-backend/blob/main/src/lib/jwt.ts"
click node_trip_controller "https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/trips.controller.ts"
click node_trip_service "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/trips.service.ts"
click node_expense_controller "https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/expenses.controller.ts"
click node_expense_service "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/expenses.service.ts"
click node_destination_controller "https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/destinations.controller.ts"
click node_destination_service "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/destinations.service.ts"
click node_preferences "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/preferences.service.ts"
click node_recommendations "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/recommendation.service.ts"
click node_interactions "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/interactions.service.ts"
click node_metadata "https://github.com/sauwin/trip-planner-backend/blob/main/src/services/meta.service.ts"
click node_database "https://github.com/sauwin/trip-planner-backend/blob/main/src/lib/prisma.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_server,node_auth_routes,node_destination_routes,node_trip_routes,node_other_routes,node_validation,node_traveler toneBlue
class node_auth_middleware,node_auth_controller,node_auth_service,node_email_service,node_jwt,node_database toneAmber
class node_trip_controller,node_trip_service,node_expense_controller,node_expense_service toneMint
class node_destination_controller,node_destination_service,node_preferences,node_recommendations,node_interactions,node_metadata toneRose
class node_mail_provider toneIndigo
```

## Components

### HTTP API

- [Express server](https://github.com/sauwin/trip-planner-backend/blob/main/src/index.ts): `src/index.ts`
- [Auth routes](https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/auth.routes.ts): `src/routes/auth.routes.ts`
- [Destination routes](https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/destinations.routes.ts): `src/routes/destinations.routes.ts`
- [Trip routes](https://github.com/sauwin/trip-planner-backend/blob/main/src/routes/trips.routes.ts): `src/routes/trips.routes.ts`
- [Feature routes](https://github.com/sauwin/trip-planner-backend/tree/main/src/routes): `src/routes`
- [Request validation](https://github.com/sauwin/trip-planner-backend/blob/main/src/middleware/validate.ts): `src/middleware/validate.ts`

### Identity

- [Auth middleware](https://github.com/sauwin/trip-planner-backend/blob/main/src/middleware/auth.middleware.ts): `src/middleware/auth.middleware.ts`
- [Auth controller](https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/auth.controller.ts): `src/controllers/auth.controller.ts`
- [Account service](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/auth.service.ts): `src/services/auth.service.ts`
- [Email service](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/email.service.ts): `src/services/email.service.ts`
- [Token utilities](https://github.com/sauwin/trip-planner-backend/blob/main/src/lib/jwt.ts): `src/lib/jwt.ts`

### Trip Planning

- [Trip controller](https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/trips.controller.ts): `src/controllers/trips.controller.ts`
- [Trip service](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/trips.service.ts): `src/services/trips.service.ts`
- [Expense controller](https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/expenses.controller.ts): `src/controllers/expenses.controller.ts`
- [Expense service](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/expenses.service.ts): `src/services/expenses.service.ts`

### Discovery

- [Destination controller](https://github.com/sauwin/trip-planner-backend/blob/main/src/controllers/destinations.controller.ts): `src/controllers/destinations.controller.ts`
- [Destination service](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/destinations.service.ts): `src/services/destinations.service.ts`
- [Preferences](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/preferences.service.ts): `src/services/preferences.service.ts`
- [Recommendations](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/recommendation.service.ts): `src/services/recommendation.service.ts`
- [Interactions](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/interactions.service.ts): `src/services/interactions.service.ts`
- [Metadata](https://github.com/sauwin/trip-planner-backend/blob/main/src/services/meta.service.ts): `src/services/meta.service.ts`

### Other components

- **API client**
- [PostgreSQL](https://github.com/sauwin/trip-planner-backend/blob/main/src/lib/prisma.ts): `src/lib/prisma.ts`
- **Mail provider**

## Connections

- API client → Express server: sends requests
- Express server → Auth routes: mounts
- Express server → Destination routes: mounts
- Express server → Trip routes: mounts
- Express server → Feature routes: mounts
- Auth routes → Request validation: validates input
- Destination routes → Request validation: validates input
- Trip routes → Request validation: validates input
- Auth routes → Auth controller: dispatches
- Destination routes → Destination controller: dispatches
- Trip routes → Auth middleware: protects routes
- Trip routes → Trip controller: dispatches
- Feature routes → Auth middleware: protects routes
- Auth controller → Account service: calls
- Account service → Token utilities: issues tokens
- Account service → Email service: requests reset email
- Email service → Mail provider: sends email
- Account service → PostgreSQL: reads and writes
- Auth middleware → Token utilities: verifies tokens
- Trip controller → Trip service: calls
- Trip service → PostgreSQL: reads and writes
- Trip routes → Expense controller: dispatches nested routes
- Expense controller → Expense service: calls
- Expense service → PostgreSQL: reads and writes
- Destination controller → Destination service: calls
- Destination service → PostgreSQL: reads and writes
- Feature routes → Preferences: dispatches
- Feature routes → Recommendations: dispatches
- Feature routes → Interactions: dispatches
- Feature routes → Metadata: dispatches
