# simasch/aiup-petclinic architecture

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

- Interactive diagram: https://gitdiagram.com/simasch/aiup-petclinic
- Repository: https://github.com/simasch/aiup-petclinic

## Overview

AIUP PetClinic is a Vaadin/Spring clinic-management demo: users browse veterinarians, search and manage owners, maintain each owner’s pets, and book visits. The core journey starts at the application shell, finds an owner, opens the owner-and-pet history, then adds or edits a pet or books a visit. Repositories provide jOOQ-backed persistence over PostgreSQL; Flyway migrations define the schema. The README also describes a specification-first development approach and agent guardrails, but those are development practices rather than runtime product components. Relationships are limited to calls visible in excerpts or SOURCE INDEX references.

Main entry points: [`src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java) (Owner details), [`src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java) (Main navigation), [`src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java`](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java) (Owner persistence), [`src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java) (Book pet visit)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Clinic UI"]
  node_app["Application startup"]
  node_shell["Main navigation<br/>[MainLayout.java]"]
  node_welcome["Welcome page<br/>[WelcomeView.java]"]
  node_vets["Veterinarian directory<br/>[VetsView.java]"]
  node_errors["Error handling views"]
end

subgraph group_owner["Owner Management"]
  node_findowners["Find owners"]
  node_ownerdetails["Owner details"]
  node_ownerforms["Owner forms<br/>[OwnerForm.java]"]
  node_ownerroute["Owner route parameters"]
  node_ownerdata["Owner domain<br/>[Owner.java]"]
  node_listing["Owner listings<br/>[OwnerListing.java]"]
end

subgraph group_petvisit["Pets and Visits"]
  node_petviews["Pet add and edit<br/>[AddPetView.java]"]
  node_petform["Pet form<br/>[PetForm.java]"]
  node_petdata["Pet domain and types<br/>[Pet.java]"]
  node_visitview["Book pet visit<br/>[AddVisitView.java]"]
  node_visitform["Visit form<br/>[VisitForm.java]"]
  node_visitdata["Visit domain<br/>[Visit.java]"]
  node_vetdata["Veterinarian domain<br/>[Vet.java]"]
end

subgraph group_persistence["Persistence"]
  node_ownerrepo["Owner persistence"]
  node_petrepo["Pet persistence<br/>[PetRepository.java]"]
  node_visitrepo["Visit persistence"]
  node_vetrepo["Veterinarian data<br/>[VetRepository.java]"]
  node_db[("PostgreSQL schema")]
end

node_user(("Clinic user"))

node_user -->|"uses"| node_shell
node_app -.->|"starts app"| node_shell
node_shell -->|"navigates"| node_welcome
node_shell -->|"navigates"| node_findowners
node_shell -->|"navigates"| node_vets
node_shell -->|"navigates"| node_errors
node_findowners -->|"searches"| node_ownerrepo
node_findowners -->|"navigates"| node_ownerdetails
node_findowners -->|"displays"| node_listing
node_ownerdetails -->|"loads owner"| node_ownerrepo
node_ownerdetails -->|"loads pets"| node_petrepo
node_ownerdetails -->|"loads visits"| node_visitrepo
node_ownerforms -->|"binds fields"| node_ownerdata
node_ownerrepo -->|"queries"| node_db
node_ownerrepo -->|"maps records"| node_ownerdata
node_ownerrepo -->|"builds results"| node_listing
node_petviews -->|"loads and saves"| node_petrepo
node_petviews -->|"uses form"| node_petform
node_petviews -->|"returns to"| node_ownerdetails
node_petform -->|"validates"| node_petdata
node_petrepo -->|"queries"| node_db
node_petrepo -->|"maps records"| node_petdata
node_visitview -->|"checks owner"| node_ownerrepo
node_visitview -->|"checks pet"| node_petrepo
node_visitview -->|"loads and saves"| node_visitrepo
node_visitview -->|"uses form"| node_visitform
node_visitview -->|"returns to"| node_ownerdetails
node_visitform -->|"creates visit"| node_visitdata
node_visitrepo -->|"queries"| node_db
node_visitrepo -->|"maps records"| node_visitdata
node_vets -->|"loads vets"| node_vetrepo
node_vetrepo -->|"maps records"| node_vetdata
node_vetrepo -.->|"queries"| node_db
node_ownerdetails -->|"builds routes"| node_ownerroute

click node_app "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/AiupPetclinicApplication.java"
click node_shell "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java"
click node_welcome "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/welcome/ui/WelcomeView.java"
click node_vets "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/ui/VetsView.java"
click node_errors "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/core/ui/ErrorShellView.java"
click node_findowners "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java"
click node_ownerdetails "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java"
click node_ownerforms "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerForm.java"
click node_ownerroute "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerRouteParameters.java"
click node_ownerrepo "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java"
click node_ownerdata "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/Owner.java"
click node_listing "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerListing.java"
click node_petviews "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java"
click node_petform "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/ui/PetForm.java"
click node_petrepo "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/domain/PetRepository.java"
click node_petdata "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/domain/Pet.java"
click node_visitview "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java"
click node_visitform "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/ui/VisitForm.java"
click node_visitrepo "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/domain/VisitRepository.java"
click node_visitdata "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/domain/Visit.java"
click node_vetrepo "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/domain/VetRepository.java"
click node_vetdata "https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/domain/Vet.java"
click node_db "https://github.com/simasch/aiup-petclinic/blob/main/src/main/resources/db/migration/V1__initial_schema.sql"

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_shell,node_welcome,node_vets,node_errors,node_user toneBlue
class node_findowners,node_ownerdetails,node_ownerforms,node_ownerroute,node_ownerdata,node_listing toneAmber
class node_petviews,node_petform,node_petdata,node_visitview,node_visitform,node_visitdata,node_vetdata toneMint
class node_ownerrepo,node_petrepo,node_visitrepo,node_vetrepo,node_db toneRose
```

## Components

### Clinic UI

- [Application startup](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/AiupPetclinicApplication.java): `src/main/java/ai/unifiedprocess/petclinic/AiupPetclinicApplication.java`
- [Main navigation](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java): `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`
- [Welcome page](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/welcome/ui/WelcomeView.java): `src/main/java/ai/unifiedprocess/petclinic/welcome/ui/WelcomeView.java`
- [Veterinarian directory](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/ui/VetsView.java): `src/main/java/ai/unifiedprocess/petclinic/vet/ui/VetsView.java`
- [Error handling views](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/core/ui/ErrorShellView.java): `src/main/java/ai/unifiedprocess/petclinic/core/ui/ErrorShellView.java`

### Owner Management

- [Find owners](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java): `src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java`
- [Owner details](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java): `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`
- [Owner forms](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerForm.java): `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerForm.java`
- [Owner route parameters](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerRouteParameters.java): `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerRouteParameters.java`
- [Owner domain](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/Owner.java): `src/main/java/ai/unifiedprocess/petclinic/owner/domain/Owner.java`
- [Owner listings](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerListing.java): `src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerListing.java`

### Pets and Visits

- [Pet add and edit](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java): `src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java`
- [Pet form](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/ui/PetForm.java): `src/main/java/ai/unifiedprocess/petclinic/pet/ui/PetForm.java`
- [Pet domain and types](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/domain/Pet.java): `src/main/java/ai/unifiedprocess/petclinic/pet/domain/Pet.java`
- [Book pet visit](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java): `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`
- [Visit form](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/ui/VisitForm.java): `src/main/java/ai/unifiedprocess/petclinic/visit/ui/VisitForm.java`
- [Visit domain](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/domain/Visit.java): `src/main/java/ai/unifiedprocess/petclinic/visit/domain/Visit.java`
- [Veterinarian domain](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/domain/Vet.java): `src/main/java/ai/unifiedprocess/petclinic/vet/domain/Vet.java`

### Persistence

- [Owner persistence](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java): `src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java`
- [Pet persistence](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/pet/domain/PetRepository.java): `src/main/java/ai/unifiedprocess/petclinic/pet/domain/PetRepository.java`
- [Visit persistence](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/visit/domain/VisitRepository.java): `src/main/java/ai/unifiedprocess/petclinic/visit/domain/VisitRepository.java`
- [Veterinarian data](https://github.com/simasch/aiup-petclinic/blob/main/src/main/java/ai/unifiedprocess/petclinic/vet/domain/VetRepository.java): `src/main/java/ai/unifiedprocess/petclinic/vet/domain/VetRepository.java`
- [PostgreSQL schema](https://github.com/simasch/aiup-petclinic/blob/main/src/main/resources/db/migration/V1__initial_schema.sql): `src/main/resources/db/migration/V1__initial_schema.sql`

### Other components

- **Clinic user**

## Connections

- Clinic user → Main navigation: uses (evidence: `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`)
- Application startup → Main navigation: starts app
- Main navigation → Welcome page: navigates (evidence: `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`)
- Main navigation → Find owners: navigates (evidence: `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`)
- Main navigation → Veterinarian directory: navigates (evidence: `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`)
- Main navigation → Error handling views: navigates (evidence: `src/main/java/ai/unifiedprocess/petclinic/core/ui/MainLayout.java`)
- Find owners → Owner persistence: searches (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java`)
- Find owners → Owner details: navigates (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java`)
- Find owners → Owner listings: displays (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/FindOwnersView.java`)
- Owner details → Owner persistence: loads owner (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`)
- Owner details → Pet persistence: loads pets (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`)
- Owner details → Visit persistence: loads visits (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`)
- Owner forms → Owner domain: binds fields (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerForm.java`)
- Owner persistence → PostgreSQL schema: queries (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java`)
- Owner persistence → Owner domain: maps records (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java`)
- Owner persistence → Owner listings: builds results (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/domain/OwnerRepository.java`)
- Pet add and edit → Pet persistence: loads and saves (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java`)
- Pet add and edit → Pet form: uses form (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java`)
- Pet add and edit → Owner details: returns to (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/ui/AddPetView.java`)
- Pet form → Pet domain and types: validates (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/ui/PetForm.java`)
- Pet persistence → PostgreSQL schema: queries (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/domain/PetRepository.java`)
- Pet persistence → Pet domain and types: maps records (evidence: `src/main/java/ai/unifiedprocess/petclinic/pet/domain/PetRepository.java`)
- Book pet visit → Owner persistence: checks owner (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`)
- Book pet visit → Pet persistence: checks pet (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`)
- Book pet visit → Visit persistence: loads and saves (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`)
- Book pet visit → Visit form: uses form (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`)
- Book pet visit → Owner details: returns to (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/AddVisitView.java`)
- Visit form → Visit domain: creates visit (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/ui/VisitForm.java`)
- Visit persistence → PostgreSQL schema: queries (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/domain/VisitRepository.java`)
- Visit persistence → Visit domain: maps records (evidence: `src/main/java/ai/unifiedprocess/petclinic/visit/domain/VisitRepository.java`)
- Veterinarian directory → Veterinarian data: loads vets (evidence: `src/main/java/ai/unifiedprocess/petclinic/vet/ui/VetsView.java`)
- Veterinarian data → Veterinarian domain: maps records (evidence: `src/main/java/ai/unifiedprocess/petclinic/vet/domain/VetRepository.java`)
- Veterinarian data → PostgreSQL schema: queries
- Owner details → Owner route parameters: builds routes (evidence: `src/main/java/ai/unifiedprocess/petclinic/owner/ui/OwnerDetailsView.java`)
