# dimitar-grigorov/garagebuddy architecture

> Architecture diagram of the GitHub repository dimitar-grigorov/garagebuddy, 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/dimitar-grigorov/garagebuddy
- Repository: https://github.com/dimitar-grigorov/garagebuddy

## Overview

Garage Buddy is an ASP.NET Core MVC garage-management application. Its visible workflows cover public home and garage information, administrator maintenance of garage/customer/vehicle data, and account registration, login, and password recovery. The domain also includes jobs, job items, parts, documents, and statuses for service tracking, although the README marks service tracking as work in progress. The graph preserves those domain stages; unsampled job implementation is represented at its existing service directory. Edges are limited to relationships documented in the README or visible in the supplied excerpts and SOURCE INDEX.

Main entry points: [`src/Data/GarageBuddy.Data/ApplicationDbContext.cs`](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/ApplicationDbContext.cs) (Application database), [`src/Services/GarageBuddy.Services.Data/Services`](https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Services/GarageBuddy.Services.Data/Services) (Job services), [`src/Web/GarageBuddy.Web/Areas/Admin/Controllers`](https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Web/GarageBuddy.Web/Areas/Admin/Controllers) (Admin management), [`src/Services/GarageBuddy.Services.Data/Services/GarageService.cs`](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/GarageService.cs) (Garage service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_home["Home pages<br/>[HomeController.cs]"]
  node_adminui["Admin management<br/>[Controllers]"]
  node_accounts["Account flows<br/>[UserController.cs]"]
  node_basecontroller["Controller base<br/>[BaseController.cs]"]
  node_view_renderer["Mail view renderer<br/>[ViewRenderer.cs]"]
end

subgraph group_services["Application services"]
  node_garage_service["Garage service<br/>[GarageService.cs]"]
  node_vehicle_services["Vehicle services<br/>[Services]"]
  node_customer_services["Customer services<br/>[CustomerService.cs]"]
  node_user_service["User service<br/>[UserService.cs]"]
  node_job_services["Job services<br/>[Services]"]
end

subgraph group_domain["Garage domain"]
  node_garage_model["Garage model<br/>[Garage.cs]"]
  node_vehicle_model["Vehicle model<br/>[Vehicle.cs]"]
  node_customer_model["Customer model<br/>[Customer.cs]"]
  node_vehicle_catalog["Vehicle catalog<br/>[Brand.cs]"]
  node_job_model["Job records<br/>[Job.cs]"]
  node_job_details["Job details<br/>[JobItem.cs]"]
  node_job_documents["Job documents<br/>[JobDocument.cs]"]
  node_job_parts["Job parts<br/>[JobItemPart.cs]"]
  node_job_status["Job statuses<br/>[JobStatus.cs]"]
end

subgraph group_persistence["Persistence and setup"]
  node_database[("Application database")]
  node_repositories["EF repositories<br/>[EfRepository.cs]"]
  node_seeders["Initial data seeders"]
end

subgraph group_messaging["Messaging"]
  node_email_service["Email service<br/>[EmailService.cs]"]
  node_mail_sender["SMTP sender<br/>[SmtpMailSender.cs]"]
end

node_visitor(("Mechanic or visitor"))
node_admin(("Garage administrator"))
node_email_provider["SMTP server"]

node_visitor -->|"opens"| node_home
node_admin -.->|"manages records"| node_adminui
node_adminui -->|"calls"| node_garage_service
node_adminui -->|"calls"| node_vehicle_services
node_adminui -->|"calls"| node_customer_services
node_home -->|"queries"| node_garage_service
node_home -->|"queries brands"| node_vehicle_services
node_accounts -->|"authenticates"| node_user_service
node_accounts -->|"sends reset mail"| node_email_service
node_accounts -->|"renders mail view"| node_view_renderer
node_basecontroller -->|"sanitizes input"| node_visitor
node_garage_service -->|"queries and saves"| node_repositories
node_garage_service -->|"maps"| node_garage_model
node_repositories -->|"accesses"| node_database
node_database -->|"persists"| node_garage_model
node_database -->|"persists"| node_vehicle_model
node_database -->|"persists"| node_customer_model
node_database -->|"persists"| node_job_model
node_database -->|"persists"| node_job_details
node_database -->|"persists"| node_job_documents
node_database -->|"persists"| node_job_parts
node_database -->|"persists"| node_job_status
node_database -->|"persists"| node_vehicle_catalog
node_job_services -.->|"handles"| node_job_model
node_job_services -.->|"handles"| node_job_details
node_job_services -.->|"handles"| node_job_documents
node_job_services -.->|"handles"| node_job_parts
node_job_services -.->|"handles"| node_job_status
node_seeders -->|"seeds"| node_database
node_email_service -->|"sends through"| node_mail_sender
node_mail_sender -.->|"delivers mail"| node_email_provider

click node_home "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/HomeController.cs"
click node_adminui "https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Web/GarageBuddy.Web/Areas/Admin/Controllers"
click node_accounts "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/UserController.cs"
click node_basecontroller "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/BaseController.cs"
click node_garage_service "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/GarageService.cs"
click node_vehicle_services "https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Services/GarageBuddy.Services.Data/Services"
click node_customer_services "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/CustomerService.cs"
click node_user_service "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/UserService.cs"
click node_job_services "https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Services/GarageBuddy.Services.Data/Services"
click node_garage_model "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Garage.cs"
click node_vehicle_model "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Vehicle/Vehicle.cs"
click node_customer_model "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Customer.cs"
click node_vehicle_catalog "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Vehicle/Brand.cs"
click node_job_model "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/Job.cs"
click node_job_details "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobItem.cs"
click node_job_documents "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobDocument.cs"
click node_job_parts "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobItemPart.cs"
click node_job_status "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobStatus.cs"
click node_database "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/ApplicationDbContext.cs"
click node_repositories "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/Repositories/EfRepository.cs"
click node_seeders "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/Seeding/ApplicationDbContextSeeder.cs"
click node_email_service "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Messaging/Services/EmailService.cs"
click node_mail_sender "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Messaging/Email/SmtpMailSender.cs"
click node_view_renderer "https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web.Infrastructure/ViewRenderer/ViewRenderer.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_home,node_adminui,node_accounts,node_basecontroller,node_view_renderer toneBlue
class node_garage_service,node_vehicle_services,node_customer_services,node_user_service,node_job_services toneAmber
class node_garage_model,node_vehicle_model,node_customer_model,node_vehicle_catalog,node_job_model,node_job_details,node_job_documents,node_job_parts,node_job_status,node_email_provider toneMint
class node_database,node_repositories,node_seeders toneRose
class node_email_service,node_mail_sender,node_visitor,node_admin toneIndigo
```

## Components

### Web application

- [Home pages](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/HomeController.cs): `src/Web/GarageBuddy.Web/Controllers/HomeController.cs`
- [Admin management](https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Web/GarageBuddy.Web/Areas/Admin/Controllers): `src/Web/GarageBuddy.Web/Areas/Admin/Controllers`
- [Account flows](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/UserController.cs): `src/Web/GarageBuddy.Web/Controllers/UserController.cs`
- [Controller base](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web/Controllers/BaseController.cs): `src/Web/GarageBuddy.Web/Controllers/BaseController.cs`
- [Mail view renderer](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Web/GarageBuddy.Web.Infrastructure/ViewRenderer/ViewRenderer.cs): `src/Web/GarageBuddy.Web.Infrastructure/ViewRenderer/ViewRenderer.cs`

### Application services

- [Garage service](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/GarageService.cs): `src/Services/GarageBuddy.Services.Data/Services/GarageService.cs`
- [Vehicle services](https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Services/GarageBuddy.Services.Data/Services): `src/Services/GarageBuddy.Services.Data/Services`
- [Customer services](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/CustomerService.cs): `src/Services/GarageBuddy.Services.Data/Services/CustomerService.cs`
- [User service](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Data/Services/UserService.cs): `src/Services/GarageBuddy.Services.Data/Services/UserService.cs`
- [Job services](https://github.com/dimitar-grigorov/garagebuddy/tree/main/src/Services/GarageBuddy.Services.Data/Services): `src/Services/GarageBuddy.Services.Data/Services`

### Garage domain

- [Garage model](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Garage.cs): `src/Data/GarageBuddy.Data.Models/Garage.cs`
- [Vehicle model](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Vehicle/Vehicle.cs): `src/Data/GarageBuddy.Data.Models/Vehicle/Vehicle.cs`
- [Customer model](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Customer.cs): `src/Data/GarageBuddy.Data.Models/Customer.cs`
- [Vehicle catalog](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Vehicle/Brand.cs): `src/Data/GarageBuddy.Data.Models/Vehicle/Brand.cs`
- [Job records](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/Job.cs): `src/Data/GarageBuddy.Data.Models/Job/Job.cs`
- [Job details](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobItem.cs): `src/Data/GarageBuddy.Data.Models/Job/JobItem.cs`
- [Job documents](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobDocument.cs): `src/Data/GarageBuddy.Data.Models/Job/JobDocument.cs`
- [Job parts](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobItemPart.cs): `src/Data/GarageBuddy.Data.Models/Job/JobItemPart.cs`
- [Job statuses](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data.Models/Job/JobStatus.cs): `src/Data/GarageBuddy.Data.Models/Job/JobStatus.cs`

### Persistence and setup

- [Application database](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/ApplicationDbContext.cs): `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`
- [EF repositories](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/Repositories/EfRepository.cs): `src/Data/GarageBuddy.Data/Repositories/EfRepository.cs`
- [Initial data seeders](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Data/GarageBuddy.Data/Seeding/ApplicationDbContextSeeder.cs): `src/Data/GarageBuddy.Data/Seeding/ApplicationDbContextSeeder.cs`

### Messaging

- [Email service](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Messaging/Services/EmailService.cs): `src/Services/GarageBuddy.Services.Messaging/Services/EmailService.cs`
- [SMTP sender](https://github.com/dimitar-grigorov/garagebuddy/blob/main/src/Services/GarageBuddy.Services.Messaging/Email/SmtpMailSender.cs): `src/Services/GarageBuddy.Services.Messaging/Email/SmtpMailSender.cs`

### Other components

- **Mechanic or visitor**
- **Garage administrator**
- **SMTP server**

## Connections

- Mechanic or visitor → Home pages: opens (evidence: `src/Web/GarageBuddy.Web/Controllers/HomeController.cs`)
- Garage administrator → Admin management: manages records
- Admin management → Garage service: calls (evidence: `src/Web/GarageBuddy.Web/Areas/Admin/Controllers/GarageController.cs`)
- Admin management → Vehicle services: calls (evidence: `src/Web/GarageBuddy.Web/Areas/Admin/Controllers/VehicleController.cs`)
- Admin management → Customer services: calls (evidence: `src/Web/GarageBuddy.Web/Areas/Admin/Controllers/VehicleController.cs`)
- Home pages → Garage service: queries (evidence: `src/Web/GarageBuddy.Web/Controllers/HomeController.cs`)
- Home pages → Vehicle services: queries brands (evidence: `src/Web/GarageBuddy.Web/Controllers/HomeController.cs`)
- Account flows → User service: authenticates (evidence: `src/Web/GarageBuddy.Web/Controllers/UserController.cs`)
- Account flows → Email service: sends reset mail (evidence: `src/Web/GarageBuddy.Web/Controllers/UserController.cs`)
- Account flows → Mail view renderer: renders mail view (evidence: `src/Web/GarageBuddy.Web/Controllers/UserController.cs`)
- Controller base → Mechanic or visitor: sanitizes input (evidence: `src/Web/GarageBuddy.Web/Controllers/BaseController.cs`)
- Garage service → EF repositories: queries and saves (evidence: `src/Services/GarageBuddy.Services.Data/Services/GarageService.cs`)
- Garage service → Garage model: maps (evidence: `src/Services/GarageBuddy.Services.Data/Services/GarageService.cs`)
- EF repositories → Application database: accesses (evidence: `src/Data/GarageBuddy.Data/Repositories/EfDeletableEntityRepository.cs`)
- Application database → Garage model: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Vehicle model: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Customer model: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Job records: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Job details: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Job documents: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Job parts: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Job statuses: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Application database → Vehicle catalog: persists (evidence: `src/Data/GarageBuddy.Data/ApplicationDbContext.cs`)
- Job services → Job records: handles
- Job services → Job details: handles
- Job services → Job documents: handles
- Job services → Job parts: handles
- Job services → Job statuses: handles
- Initial data seeders → Application database: seeds
- Email service → SMTP sender: sends through (evidence: `src/Services/GarageBuddy.Services.Messaging/Services/EmailService.cs`)
- SMTP sender → SMTP server: delivers mail
