# ri-ya-dutta/safar-travel architecture

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

- Interactive diagram: https://gitdiagram.com/ri-ya-dutta/safar-travel
- Repository: https://github.com/ri-ya-dutta/safar-travel

## Overview

Safar is a travel-destination site with public destination browsing, booking and contact submission, plus an administrator workflow for login and managing submitted data. The browser app routes visitors to pages, whose API service sends requests to the Express backend; backend routes dispatch to controllers that read or mutate MongoDB models. Admin access is guarded in the app and, on sampled routes, by token middleware. Major page and domain modules are represented. Some backend route/controller links and page-to-API usage are supported by the SOURCE INDEX rather than inspected excerpts; unsampled admin behavior is kept limited to documented wiring.

Main entry points: [`safar/src/App.jsx`](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/App.jsx) (Application routes), [`safar/src/services/api.js`](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/services/api.js) (API client), [`server/server.js`](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/server.js) (HTTP server), [`server/routes/destinationRoutes.js`](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/destinationRoutes.js) (Destination routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Visitor experience"]
  node_app["Application routes<br/>[App.jsx]"]
  node_home["Home<br/>[Home.jsx]"]
  node_about["About<br/>[About.jsx]"]
  node_destinations["Destination catalog<br/>[Destinations.jsx]"]
  node_destination_detail["Destination details"]
  node_booking_page["Booking form<br/>[Bookings.jsx]"]
  node_contact_page["Contact form<br/>[Contact.jsx]"]
  node_admin_login["Admin login<br/>[AdminLogin.jsx]"]
  node_dashboard["Admin dashboard<br/>[Dashboard.jsx]"]
  node_navbar["Navigation<br/>[Navbar.jsx]"]
  node_footer["Footer<br/>[Footer.jsx]"]
end

subgraph group_client["Client services"]
  node_auth["Auth context<br/>[AuthContext.jsx]"]
  node_api["API client<br/>[api.js]"]
end

subgraph group_http["Backend routing"]
  node_server["HTTP server<br/>[server.js]"]
  node_destination_routes["Destination routes"]
  node_booking_routes["Booking routes<br/>[bookingRoutes.js]"]
  node_contact_routes["Contact routes<br/>[contactRoutes.js]"]
  node_admin_routes["Admin routes<br/>[adminRoutes.js]"]
end

subgraph group_domain["Domain operations"]
  node_destination_controller["Destination operations"]
  node_booking_controller["Booking operations"]
  node_contact_controller["Contact operations"]
  node_admin_controller["Admin operations<br/>[adminController.js]"]
end

subgraph group_data["Persistence and security"]
  node_destination_model["Destination records<br/>[destination.js]"]
  node_booking_model["Booking records<br/>[booking.js]"]
  node_contact_model["Contact records<br/>[contact.js]"]
  node_auth_middleware["Admin token check<br/>[verifyToken.js]"]
  node_mongo[("MongoDB")]
end

node_visitor(("Visitor / admin"))

node_visitor -->|"uses"| node_app
node_app -->|"routes to"| node_home
node_app -->|"routes to"| node_about
node_app -->|"routes to"| node_destinations
node_app -->|"routes to"| node_destination_detail
node_app -->|"routes to"| node_booking_page
node_app -->|"routes to"| node_contact_page
node_app -->|"routes to"| node_admin_login
node_app -->|"guards route"| node_dashboard
node_app -->|"renders"| node_navbar
node_app -->|"renders"| node_footer
node_admin_login -->|"uses login"| node_auth
node_app -->|"checks token"| node_auth
node_auth -->|"calls login"| node_api
node_destinations -->|"fetches catalog"| node_api
node_destination_detail -->|"fetches details"| node_api
node_booking_page -->|"submits booking"| node_api
node_contact_page -->|"submits message"| node_api
node_dashboard -->|"loads admin data"| node_api
node_api -->|"HTTP requests"| node_destination_routes
node_api -->|"HTTP requests"| node_booking_routes
node_api -->|"HTTP requests"| node_contact_routes
node_api -.->|"login request"| node_admin_routes
node_server -->|"mounts routes"| node_destination_routes
node_server -->|"mounts routes"| node_booking_routes
node_server -->|"mounts routes"| node_contact_routes
node_server -->|"mounts routes"| node_admin_routes
node_destination_routes -->|"dispatches"| node_destination_controller
node_booking_routes -->|"dispatches"| node_booking_controller
node_contact_routes -->|"dispatches"| node_contact_controller
node_admin_routes -->|"dispatches"| node_admin_controller
node_destination_routes -->|"guards writes"| node_auth_middleware
node_booking_routes -->|"guards admin"| node_auth_middleware
node_contact_routes -->|"guards admin"| node_auth_middleware
node_destination_controller -->|"reads and writes"| node_destination_model
node_booking_controller -->|"reads and writes"| node_booking_model
node_contact_controller -->|"reads and writes"| node_contact_model
node_server -->|"connects"| node_mongo

click node_app "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/App.jsx"
click node_home "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Home.jsx"
click node_about "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/About.jsx"
click node_destinations "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Destinations/Destinations.jsx"
click node_destination_detail "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Destinations/DestinationDetails.jsx"
click node_booking_page "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Bookings.jsx"
click node_contact_page "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Contact.jsx"
click node_admin_login "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Admin/AdminLogin.jsx"
click node_dashboard "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Admin/Dashboard.jsx"
click node_navbar "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/components/Navbar.jsx"
click node_footer "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/components/Footer.jsx"
click node_auth "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/context/AuthContext.jsx"
click node_api "https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/services/api.js"
click node_server "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/server.js"
click node_destination_routes "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/destinationRoutes.js"
click node_booking_routes "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/bookingRoutes.js"
click node_contact_routes "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/contactRoutes.js"
click node_admin_routes "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/adminRoutes.js"
click node_destination_controller "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/destinationController.js"
click node_booking_controller "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/bookingController.js"
click node_contact_controller "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/contactController.js"
click node_admin_controller "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/adminController.js"
click node_destination_model "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/destination.js"
click node_booking_model "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/booking.js"
click node_contact_model "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/contact.js"
click node_auth_middleware "https://github.com/ri-ya-dutta/safar-travel/blob/main/server/middleware/verifyToken.js"

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_home,node_about,node_destinations,node_destination_detail,node_booking_page,node_contact_page,node_admin_login,node_dashboard,node_navbar,node_footer toneBlue
class node_auth,node_api toneAmber
class node_server,node_destination_routes,node_booking_routes,node_contact_routes,node_admin_routes toneMint
class node_destination_controller,node_booking_controller,node_contact_controller,node_admin_controller toneRose
class node_destination_model,node_booking_model,node_contact_model,node_auth_middleware,node_mongo,node_visitor toneIndigo
```

## Components

### Visitor experience

- [Application routes](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/App.jsx): `safar/src/App.jsx`
- [Home](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Home.jsx): `safar/src/pages/Home.jsx`
- [About](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/About.jsx): `safar/src/pages/About.jsx`
- [Destination catalog](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Destinations/Destinations.jsx): `safar/src/pages/Destinations/Destinations.jsx`
- [Destination details](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Destinations/DestinationDetails.jsx): `safar/src/pages/Destinations/DestinationDetails.jsx`
- [Booking form](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Bookings.jsx): `safar/src/pages/Bookings.jsx`
- [Contact form](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Contact.jsx): `safar/src/pages/Contact.jsx`
- [Admin login](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Admin/AdminLogin.jsx): `safar/src/pages/Admin/AdminLogin.jsx`
- [Admin dashboard](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/pages/Admin/Dashboard.jsx): `safar/src/pages/Admin/Dashboard.jsx`
- [Navigation](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/components/Navbar.jsx): `safar/src/components/Navbar.jsx`
- [Footer](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/components/Footer.jsx): `safar/src/components/Footer.jsx`

### Client services

- [Auth context](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/context/AuthContext.jsx): `safar/src/context/AuthContext.jsx`
- [API client](https://github.com/ri-ya-dutta/safar-travel/blob/main/safar/src/services/api.js): `safar/src/services/api.js`

### Backend routing

- [HTTP server](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/server.js): `server/server.js`
- [Destination routes](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/destinationRoutes.js): `server/routes/destinationRoutes.js`
- [Booking routes](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/bookingRoutes.js): `server/routes/bookingRoutes.js`
- [Contact routes](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/contactRoutes.js): `server/routes/contactRoutes.js`
- [Admin routes](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/routes/adminRoutes.js): `server/routes/adminRoutes.js`

### Domain operations

- [Destination operations](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/destinationController.js): `server/controllers/destinationController.js`
- [Booking operations](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/bookingController.js): `server/controllers/bookingController.js`
- [Contact operations](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/contactController.js): `server/controllers/contactController.js`
- [Admin operations](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/controllers/adminController.js): `server/controllers/adminController.js`

### Persistence and security

- [Destination records](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/destination.js): `server/models/destination.js`
- [Booking records](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/booking.js): `server/models/booking.js`
- [Contact records](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/models/contact.js): `server/models/contact.js`
- [Admin token check](https://github.com/ri-ya-dutta/safar-travel/blob/main/server/middleware/verifyToken.js): `server/middleware/verifyToken.js`
- **MongoDB**

### Other components

- **Visitor / admin**

## Connections

- Visitor / admin → Application routes: uses (evidence: `safar/src/App.jsx`)
- Application routes → Home: routes to (evidence: `safar/src/App.jsx`)
- Application routes → About: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Destination catalog: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Destination details: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Booking form: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Contact form: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Admin login: routes to (evidence: `safar/src/App.jsx`)
- Application routes → Admin dashboard: guards route (evidence: `safar/src/App.jsx`)
- Application routes → Navigation: renders (evidence: `safar/src/App.jsx`)
- Application routes → Footer: renders (evidence: `safar/src/App.jsx`)
- Admin login → Auth context: uses login (evidence: `safar/src/pages/Admin/AdminLogin.jsx`)
- Application routes → Auth context: checks token (evidence: `safar/src/App.jsx`)
- Auth context → API client: calls login (evidence: `safar/src/context/AuthContext.jsx`)
- Destination catalog → API client: fetches catalog (evidence: `safar/src/pages/Destinations/Destinations.jsx`)
- Destination details → API client: fetches details (evidence: `safar/src/pages/Destinations/DestinationDetails.jsx`)
- Booking form → API client: submits booking (evidence: `safar/src/pages/Bookings.jsx`)
- Contact form → API client: submits message (evidence: `safar/src/pages/Contact.jsx`)
- Admin dashboard → API client: loads admin data (evidence: `safar/src/pages/Admin/Dashboard.jsx`)
- API client → Destination routes: HTTP requests (evidence: `safar/src/services/api.js`)
- API client → Booking routes: HTTP requests (evidence: `safar/src/services/api.js`)
- API client → Contact routes: HTTP requests (evidence: `safar/src/services/api.js`)
- API client → Admin routes: login request
- HTTP server → Destination routes: mounts routes (evidence: `server/server.js`)
- HTTP server → Booking routes: mounts routes (evidence: `server/server.js`)
- HTTP server → Contact routes: mounts routes (evidence: `server/server.js`)
- HTTP server → Admin routes: mounts routes (evidence: `server/server.js`)
- Destination routes → Destination operations: dispatches (evidence: `server/routes/destinationRoutes.js`)
- Booking routes → Booking operations: dispatches (evidence: `server/routes/bookingRoutes.js`)
- Contact routes → Contact operations: dispatches (evidence: `server/routes/contactRoutes.js`)
- Admin routes → Admin operations: dispatches (evidence: `server/routes/adminRoutes.js`)
- Destination routes → Admin token check: guards writes (evidence: `server/routes/destinationRoutes.js`)
- Booking routes → Admin token check: guards admin (evidence: `server/routes/bookingRoutes.js`)
- Contact routes → Admin token check: guards admin (evidence: `server/routes/contactRoutes.js`)
- Destination operations → Destination records: reads and writes (evidence: `server/controllers/destinationController.js`)
- Booking operations → Booking records: reads and writes (evidence: `server/controllers/bookingController.js`)
- Contact operations → Contact records: reads and writes (evidence: `server/controllers/contactController.js`)
- HTTP server → MongoDB: connects (evidence: `server/server.js`)
