# prjseal/umbraco-13-series architecture

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

- Interactive diagram: https://gitdiagram.com/prjseal/umbraco-13-series
- Repository: https://github.com/prjseal/umbraco-13-series

## Overview

This is an Umbraco 13 tutorial site: editors define structured content, and visitors browse rendered pages, search content, and submit contact enquiries. The clearest traced workflow is search: the page controller reads request parameters, builds a search request, invokes the search service, and prepares page and pagination models for rendering. Contact submissions are validated and sent as email. The tree also shows broader content-rendering and back-office capabilities; their internal wiring is not established by the sampled excerpts, so those links are omitted or marked unverified.

Main entry points: [`Freelancer/Controllers/Render/SearchPageController.cs`](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Render/SearchPageController.cs) (Search page controller), [`Freelancer/Controllers/Surface/ContactSurfaceController.cs`](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Surface/ContactSurfaceController.cs) (Contact controller), [`Freelancer/Models/ContentModels/SearchPageContentModel.cs`](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ContentModels/SearchPageContentModel.cs) (Search page model), [`Freelancer/Services/SearchService.cs`](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Services/SearchService.cs) (Search service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_site["Site experience"]
  node_search_view["Search page view<br/>[SearchPage.cshtml]"]
  node_search_components["Search view components"]
  node_search_result_component["Search results component"]
  node_contact_controller["Contact controller"]
  node_contact_model["Contact form model"]
  node_contact_view["Contact view<br/>[contact.cshtml]"]
  node_page_templates["Page templates"]
end

subgraph group_search["Search"]
  node_search_controller["Search page controller"]
  node_search_request["Search request"]
  node_search_service["Search service<br/>[SearchService.cs]"]
  node_examine[("Examine index")]
  node_search_response["Search response"]
  node_search_page_model["Search page model"]
  node_pagination_helper["Pagination helper"]
  node_pagination_model["Pagination model"]
end

subgraph group_content["Content management"]
  node_content_models["Content models"]
  node_content_views["Block and partial views"]
end

subgraph group_operations["Site operations"]
  node_tag_handler["Tag save handler"]
  node_notification_composer["Notification registration"]
  node_index_component["Search index component<br/>[IndexComponent.cs]"]
  node_index_composer["Index registration<br/>[IndexComposer.cs]"]
  node_site_config["Site configuration"]
end

node_visitor(("Site visitor"))
node_email_sender["Email sender"]
node_umbraco_editor(("Umbraco editor"))

node_visitor -->|"requests search"| node_search_controller
node_search_controller -->|"builds request"| node_search_request
node_search_controller -->|"calls search"| node_search_service
node_search_service -->|"queries index"| node_examine
node_search_service -->|"returns results"| node_search_response
node_search_controller -->|"formats pagination"| node_pagination_helper
node_search_controller -->|"builds pagination"| node_pagination_model
node_search_controller -->|"builds page model"| node_search_page_model
node_search_page_model -->|"holds request"| node_search_request
node_search_page_model -->|"holds results"| node_search_response
node_search_page_model -->|"holds pagination"| node_pagination_model
node_search_controller -->|"renders template"| node_search_view
node_search_components -->|"uses request model"| node_search_request
node_search_result_component -->|"uses results model"| node_search_response
node_visitor -.->|"submits enquiry"| node_contact_controller
node_contact_controller -->|"accepts form model"| node_contact_model
node_contact_controller -->|"sends email"| node_email_sender
node_contact_controller -->|"reads settings"| node_site_config
node_visitor -.->|"views site pages"| node_page_templates
node_umbraco_editor -.->|"authors structured content"| node_content_models
node_content_models -.->|"rendered by"| node_content_views
node_notification_composer -->|"registers handler"| node_tag_handler
node_index_composer -->|"registers component"| node_index_component

click node_search_controller "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Render/SearchPageController.cs"
click node_search_request "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/Search/SearchRequestModel.cs"
click node_search_service "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Services/SearchService.cs"
click node_search_response "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/Search/SearchResponseModel.cs"
click node_search_page_model "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ContentModels/SearchPageContentModel.cs"
click node_pagination_helper "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Helpers/PaginationHelper.cs"
click node_pagination_model "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ViewModels/PaginationViewModel.cs"
click node_search_view "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Views/SearchPage.cshtml"
click node_search_components "https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Components"
click node_search_result_component "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Components/SearchResultsViewComponent.cs"
click node_contact_controller "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Surface/ContactSurfaceController.cs"
click node_contact_model "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ViewModels/ContactViewModel.cs"
click node_contact_view "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Views/Partials/contact.cshtml"
click node_page_templates "https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Views"
click node_content_models "https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Models/Generated"
click node_content_views "https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Views/Partials"
click node_tag_handler "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Notifications/ContentSavingNotificationHandler.cs"
click node_notification_composer "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Composers/RegisterNotificationsComposer.cs"
click node_index_component "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Search/IndexComponent.cs"
click node_index_composer "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Composers/IndexComposer.cs"
click node_site_config "https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Configuration/FreelancerConfig.cs"

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_search_view,node_search_components,node_search_result_component,node_contact_controller,node_contact_model,node_contact_view,node_page_templates toneBlue
class node_search_controller,node_search_request,node_search_service,node_examine,node_search_response,node_search_page_model,node_pagination_helper,node_pagination_model toneAmber
class node_content_models,node_content_views toneMint
class node_tag_handler,node_notification_composer,node_index_component,node_index_composer,node_site_config toneRose
class node_visitor,node_email_sender,node_umbraco_editor toneIndigo
```

## Components

### Site experience

- [Search page view](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Views/SearchPage.cshtml): `Freelancer/Views/SearchPage.cshtml`
- [Search view components](https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Components): `Freelancer/Components`
- [Search results component](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Components/SearchResultsViewComponent.cs): `Freelancer/Components/SearchResultsViewComponent.cs`
- [Contact controller](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Surface/ContactSurfaceController.cs): `Freelancer/Controllers/Surface/ContactSurfaceController.cs`
- [Contact form model](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ViewModels/ContactViewModel.cs): `Freelancer/Models/ViewModels/ContactViewModel.cs`
- [Contact view](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Views/Partials/contact.cshtml): `Freelancer/Views/Partials/contact.cshtml`
- [Page templates](https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Views): `Freelancer/Views`

### Search

- [Search page controller](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Controllers/Render/SearchPageController.cs): `Freelancer/Controllers/Render/SearchPageController.cs`
- [Search request](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/Search/SearchRequestModel.cs): `Freelancer/Models/Search/SearchRequestModel.cs`
- [Search service](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Services/SearchService.cs): `Freelancer/Services/SearchService.cs`
- **Examine index**
- [Search response](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/Search/SearchResponseModel.cs): `Freelancer/Models/Search/SearchResponseModel.cs`
- [Search page model](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ContentModels/SearchPageContentModel.cs): `Freelancer/Models/ContentModels/SearchPageContentModel.cs`
- [Pagination helper](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Helpers/PaginationHelper.cs): `Freelancer/Helpers/PaginationHelper.cs`
- [Pagination model](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Models/ViewModels/PaginationViewModel.cs): `Freelancer/Models/ViewModels/PaginationViewModel.cs`

### Content management

- [Content models](https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Models/Generated): `Freelancer/Models/Generated`
- [Block and partial views](https://github.com/prjseal/umbraco-13-series/tree/main/Freelancer/Views/Partials): `Freelancer/Views/Partials`

### Site operations

- [Tag save handler](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Notifications/ContentSavingNotificationHandler.cs): `Freelancer/Notifications/ContentSavingNotificationHandler.cs`
- [Notification registration](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Composers/RegisterNotificationsComposer.cs): `Freelancer/Composers/RegisterNotificationsComposer.cs`
- [Search index component](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Search/IndexComponent.cs): `Freelancer/Search/IndexComponent.cs`
- [Index registration](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Composers/IndexComposer.cs): `Freelancer/Composers/IndexComposer.cs`
- [Site configuration](https://github.com/prjseal/umbraco-13-series/blob/main/Freelancer/Configuration/FreelancerConfig.cs): `Freelancer/Configuration/FreelancerConfig.cs`

### Other components

- **Site visitor**
- **Email sender**
- **Umbraco editor**

## Connections

- Site visitor → Search page controller: requests search (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search page controller → Search request: builds request (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search page controller → Search service: calls search (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search service → Examine index: queries index (evidence: `Freelancer/Services/SearchService.cs`)
- Search service → Search response: returns results (evidence: `Freelancer/Services/SearchService.cs`)
- Search page controller → Pagination helper: formats pagination (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search page controller → Pagination model: builds pagination (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search page controller → Search page model: builds page model (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search page model → Search request: holds request (evidence: `Freelancer/Models/ContentModels/SearchPageContentModel.cs`)
- Search page model → Search response: holds results (evidence: `Freelancer/Models/ContentModels/SearchPageContentModel.cs`)
- Search page model → Pagination model: holds pagination (evidence: `Freelancer/Models/ContentModels/SearchPageContentModel.cs`)
- Search page controller → Search page view: renders template (evidence: `Freelancer/Controllers/Render/SearchPageController.cs`)
- Search view components → Search request: uses request model (evidence: `Freelancer/Components/SearchFormViewComponent.cs`)
- Search results component → Search response: uses results model (evidence: `Freelancer/Components/SearchResultsViewComponent.cs`)
- Site visitor → Contact controller: submits enquiry
- Contact controller → Contact form model: accepts form model (evidence: `Freelancer/Controllers/Surface/ContactSurfaceController.cs`)
- Contact controller → Email sender: sends email (evidence: `Freelancer/Controllers/Surface/ContactSurfaceController.cs`)
- Contact controller → Site configuration: reads settings (evidence: `Freelancer/Controllers/Surface/ContactSurfaceController.cs`)
- Site visitor → Page templates: views site pages
- Umbraco editor → Content models: authors structured content
- Content models → Block and partial views: rendered by
- Notification registration → Tag save handler: registers handler (evidence: `Freelancer/Composers/RegisterNotificationsComposer.cs`)
- Index registration → Search index component: registers component (evidence: `Freelancer/Composers/IndexComposer.cs`)
