# masjedi/jpa-website architecture

> Architecture diagram of the GitHub repository masjedi/jpa-website, 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/masjedi/jpa-website
- Repository: https://github.com/masjedi/jpa-website

## Overview

This is a Laravel/Inertia travel-tourism website for Journey to Peace Afghanistan Tours, with public travel content and an admin content-management area. The public workflow routes a visitor request to a controller, which prepares published content and renders an Inertia page; the admin workflow supports editing tours, destinations, articles, gallery, and other operational content. The tree and sampled controllers support the tour, destination, and gallery paths in more detail than other named capabilities, so uncertain subsystem wiring is omitted.

Main entry points: [`app/Http/Controllers/Admin`](https://github.com/masjedi/jpa-website/tree/main/app/Http/Controllers/Admin) (Content administration), [`resources/js/app.tsx`](https://github.com/masjedi/jpa-website/blob/main/resources/js/app.tsx) (Inertia shell), [`routes/web.php`](https://github.com/masjedi/jpa-website/blob/main/routes/web.php) (Web routes), [`resources/js/pages/public`](https://github.com/masjedi/jpa-website/tree/main/resources/js/pages/public) (Public pages)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public travel experience"]
  node_public_pages["Public pages"]
  node_home_controller["Home content<br/>[HomeController.php]"]
  node_tour_controller["Tours and packages<br/>[TourController.php]"]
  node_destination_controller["Destinations"]
  node_article_controller["Articles"]
  node_gallery_controller["Gallery page"]
  node_public_sections["Travel sections"]
  node_services_data["Travel services<br/>[servicesData.ts]"]
end

subgraph group_content["Travel content domain"]
  node_tour_presenter["Tour presenter<br/>[TourPresenter.php]"]
  node_destination_presenter["Destination presenter"]
  node_tour_model[("Tour records<br/>[Tour.php]")]
  node_destination_model[("Destination records<br/>[Destination.php]")]
  node_article_model[("Article records<br/>[Article.php]")]
  node_gallery_model[("Gallery records<br/>[GalleryPhoto.php]")]
  node_media["Media processing<br/>[MediaProcessor.php]"]
end

subgraph group_admin["Administration"]
  node_admin_login["Admin login"]
  node_admin_controllers["Content administration"]
  node_admin_pages["Admin pages"]
  node_admin_layout["Admin layout<br/>[AdminLayout.tsx]"]
end

subgraph group_runtime["Request and presentation"]
  node_entry["HTTP entry<br/>[index.php]"]
  node_bootstrap["Laravel routing<br/>[app.php]"]
  node_web_routes["Web routes<br/>[web.php]"]
  node_admin_routes["Admin routes<br/>[admin.php]"]
  node_inertia["Inertia shell<br/>[app.tsx]"]
  node_public_layout["Public layout<br/>[PublicLayout.tsx]"]
end

node_visitor(("Visitor"))
node_admin_user(("Admin user"))

node_visitor -->|"requests page"| node_entry
node_admin_user -->|"requests admin"| node_entry
node_entry -->|"handles request"| node_bootstrap
node_bootstrap -->|"loads routes"| node_web_routes
node_web_routes -->|"dispatches"| node_home_controller
node_web_routes -->|"dispatches"| node_tour_controller
node_web_routes -->|"dispatches"| node_destination_controller
node_web_routes -->|"dispatches"| node_article_controller
node_web_routes -->|"dispatches"| node_gallery_controller
node_bootstrap -->|"loads routes"| node_admin_routes
node_admin_routes -->|"dispatches"| node_admin_login
node_admin_routes -->|"dispatches"| node_admin_controllers
node_home_controller -->|"renders page"| node_inertia
node_tour_controller -->|"queries"| node_tour_model
node_tour_controller -->|"formats listings"| node_tour_presenter
node_tour_controller -->|"renders page"| node_inertia
node_destination_controller -->|"queries"| node_destination_model
node_destination_controller -->|"formats content"| node_destination_presenter
node_destination_controller -->|"renders page"| node_inertia
node_article_controller -->|"loads content"| node_article_model
node_article_controller -->|"renders page"| node_inertia
node_gallery_controller -->|"loads content"| node_gallery_model
node_gallery_controller -->|"renders page"| node_inertia
node_inertia -->|"displays page"| node_public_pages
node_public_pages -->|"uses layout"| node_public_layout
node_public_pages -->|"composes sections"| node_public_sections
node_public_pages -->|"uses service content"| node_services_data
node_admin_login -->|"renders login"| node_inertia
node_admin_controllers -->|"renders admin pages"| node_admin_pages
node_admin_controllers -->|"manages records"| node_tour_model
node_admin_controllers -->|"manages records"| node_destination_model
node_admin_controllers -->|"manages records"| node_article_model
node_admin_controllers -->|"manages records"| node_gallery_model
node_admin_controllers -->|"stores media"| node_media
node_admin_pages -->|"uses layout"| node_admin_layout

click node_entry "https://github.com/masjedi/jpa-website/blob/main/public/index.php"
click node_bootstrap "https://github.com/masjedi/jpa-website/blob/main/bootstrap/app.php"
click node_web_routes "https://github.com/masjedi/jpa-website/blob/main/routes/web.php"
click node_admin_routes "https://github.com/masjedi/jpa-website/blob/main/routes/admin.php"
click node_inertia "https://github.com/masjedi/jpa-website/blob/main/resources/js/app.tsx"
click node_public_layout "https://github.com/masjedi/jpa-website/blob/main/resources/js/layouts/PublicLayout.tsx"
click node_public_pages "https://github.com/masjedi/jpa-website/tree/main/resources/js/pages/public"
click node_home_controller "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/HomeController.php"
click node_tour_controller "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/TourController.php"
click node_destination_controller "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/DestinationController.php"
click node_article_controller "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/ArticleController.php"
click node_gallery_controller "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/GalleryPageController.php"
click node_public_sections "https://github.com/masjedi/jpa-website/tree/main/resources/js/components/sections"
click node_tour_presenter "https://github.com/masjedi/jpa-website/blob/main/app/Support/Tours/TourPresenter.php"
click node_destination_presenter "https://github.com/masjedi/jpa-website/blob/main/app/Support/Destinations/DestinationPresenter.php"
click node_tour_model "https://github.com/masjedi/jpa-website/blob/main/app/Models/Tour.php"
click node_destination_model "https://github.com/masjedi/jpa-website/blob/main/app/Models/Destination.php"
click node_article_model "https://github.com/masjedi/jpa-website/blob/main/app/Models/Article.php"
click node_gallery_model "https://github.com/masjedi/jpa-website/blob/main/app/Models/GalleryPhoto.php"
click node_admin_login "https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/Admin/Auth/LoginController.php"
click node_admin_controllers "https://github.com/masjedi/jpa-website/tree/main/app/Http/Controllers/Admin"
click node_admin_pages "https://github.com/masjedi/jpa-website/tree/main/resources/js/pages/admin"
click node_admin_layout "https://github.com/masjedi/jpa-website/blob/main/resources/js/layouts/AdminLayout.tsx"
click node_media "https://github.com/masjedi/jpa-website/blob/main/app/Support/Media/MediaProcessor.php"
click node_services_data "https://github.com/masjedi/jpa-website/blob/main/resources/js/data/servicesData.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_public_pages,node_home_controller,node_tour_controller,node_destination_controller,node_article_controller,node_gallery_controller,node_public_sections,node_services_data,node_admin_user toneBlue
class node_tour_presenter,node_destination_presenter,node_tour_model,node_destination_model,node_article_model,node_gallery_model,node_media toneAmber
class node_admin_login,node_admin_controllers,node_admin_pages,node_admin_layout toneMint
class node_entry,node_bootstrap,node_web_routes,node_admin_routes,node_inertia,node_public_layout toneRose
class node_visitor toneIndigo
```

## Components

### Public travel experience

- [Public pages](https://github.com/masjedi/jpa-website/tree/main/resources/js/pages/public): `resources/js/pages/public`
- [Home content](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/HomeController.php): `app/Http/Controllers/HomeController.php`
- [Tours and packages](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/TourController.php): `app/Http/Controllers/TourController.php`
- [Destinations](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/DestinationController.php): `app/Http/Controllers/DestinationController.php`
- [Articles](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/ArticleController.php): `app/Http/Controllers/ArticleController.php`
- [Gallery page](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/GalleryPageController.php): `app/Http/Controllers/GalleryPageController.php`
- [Travel sections](https://github.com/masjedi/jpa-website/tree/main/resources/js/components/sections): `resources/js/components/sections`
- [Travel services](https://github.com/masjedi/jpa-website/blob/main/resources/js/data/servicesData.ts): `resources/js/data/servicesData.ts`

### Travel content domain

- [Tour presenter](https://github.com/masjedi/jpa-website/blob/main/app/Support/Tours/TourPresenter.php): `app/Support/Tours/TourPresenter.php`
- [Destination presenter](https://github.com/masjedi/jpa-website/blob/main/app/Support/Destinations/DestinationPresenter.php): `app/Support/Destinations/DestinationPresenter.php`
- [Tour records](https://github.com/masjedi/jpa-website/blob/main/app/Models/Tour.php): `app/Models/Tour.php`
- [Destination records](https://github.com/masjedi/jpa-website/blob/main/app/Models/Destination.php): `app/Models/Destination.php`
- [Article records](https://github.com/masjedi/jpa-website/blob/main/app/Models/Article.php): `app/Models/Article.php`
- [Gallery records](https://github.com/masjedi/jpa-website/blob/main/app/Models/GalleryPhoto.php): `app/Models/GalleryPhoto.php`
- [Media processing](https://github.com/masjedi/jpa-website/blob/main/app/Support/Media/MediaProcessor.php): `app/Support/Media/MediaProcessor.php`

### Administration

- [Admin login](https://github.com/masjedi/jpa-website/blob/main/app/Http/Controllers/Admin/Auth/LoginController.php): `app/Http/Controllers/Admin/Auth/LoginController.php`
- [Content administration](https://github.com/masjedi/jpa-website/tree/main/app/Http/Controllers/Admin): `app/Http/Controllers/Admin`
- [Admin pages](https://github.com/masjedi/jpa-website/tree/main/resources/js/pages/admin): `resources/js/pages/admin`
- [Admin layout](https://github.com/masjedi/jpa-website/blob/main/resources/js/layouts/AdminLayout.tsx): `resources/js/layouts/AdminLayout.tsx`

### Request and presentation

- [HTTP entry](https://github.com/masjedi/jpa-website/blob/main/public/index.php): `public/index.php`
- [Laravel routing](https://github.com/masjedi/jpa-website/blob/main/bootstrap/app.php): `bootstrap/app.php`
- [Web routes](https://github.com/masjedi/jpa-website/blob/main/routes/web.php): `routes/web.php`
- [Admin routes](https://github.com/masjedi/jpa-website/blob/main/routes/admin.php): `routes/admin.php`
- [Inertia shell](https://github.com/masjedi/jpa-website/blob/main/resources/js/app.tsx): `resources/js/app.tsx`
- [Public layout](https://github.com/masjedi/jpa-website/blob/main/resources/js/layouts/PublicLayout.tsx): `resources/js/layouts/PublicLayout.tsx`

### Other components

- **Visitor**
- **Admin user**

## Connections

- Visitor → HTTP entry: requests page
- Admin user → HTTP entry: requests admin
- HTTP entry → Laravel routing: handles request
- Laravel routing → Web routes: loads routes
- Web routes → Home content: dispatches
- Web routes → Tours and packages: dispatches
- Web routes → Destinations: dispatches
- Web routes → Articles: dispatches
- Web routes → Gallery page: dispatches
- Laravel routing → Admin routes: loads routes
- Admin routes → Admin login: dispatches
- Admin routes → Content administration: dispatches
- Home content → Inertia shell: renders page
- Tours and packages → Tour records: queries
- Tours and packages → Tour presenter: formats listings
- Tours and packages → Inertia shell: renders page
- Destinations → Destination records: queries
- Destinations → Destination presenter: formats content
- Destinations → Inertia shell: renders page
- Articles → Article records: loads content
- Articles → Inertia shell: renders page
- Gallery page → Gallery records: loads content
- Gallery page → Inertia shell: renders page
- Inertia shell → Public pages: displays page
- Public pages → Public layout: uses layout
- Public pages → Travel sections: composes sections
- Public pages → Travel services: uses service content
- Admin login → Inertia shell: renders login
- Content administration → Admin pages: renders admin pages
- Content administration → Tour records: manages records
- Content administration → Destination records: manages records
- Content administration → Article records: manages records
- Content administration → Gallery records: manages records
- Content administration → Media processing: stores media
- Admin pages → Admin layout: uses layout
