# sergibonet/issueflow architecture

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

- Interactive diagram: https://gitdiagram.com/sergibonet/issueflow
- Repository: https://github.com/sergibonet/issueflow

## Overview

IssueFlow is a Symfony incident-management application. Its main workflow lets an agent submit a validated ticket form, persists the resulting ticket, and redirects to its detail view; users can also browse and filter tickets, while API clients can search or retrieve ticket data as JSON. The sampled code shows Doctrine-backed ticket queries, domain entities and an SLA calculator. The README describes an early course project, so the broader capabilities here come from the repository tree and sampled source, not a claim that every route or integration was inspected.

Main entry points: [`src/Controller/TicketController.php`](https://github.com/sergibonet/issueflow/blob/main/src/Controller/TicketController.php) (Ticket workflows), [`src/Entity/Ticket.php`](https://github.com/sergibonet/issueflow/blob/main/src/Entity/Ticket.php) (Ticket entity), [`src/Controller/ApiTicketController.php`](https://github.com/sergibonet/issueflow/blob/main/src/Controller/ApiTicketController.php) (Ticket API), [`src/Repository/TicketRepository.php`](https://github.com/sergibonet/issueflow/blob/main/src/Repository/TicketRepository.php) (Ticket repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_browser["Browser pages"]
  node_ticket_controller["Ticket workflows"]
  node_ticket_forms["Ticket forms<br/>[TicketType.php]"]
  node_filter_form["Filter form"]
end

subgraph group_api["JSON API"]
  node_api_controller["Ticket API"]
end

subgraph group_domain["Ticket domain"]
  node_create_data["Creation data"]
  node_search_criteria["Search criteria"]
  node_ticket["Ticket entity<br/>[Ticket.php]"]
  node_category["Category entity<br/>[Category.php]"]
  node_user["User entity<br/>[User.php]"]
  node_ticket_enums["Status and priority<br/>[TicketStatus.php]"]
  node_sla_contract["SLA contract"]
  node_sla_calculator["SLA calculator"]
end

subgraph group_data["Persistence"]
  node_catalog_contract["Catalog contract"]
  node_ticket_repository["Ticket repository"]
  node_database[("Doctrine database")]
end

node_agent(("Agent or visitor"))
node_api_client(("API client"))

node_agent -->|"uses routes"| node_ticket_controller
node_ticket_controller -->|"builds form"| node_ticket_forms
node_ticket_controller -->|"builds form"| node_filter_form
node_ticket_forms -->|"binds data"| node_create_data
node_filter_form -->|"binds criteria"| node_search_criteria
node_ticket_controller -->|"maps ticket"| node_create_data
node_ticket_controller -->|"persists ticket"| node_ticket
node_ticket_controller -->|"searches and finds"| node_catalog_contract
node_ticket_controller -->|"gets target"| node_sla_contract
node_ticket_controller -->|"renders views"| node_browser
node_ticket_controller -->|"dispatches catalog"| node_ticket_repository
node_api_client -->|"calls endpoints"| node_api_controller
node_api_controller -->|"sets filters"| node_search_criteria
node_api_controller -->|"searches and finds"| node_ticket_repository
node_api_controller -->|"gets target"| node_sla_contract
node_api_controller -->|"serializes fields"| node_ticket
node_ticket_repository -->|"implements"| node_catalog_contract
node_ticket_repository -->|"queries tickets"| node_database
node_ticket_controller -->|"writes ticket"| node_database
node_sla_calculator -.->|"implements"| node_sla_contract
node_sla_calculator -->|"calculates for"| node_ticket
node_ticket -->|"uses values"| node_ticket_enums
node_ticket -->|"references category"| node_category
node_ticket -->|"references assignee"| node_user
node_create_data -->|"constructs ticket"| node_ticket

click node_browser "https://github.com/sergibonet/issueflow/tree/main/templates/ticket"
click node_ticket_controller "https://github.com/sergibonet/issueflow/blob/main/src/Controller/TicketController.php"
click node_ticket_forms "https://github.com/sergibonet/issueflow/blob/main/src/Form/TicketType.php"
click node_filter_form "https://github.com/sergibonet/issueflow/blob/main/src/Form/TicketFilterType.php"
click node_api_controller "https://github.com/sergibonet/issueflow/blob/main/src/Controller/ApiTicketController.php"
click node_create_data "https://github.com/sergibonet/issueflow/blob/main/src/Form/Model/TicketCreateData.php"
click node_search_criteria "https://github.com/sergibonet/issueflow/blob/main/src/Form/Model/TicketSearchCriteria.php"
click node_ticket "https://github.com/sergibonet/issueflow/blob/main/src/Entity/Ticket.php"
click node_category "https://github.com/sergibonet/issueflow/blob/main/src/Entity/Category.php"
click node_user "https://github.com/sergibonet/issueflow/blob/main/src/Entity/User.php"
click node_ticket_enums "https://github.com/sergibonet/issueflow/blob/main/src/model/TicketStatus.php"
click node_catalog_contract "https://github.com/sergibonet/issueflow/blob/main/src/Contract/TicketCatalogInterface.php"
click node_sla_contract "https://github.com/sergibonet/issueflow/blob/main/src/Contract/TicketSlaCalculatorInterface.php"
click node_sla_calculator "https://github.com/sergibonet/issueflow/blob/main/src/Service/TicketSlaCalculator.php"
click node_ticket_repository "https://github.com/sergibonet/issueflow/blob/main/src/Repository/TicketRepository.php"

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_browser,node_ticket_controller,node_ticket_forms,node_filter_form,node_api_client toneBlue
class node_api_controller toneAmber
class node_create_data,node_search_criteria,node_ticket,node_category,node_user,node_ticket_enums,node_sla_contract,node_sla_calculator toneMint
class node_catalog_contract,node_ticket_repository,node_database toneRose
class node_agent toneIndigo
```

## Components

### Web experience

- [Browser pages](https://github.com/sergibonet/issueflow/tree/main/templates/ticket): `templates/ticket`
- [Ticket workflows](https://github.com/sergibonet/issueflow/blob/main/src/Controller/TicketController.php): `src/Controller/TicketController.php`
- [Ticket forms](https://github.com/sergibonet/issueflow/blob/main/src/Form/TicketType.php): `src/Form/TicketType.php`
- [Filter form](https://github.com/sergibonet/issueflow/blob/main/src/Form/TicketFilterType.php): `src/Form/TicketFilterType.php`

### JSON API

- [Ticket API](https://github.com/sergibonet/issueflow/blob/main/src/Controller/ApiTicketController.php): `src/Controller/ApiTicketController.php`

### Ticket domain

- [Creation data](https://github.com/sergibonet/issueflow/blob/main/src/Form/Model/TicketCreateData.php): `src/Form/Model/TicketCreateData.php`
- [Search criteria](https://github.com/sergibonet/issueflow/blob/main/src/Form/Model/TicketSearchCriteria.php): `src/Form/Model/TicketSearchCriteria.php`
- [Ticket entity](https://github.com/sergibonet/issueflow/blob/main/src/Entity/Ticket.php): `src/Entity/Ticket.php`
- [Category entity](https://github.com/sergibonet/issueflow/blob/main/src/Entity/Category.php): `src/Entity/Category.php`
- [User entity](https://github.com/sergibonet/issueflow/blob/main/src/Entity/User.php): `src/Entity/User.php`
- [Status and priority](https://github.com/sergibonet/issueflow/blob/main/src/model/TicketStatus.php): `src/model/TicketStatus.php`
- [SLA contract](https://github.com/sergibonet/issueflow/blob/main/src/Contract/TicketSlaCalculatorInterface.php): `src/Contract/TicketSlaCalculatorInterface.php`
- [SLA calculator](https://github.com/sergibonet/issueflow/blob/main/src/Service/TicketSlaCalculator.php): `src/Service/TicketSlaCalculator.php`

### Persistence

- [Catalog contract](https://github.com/sergibonet/issueflow/blob/main/src/Contract/TicketCatalogInterface.php): `src/Contract/TicketCatalogInterface.php`
- [Ticket repository](https://github.com/sergibonet/issueflow/blob/main/src/Repository/TicketRepository.php): `src/Repository/TicketRepository.php`
- **Doctrine database**

### Other components

- **Agent or visitor**
- **API client**

## Connections

- Agent or visitor → Ticket workflows: uses routes
- Ticket workflows → Ticket forms: builds form (evidence: `src/Controller/TicketController.php`)
- Ticket workflows → Filter form: builds form (evidence: `src/Controller/TicketController.php`)
- Ticket forms → Creation data: binds data (evidence: `src/Form/TicketType.php`)
- Filter form → Search criteria: binds criteria (evidence: `src/Form/TicketFilterType.php`)
- Ticket workflows → Creation data: maps ticket (evidence: `src/Form/Model/TicketCreateData.php`)
- Ticket workflows → Ticket entity: persists ticket (evidence: `src/Controller/TicketController.php`)
- Ticket workflows → Catalog contract: searches and finds (evidence: `src/Controller/TicketController.php`)
- Ticket workflows → SLA contract: gets target (evidence: `src/Controller/TicketController.php`)
- Ticket workflows → Browser pages: renders views (evidence: `src/Controller/TicketController.php`)
- Ticket workflows → Ticket repository: dispatches catalog (evidence: `src/Repository/TicketRepository.php`)
- API client → Ticket API: calls endpoints
- Ticket API → Search criteria: sets filters (evidence: `src/Controller/ApiTicketController.php`)
- Ticket API → Ticket repository: searches and finds (evidence: `src/Controller/ApiTicketController.php`)
- Ticket API → SLA contract: gets target (evidence: `src/Controller/ApiTicketController.php`)
- Ticket API → Ticket entity: serializes fields (evidence: `src/Controller/ApiTicketController.php`)
- Ticket repository → Catalog contract: implements (evidence: `src/Repository/TicketRepository.php`)
- Ticket repository → Doctrine database: queries tickets (evidence: `src/Repository/TicketRepository.php`)
- Ticket workflows → Doctrine database: writes ticket (evidence: `src/Controller/TicketController.php`)
- SLA calculator → SLA contract: implements (evidence: `src/Service/TicketSlaCalculator.php`)
- SLA calculator → Ticket entity: calculates for (evidence: `src/Service/TicketSlaCalculator.php`)
- Ticket entity → Status and priority: uses values (evidence: `src/Entity/Ticket.php`)
- Ticket entity → Category entity: references category (evidence: `src/Entity/Ticket.php`)
- Ticket entity → User entity: references assignee (evidence: `src/Entity/Ticket.php`)
- Creation data → Ticket entity: constructs ticket (evidence: `src/Form/Model/TicketCreateData.php`)
