# soutbiaafnts/faro-animal architecture

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

- Interactive diagram: https://gitdiagram.com/soutbiaafnts/faro-animal
- Repository: https://github.com/soutbiaafnts/faro-animal

## Overview

Faro Animal is an internal veterinary-clinic management web application. Authenticated veterinarians manage species and their breeds, register pets linked to breeds, then schedule and maintain appointments linked to pets and veterinarians; appointment records can be exported as PDF. The map follows the documented controller–service–model layers and the sampled route/controller calls. Some CRUD wiring and the dynamic breed-selection client are README-documented but not sampled, so their internal links are omitted where ownership is uncertain.

Main entry points: [`app/Config/Routes.php`](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Config/Routes.php) (Routes and guards), [`app/Controllers/AppointmentController.php`](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/AppointmentController.php) (Appointment controller), [`app/Controllers/PetController.php`](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/PetController.php) (Pet controller), [`app/Controllers/BreedController.php`](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/BreedController.php) (Breed controller)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Web entry and access"]
  node_routes["Routes and guards<br/>[Routes.php]"]
  node_auth_filter["Auth filter<br/>[AuthFilter.php]"]
  node_home_controller["Home controller<br/>[HomeController.php]"]
end

subgraph group_identity["Veterinarian accounts"]
  node_auth_controller["Auth controller<br/>[AuthController.php]"]
  node_auth_service["Auth service<br/>[AuthService.php]"]
  node_user_controller["User controller<br/>[UserController.php]"]
  node_user_service["User service<br/>[UserService.php]"]
  node_user_model["User model<br/>[UserModel.php]"]
  node_mail_library["Mail library<br/>[Mail.php]"]
end

subgraph group_catalog["Clinic catalog"]
  node_specie_controller["Species controller"]
  node_specie_service["Species service<br/>[SpecieService.php]"]
  node_specie_model["Species model<br/>[SpecieModel.php]"]
  node_breed_controller["Breed controller"]
  node_breed_service["Breed service<br/>[BreedService.php]"]
  node_breed_model["Breed model<br/>[BreedModel.php]"]
end

subgraph group_care["Pet care records"]
  node_pet_controller["Pet controller<br/>[PetController.php]"]
  node_pet_service["Pet service<br/>[PetService.php]"]
  node_pet_model["Pet model<br/>[PetModel.php]"]
  node_appointment_controller["Appointment controller"]
  node_appointment_service["Appointment service"]
  node_appointment_model["Appointment model"]
  node_clinic_db[("Clinic database")]
  node_dompdf["Dompdf renderer"]
end

subgraph group_presentation["Web interface"]
  node_browser(("Browser interface"))
  node_main_layout["Shared layout<br/>[main.php]"]
  node_pet_views["Pet pages<br/>[list.php]"]
  node_breed_views["Breed pages<br/>[list.php]"]
  node_appointment_views["Appointment pages<br/>[list.php]"]
end

node_veterinarian(("Veterinarian"))
node_mail_service["Email provider"]

node_veterinarian -->|"uses"| node_browser
node_browser -->|"sends requests"| node_routes
node_routes -->|"dispatches public"| node_home_controller
node_routes -->|"dispatches public"| node_auth_controller
node_routes -->|"dispatches account"| node_user_controller
node_routes -->|"dispatches CRUD"| node_specie_controller
node_routes -->|"dispatches CRUD"| node_breed_controller
node_routes -->|"dispatches CRUD"| node_pet_controller
node_routes -->|"dispatches CRUD"| node_appointment_controller
node_routes -->|"guards restricted"| node_auth_filter
node_auth_controller -->|"delegates auth"| node_auth_service
node_user_controller -->|"delegates account"| node_user_service
node_auth_service -->|"reads and writes"| node_user_model
node_user_service -->|"reads and writes"| node_user_model
node_auth_service -->|"sends reset email"| node_mail_library
node_mail_library -->|"delivers email"| node_mail_service
node_specie_controller -->|"delegates CRUD"| node_specie_service
node_breed_controller -->|"delegates CRUD"| node_breed_service
node_breed_controller -->|"loads species"| node_specie_service
node_breed_service -->|"manages breeds"| node_breed_model
node_specie_service -->|"manages species"| node_specie_model
node_pet_controller -->|"delegates pet work"| node_pet_service
node_pet_controller -->|"loads species"| node_specie_service
node_pet_service -->|"manages pets"| node_pet_model
node_pet_controller -.->|"requests breed options"| node_breed_controller
node_appointment_controller -->|"delegates appointments"| node_appointment_service
node_appointment_controller -->|"loads pets"| node_pet_service
node_appointment_service -->|"manages appointments"| node_appointment_model
node_appointment_service -->|"checks pet"| node_pet_service
node_appointment_service -->|"checks veterinarian"| node_user_service
node_user_model -->|"reads and writes"| node_clinic_db
node_specie_model -->|"reads and writes"| node_clinic_db
node_breed_model -->|"reads and writes"| node_clinic_db
node_pet_model -->|"reads and writes"| node_clinic_db
node_appointment_model -->|"reads and writes"| node_clinic_db
node_pet_controller -->|"renders pages"| node_pet_views
node_breed_controller -->|"renders pages"| node_breed_views
node_appointment_controller -->|"renders pages"| node_appointment_views
node_browser -->|"receives pages"| node_main_layout
node_appointment_controller -->|"renders PDF"| node_dompdf
node_appointment_controller -->|"streams PDF"| node_browser

click node_routes "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Config/Routes.php"
click node_auth_filter "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Filters/AuthFilter.php"
click node_home_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/HomeController.php"
click node_auth_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/AuthController.php"
click node_auth_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/AuthService.php"
click node_user_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/UserController.php"
click node_user_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/UserService.php"
click node_user_model "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/UserModel.php"
click node_mail_library "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Libraries/Mail.php"
click node_specie_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/SpecieController.php"
click node_specie_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/SpecieService.php"
click node_specie_model "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/SpecieModel.php"
click node_breed_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/BreedController.php"
click node_breed_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/BreedService.php"
click node_breed_model "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/BreedModel.php"
click node_pet_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/PetController.php"
click node_pet_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/PetService.php"
click node_pet_model "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/PetModel.php"
click node_appointment_controller "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/AppointmentController.php"
click node_appointment_service "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/AppointmentService.php"
click node_appointment_model "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/AppointmentModel.php"
click node_main_layout "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/layouts/main.php"
click node_pet_views "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/pets/list.php"
click node_breed_views "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/breeds/list.php"
click node_appointment_views "https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/appointments/list.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_routes,node_auth_filter,node_home_controller toneBlue
class node_auth_controller,node_auth_service,node_user_controller,node_user_service,node_user_model,node_mail_library toneAmber
class node_specie_controller,node_specie_service,node_specie_model,node_breed_controller,node_breed_service,node_breed_model toneMint
class node_pet_controller,node_pet_service,node_pet_model,node_appointment_controller,node_appointment_service,node_appointment_model,node_clinic_db,node_dompdf toneRose
class node_browser,node_main_layout,node_pet_views,node_breed_views,node_appointment_views,node_veterinarian,node_mail_service toneIndigo
```

## Components

### Web entry and access

- [Routes and guards](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Config/Routes.php): `app/Config/Routes.php`
- [Auth filter](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Filters/AuthFilter.php): `app/Filters/AuthFilter.php`
- [Home controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/HomeController.php): `app/Controllers/HomeController.php`

### Veterinarian accounts

- [Auth controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/AuthController.php): `app/Controllers/AuthController.php`
- [Auth service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/AuthService.php): `app/Services/AuthService.php`
- [User controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/UserController.php): `app/Controllers/UserController.php`
- [User service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/UserService.php): `app/Services/UserService.php`
- [User model](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/UserModel.php): `app/Models/UserModel.php`
- [Mail library](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Libraries/Mail.php): `app/Libraries/Mail.php`

### Clinic catalog

- [Species controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/SpecieController.php): `app/Controllers/SpecieController.php`
- [Species service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/SpecieService.php): `app/Services/SpecieService.php`
- [Species model](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/SpecieModel.php): `app/Models/SpecieModel.php`
- [Breed controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/BreedController.php): `app/Controllers/BreedController.php`
- [Breed service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/BreedService.php): `app/Services/BreedService.php`
- [Breed model](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/BreedModel.php): `app/Models/BreedModel.php`

### Pet care records

- [Pet controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/PetController.php): `app/Controllers/PetController.php`
- [Pet service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/PetService.php): `app/Services/PetService.php`
- [Pet model](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/PetModel.php): `app/Models/PetModel.php`
- [Appointment controller](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Controllers/AppointmentController.php): `app/Controllers/AppointmentController.php`
- [Appointment service](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Services/AppointmentService.php): `app/Services/AppointmentService.php`
- [Appointment model](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Models/AppointmentModel.php): `app/Models/AppointmentModel.php`
- **Clinic database**
- **Dompdf renderer**

### Web interface

- **Browser interface**
- [Shared layout](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/layouts/main.php): `app/Views/layouts/main.php`
- [Pet pages](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/pets/list.php): `app/Views/pets/list.php`
- [Breed pages](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/breeds/list.php): `app/Views/breeds/list.php`
- [Appointment pages](https://github.com/soutbiaafnts/faro-animal/blob/main/app/Views/appointments/list.php): `app/Views/appointments/list.php`

### Other components

- **Veterinarian**
- **Email provider**

## Connections

- Veterinarian → Browser interface: uses
- Browser interface → Routes and guards: sends requests
- Routes and guards → Home controller: dispatches public
- Routes and guards → Auth controller: dispatches public
- Routes and guards → User controller: dispatches account
- Routes and guards → Species controller: dispatches CRUD
- Routes and guards → Breed controller: dispatches CRUD
- Routes and guards → Pet controller: dispatches CRUD
- Routes and guards → Appointment controller: dispatches CRUD
- Routes and guards → Auth filter: guards restricted
- Auth controller → Auth service: delegates auth
- User controller → User service: delegates account
- Auth service → User model: reads and writes
- User service → User model: reads and writes
- Auth service → Mail library: sends reset email
- Mail library → Email provider: delivers email
- Species controller → Species service: delegates CRUD
- Breed controller → Breed service: delegates CRUD
- Breed controller → Species service: loads species
- Breed service → Breed model: manages breeds
- Species service → Species model: manages species
- Pet controller → Pet service: delegates pet work
- Pet controller → Species service: loads species
- Pet service → Pet model: manages pets
- Pet controller → Breed controller: requests breed options
- Appointment controller → Appointment service: delegates appointments
- Appointment controller → Pet service: loads pets
- Appointment service → Appointment model: manages appointments
- Appointment service → Pet service: checks pet
- Appointment service → User service: checks veterinarian
- User model → Clinic database: reads and writes
- Species model → Clinic database: reads and writes
- Breed model → Clinic database: reads and writes
- Pet model → Clinic database: reads and writes
- Appointment model → Clinic database: reads and writes
- Pet controller → Pet pages: renders pages
- Breed controller → Breed pages: renders pages
- Appointment controller → Appointment pages: renders pages
- Browser interface → Shared layout: receives pages
- Appointment controller → Dompdf renderer: renders PDF
- Appointment controller → Browser interface: streams PDF
