# chillingturtl/rentwise architecture

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

- Interactive diagram: https://gitdiagram.com/chillingturtl/rentwise
- Repository: https://github.com/chillingturtl/rentwise

## Overview

#### Purpose and Entry Surface
RentWise is a TypeScript API for car-rental operations: authentication, car catalog management, image uploads, and booking-related domain logic. The application assembly point is `api/src/app.ts`; HTTP entry surfaces are organized under `api/src/routes/auth.route.ts` and `api/src/routes/car.routes.ts`.

#### HTTP and Request Pipeline
Routes dispatch requests to controller handlers, with middleware enforcing cross-cutting concerns before domain execution. Authentication, request validation, upload handling, and centralized failures are separated in:
- `api/src/middleware/authenticator.ts`
- `api/src/middleware/auth.validator.ts`
- `api/src/middleware/car.validator.ts`
- `api/src/middleware/errorHandler.ts`

This establishes the boundary between untrusted HTTP input and application services.

#### Identity and Authorization
Authentication is layered as route/controller/service logic:
- `api/src/controllers/auth.controller.ts`
- `api/src/services/auth.service.ts`
- `api/src/types/auth.types.ts`

Authenticated request state is likely carried through Express type augmentation in `api/src/types/express.d.ts`, then consumed by protected car or booking operations through `authenticator.ts`.

#### Car Catalog and Media Lifecycle
Car management is the primary exposed business area. Controllers handle car and image endpoints, services own workflow decisions, and query modules isolate persistence access:
- `api/src/controllers/car.controller.ts`
- `api/src/controllers/carImage.controller.ts`
- `api/src/services/car.service.ts`
- `api/src/queries/car.queries.ts`
- `api/src/queries/carImage.queries.ts`

Image ingestion crosses an infrastructure boundary: multipart processing is configured through `api/src/config/multer.ts` and `api/src/middleware/upload.middleware.ts`; cloud media storage is configured in `api/src/config/cloudinary.ts` and invoked through `api/src/services/upload.service.ts`. Image public IDs are represented in database migrations, including `api/prisma/migrations/20260802183840_added_public_id_to_car_images/migration.sql`.

#### Booking Domain
Booking rules are represented as a dedicated service/query/type layer:
- `api/src/services/booking.service.ts`
- `api/src/queries/booking.queries.ts`
- `api/src/middleware/booking.validator.ts`
- `api/src/types/booking.types.ts`

Database evolution indicates booking status defaults to pending and booking notes can be optional. Booking persistence therefore forms a relational boundary with cars and other entities, rather than being embedded solely in HTTP handlers.

#### Persistence and Data Model
Prisma is the persistence abstraction. The canonical schema and client boundary are:
- `api/prisma/schema.prisma`
- `api/src/db/prismaClient.ts`
- `api/prisma/migrations/20260715182403_init/migration.sql`

Migrations capture evolving relations, rental-rate optionality, car-image identifiers, and booking semantics. Query modules should be the main callers of the Prisma client, keeping controllers and services insulated from direct ORM details. `api/src/db/seed.ts` supports initializing development or baseline data.

#### Runtime and External Dependencies
The API runs on Node.js with TypeScript, Express-oriented middleware/types, Prisma-managed relational storage, Multer for uploads, and Cloudinary as the external image-hosting service. Runtime environment validation/configuration is centralized in `api/src/env.ts`; application startup wiring and dependency composition belong in `api/src/app.ts`.

Main entry points: [`api/src/routes/car.routes.ts`](https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/car.routes.ts) (Car routes), [`api/src/app.ts`](https://github.com/chillingturtl/rentwise/blob/main/api/src/app.ts) (Application assembly), [`api/src/routes/auth.route.ts`](https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/auth.route.ts) (Auth routes), [`api/src/db/prismaClient.ts`](https://github.com/chillingturtl/rentwise/blob/main/api/src/db/prismaClient.ts) (Prisma client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_http["HTTP boundary"]
  node_app["Application assembly<br/>Express app<br/>[app.ts]"]
  node_auth_routes["Auth routes<br/>route module<br/>[auth.route.ts]"]
  node_car_routes["Car routes<br/>route module<br/>[car.routes.ts]"]
  node_auth_middleware["Authentication middleware<br/>[authenticator.ts]"]
  node_validation["Request validation<br/>middleware<br/>[auth.validator.ts]"]
  node_error_handler["Central error handler<br/>middleware<br/>[errorHandler.ts]"]
  node_auth_controller["Auth controller<br/>[auth.controller.ts]"]
  node_car_controller["Car controller<br/>[car.controller.ts]"]
  node_image_controller["Car image controller"]
end

subgraph group_domain["Application domain"]
  node_auth_service["Authentication service<br/>[auth.service.ts]"]
  node_car_service["Car service<br/>[car.service.ts]"]
  node_booking_service["Booking service<br/>[booking.service.ts]"]
end

subgraph group_persistence["Persistence"]
  node_car_queries["Car data access<br/>query module<br/>[car.queries.ts]"]
  node_booking_queries["Booking data access<br/>query module<br/>[booking.queries.ts]"]
  node_prisma_client[("Prisma client<br/>ORM client<br/>[prismaClient.ts]")]
  node_prisma_schema["Relational schema<br/>Prisma schema<br/>[schema.prisma]"]
end

subgraph group_media["Media infrastructure"]
  node_upload_service["Upload service<br/>[upload.service.ts]"]
  node_upload_middleware["Multipart upload handling<br/>middleware"]
  node_cloudinary_config{{"Cloudinary client<br/>external client config<br/>[cloudinary.ts]"}}
end

node_environment["Runtime environment<br/>environment config<br/>[env.ts]"]

node_environment -->|"configures"| node_app
node_app -->|"mounts"| node_auth_routes
node_app -->|"mounts"| node_car_routes
node_app -->|"registers"| node_error_handler
node_auth_routes -->|"validates"| node_validation
node_auth_routes -->|"dispatches"| node_auth_controller
node_car_routes -->|"protects"| node_auth_middleware
node_car_routes -->|"validates"| node_validation
node_car_routes -->|"processes images"| node_upload_middleware
node_car_routes -->|"dispatches"| node_car_controller
node_car_routes -->|"dispatches"| node_image_controller
node_auth_controller -->|"uses"| node_auth_service
node_car_controller -->|"uses"| node_car_service
node_image_controller -->|"uploads through"| node_upload_service
node_car_service -->|"persists through"| node_car_queries
node_booking_service -->|"persists through"| node_booking_queries
node_car_queries -->|"queries via"| node_prisma_client
node_booking_queries -->|"queries via"| node_prisma_client
node_prisma_client -->|"models"| node_prisma_schema
node_upload_service -->|"stores media via"| node_cloudinary_config

click node_app "https://github.com/chillingturtl/rentwise/blob/main/api/src/app.ts"
click node_auth_routes "https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/auth.route.ts"
click node_car_routes "https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/car.routes.ts"
click node_auth_middleware "https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/authenticator.ts"
click node_validation "https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/auth.validator.ts"
click node_error_handler "https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/errorHandler.ts"
click node_auth_controller "https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/auth.controller.ts"
click node_car_controller "https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/car.controller.ts"
click node_image_controller "https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/carImage.controller.ts"
click node_auth_service "https://github.com/chillingturtl/rentwise/blob/main/api/src/services/auth.service.ts"
click node_car_service "https://github.com/chillingturtl/rentwise/blob/main/api/src/services/car.service.ts"
click node_booking_service "https://github.com/chillingturtl/rentwise/blob/main/api/src/services/booking.service.ts"
click node_upload_service "https://github.com/chillingturtl/rentwise/blob/main/api/src/services/upload.service.ts"
click node_upload_middleware "https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/upload.middleware.ts"
click node_cloudinary_config "https://github.com/chillingturtl/rentwise/blob/main/api/src/config/cloudinary.ts"
click node_car_queries "https://github.com/chillingturtl/rentwise/blob/main/api/src/queries/car.queries.ts"
click node_booking_queries "https://github.com/chillingturtl/rentwise/blob/main/api/src/queries/booking.queries.ts"
click node_prisma_client "https://github.com/chillingturtl/rentwise/blob/main/api/src/db/prismaClient.ts"
click node_prisma_schema "https://github.com/chillingturtl/rentwise/blob/main/api/prisma/schema.prisma"
click node_environment "https://github.com/chillingturtl/rentwise/blob/main/api/src/env.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_app,node_auth_routes,node_car_routes,node_auth_middleware,node_validation,node_error_handler,node_auth_controller,node_car_controller,node_image_controller toneBlue
class node_auth_service,node_car_service,node_booking_service toneAmber
class node_car_queries,node_booking_queries,node_prisma_client,node_prisma_schema toneMint
class node_upload_service,node_upload_middleware,node_cloudinary_config toneRose
class node_environment toneNeutral
```

## Components

### HTTP boundary

Express routes, middleware, and controllers.

- [Application assembly](https://github.com/chillingturtl/rentwise/blob/main/api/src/app.ts): Express app · Composes runtime configuration and HTTP surfaces. · `api/src/app.ts`
- [Auth routes](https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/auth.route.ts): route module · `api/src/routes/auth.route.ts`
- [Car routes](https://github.com/chillingturtl/rentwise/blob/main/api/src/routes/car.routes.ts): route module · `api/src/routes/car.routes.ts`
- [Authentication middleware](https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/authenticator.ts): middleware · Establishes authenticated request state for protected operations. · `api/src/middleware/authenticator.ts`
- [Request validation](https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/auth.validator.ts): middleware · Auth, car, and booking validators reject invalid input. · `api/src/middleware/auth.validator.ts`
- [Central error handler](https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/errorHandler.ts): middleware · `api/src/middleware/errorHandler.ts`
- [Auth controller](https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/auth.controller.ts): controller · `api/src/controllers/auth.controller.ts`
- [Car controller](https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/car.controller.ts): controller · `api/src/controllers/car.controller.ts`
- [Car image controller](https://github.com/chillingturtl/rentwise/blob/main/api/src/controllers/carImage.controller.ts): controller · `api/src/controllers/carImage.controller.ts`

### Application domain

Authentication, catalog, media, and booking workflows.

- [Authentication service](https://github.com/chillingturtl/rentwise/blob/main/api/src/services/auth.service.ts): service · Implements identity workflows using auth types. · `api/src/services/auth.service.ts`
- [Car service](https://github.com/chillingturtl/rentwise/blob/main/api/src/services/car.service.ts): service · Owns car catalog workflows. · `api/src/services/car.service.ts`
- [Booking service](https://github.com/chillingturtl/rentwise/blob/main/api/src/services/booking.service.ts): service · Owns booking rules and status semantics. · `api/src/services/booking.service.ts`

### Persistence

Prisma-backed relational data access.

- [Car data access](https://github.com/chillingturtl/rentwise/blob/main/api/src/queries/car.queries.ts): query module · Includes car and car-image persistence queries. · `api/src/queries/car.queries.ts`
- [Booking data access](https://github.com/chillingturtl/rentwise/blob/main/api/src/queries/booking.queries.ts): query module · `api/src/queries/booking.queries.ts`
- [Prisma client](https://github.com/chillingturtl/rentwise/blob/main/api/src/db/prismaClient.ts): ORM client · Shared relational persistence boundary. · `api/src/db/prismaClient.ts`
- [Relational schema](https://github.com/chillingturtl/rentwise/blob/main/api/prisma/schema.prisma): Prisma schema · Defines cars, images, bookings, and their relations. · `api/prisma/schema.prisma`

### Media infrastructure

Multipart ingestion and external image storage.

- [Upload service](https://github.com/chillingturtl/rentwise/blob/main/api/src/services/upload.service.ts): service · Transfers car media to cloud storage. · `api/src/services/upload.service.ts`
- [Multipart upload handling](https://github.com/chillingturtl/rentwise/blob/main/api/src/middleware/upload.middleware.ts): middleware · Uses Multer to process incoming image files. · `api/src/middleware/upload.middleware.ts`
- [Cloudinary client](https://github.com/chillingturtl/rentwise/blob/main/api/src/config/cloudinary.ts): external client config · `api/src/config/cloudinary.ts`

### Other components

- [Runtime environment](https://github.com/chillingturtl/rentwise/blob/main/api/src/env.ts): environment config · Validates centralized runtime configuration. · `api/src/env.ts`

## Connections

- Runtime environment → Application assembly: configures
- Application assembly → Auth routes: mounts
- Application assembly → Car routes: mounts
- Application assembly → Central error handler: registers
- Auth routes → Request validation: validates
- Auth routes → Auth controller: dispatches
- Car routes → Authentication middleware: protects
- Car routes → Request validation: validates
- Car routes → Multipart upload handling: processes images
- Car routes → Car controller: dispatches
- Car routes → Car image controller: dispatches
- Auth controller → Authentication service: uses
- Car controller → Car service: uses
- Car image controller → Upload service: uploads through
- Car service → Car data access: persists through
- Booking service → Booking data access: persists through
- Car data access → Prisma client: queries via
- Booking data access → Prisma client: queries via
- Prisma client → Relational schema: models
- Upload service → Cloudinary client: stores media via
