# sbedoyar/budget-sdf architecture

> Architecture diagram of the GitHub repository sbedoyar/budget-sdf, 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/sbedoyar/budget-sdf
- Repository: https://github.com/sbedoyar/budget-sdf

## Overview

Budget SDF is a web inventory-management system for a shop: an owner signs in, manages categories and products, records stock movements, and reviews alerts and reports. The React pages call resource services through a shared Axios client; the Spring API applies business logic and persists inventory data. The README documents the major capabilities and layered backend, while sampled excerpts show report-page requests and selected controller-to-service contracts. Implementations not sampled are represented by their exact tree paths; their internal calls are omitted where evidence is unavailable.

Main entry points: [`frontend/src/App.jsx`](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/App.jsx) (Route selection), [`frontend/src/pages/ReportsPage.jsx`](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ReportsPage.jsx) (Reports), [`frontend/src/pages/CategoriesPage.jsx`](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/CategoriesPage.jsx) (Categories), [`frontend/src/pages/ProductsPage.jsx`](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ProductsPage.jsx) (Products)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_app["Route selection<br/>[App.jsx]"]
  node_dashboard["Dashboard<br/>[DashboardPage.jsx]"]
  node_categories["Categories<br/>[CategoriesPage.jsx]"]
  node_products["Products<br/>[ProductsPage.jsx]"]
  node_movements["Movements<br/>[MovementsPage.jsx]"]
  node_client["API client<br/>[apiClient.js]"]
end

subgraph group_identity["Authentication"]
  node_login["Login page<br/>[LoginPage.jsx]"]
  node_session["Session context<br/>[AuthProvider.jsx]"]
  node_authapi["Auth service<br/>[authService.js]"]
  node_authcontroller["Auth API"]
  node_userservice["User service<br/>[UserService.java]"]
  node_googletoken["Google token check"]
end

subgraph group_inventory["Inventory operations"]
  node_categoryapi["Category API"]
  node_categoryservice["Category service"]
  node_productapi["Product API"]
  node_productservice["Product service"]
  node_movementapi["Movement API"]
  node_movementservice["Movement service"]
end

subgraph group_insights["Alerts and reporting"]
  node_alertpage["Stock alerts<br/>[AlertsPage.jsx]"]
  node_alertcontroller["Alert API"]
  node_alertservice["Alert service<br/>[AlertService.java]"]
  node_reports["Reports<br/>[ReportsPage.jsx]"]
  node_reportservice["Report service<br/>[ReportService.java]"]
  node_export["Excel export"]
end

subgraph group_storage["Backend persistence"]
  node_mysql[("MySQL inventory")]
end

node_owner(("Shop owner"))
node_google(("Google identity"))

node_owner -->|"uses"| node_app
node_app -->|"routes to"| node_login
node_app -->|"routes to"| node_dashboard
node_app -->|"routes to"| node_categories
node_app -->|"routes to"| node_products
node_app -->|"routes to"| node_movements
node_app -->|"routes to"| node_alertpage
node_app -->|"routes to"| node_reports
node_login -.->|"signs in"| node_session
node_session -.->|"invokes"| node_authapi
node_authapi -->|"posts login"| node_client
node_client -.->|"HTTP requests"| node_authcontroller
node_authcontroller -->|"delegates to"| node_userservice
node_userservice -.->|"verifies Google"| node_googletoken
node_googletoken -->|"validates token"| node_google
node_categories -.->|"API operations"| node_categoryapi
node_products -.->|"API operations"| node_productapi
node_movements -.->|"API operations"| node_movementapi
node_alertpage -.->|"fetches alerts"| node_alertcontroller
node_reports -->|"requests reports"| node_reportservice
node_reports -->|"exports report"| node_export
node_categoryapi -->|"delegates to"| node_categoryservice
node_productapi -->|"delegates to"| node_productservice
node_movementapi -->|"delegates to"| node_movementservice
node_alertcontroller -->|"delegates to"| node_alertservice
node_categoryservice -.->|"persists categories"| node_mysql
node_productservice -.->|"persists products"| node_mysql
node_movementservice -.->|"persists movements"| node_mysql
node_reportservice -.->|"reads inventory"| node_mysql
node_alertservice -.->|"reads stock"| node_mysql

click node_app "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/App.jsx"
click node_dashboard "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/DashboardPage.jsx"
click node_categories "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/CategoriesPage.jsx"
click node_products "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ProductsPage.jsx"
click node_movements "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/MovementsPage.jsx"
click node_login "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/LoginPage.jsx"
click node_session "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/contexts/AuthProvider.jsx"
click node_authapi "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/services/authService.js"
click node_authcontroller "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/user/controller/AuthController.java"
click node_userservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/user/service/UserService.java"
click node_googletoken "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/common/security/GoogleTokenService.java"
click node_alertpage "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/AlertsPage.jsx"
click node_alertcontroller "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/alert/controller/AlertController.java"
click node_alertservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/alert/service/AlertService.java"
click node_reports "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ReportsPage.jsx"
click node_reportservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/report/service/ReportService.java"
click node_export "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/utils/reportExcelExporter.js"
click node_categoryapi "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/category/controller/CategoryController.java"
click node_categoryservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/category/service/CategoryService.java"
click node_productapi "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/product/controller/ProductController.java"
click node_productservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/product/service/ProductService.java"
click node_movementapi "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/movement/controller/MovementController.java"
click node_movementservice "https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/movement/service/MovementService.java"
click node_client "https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/api/apiClient.js"

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_dashboard,node_categories,node_products,node_movements,node_client toneBlue
class node_login,node_session,node_authapi,node_authcontroller,node_userservice,node_googletoken toneAmber
class node_categoryapi,node_categoryservice,node_productapi,node_productservice,node_movementapi,node_movementservice toneMint
class node_alertpage,node_alertcontroller,node_alertservice,node_reports,node_reportservice,node_export toneRose
class node_mysql,node_owner,node_google toneIndigo
```

## Components

### Web application

- [Route selection](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Dashboard](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/DashboardPage.jsx): `frontend/src/pages/DashboardPage.jsx`
- [Categories](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/CategoriesPage.jsx): `frontend/src/pages/CategoriesPage.jsx`
- [Products](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ProductsPage.jsx): `frontend/src/pages/ProductsPage.jsx`
- [Movements](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/MovementsPage.jsx): `frontend/src/pages/MovementsPage.jsx`
- [API client](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/api/apiClient.js): `frontend/src/api/apiClient.js`

### Authentication

- [Login page](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/LoginPage.jsx): `frontend/src/pages/LoginPage.jsx`
- [Session context](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/contexts/AuthProvider.jsx): `frontend/src/contexts/AuthProvider.jsx`
- [Auth service](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/services/authService.js): `frontend/src/services/authService.js`
- [Auth API](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/user/controller/AuthController.java): `backend/src/main/java/com/budgetsdf/user/controller/AuthController.java`
- [User service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/user/service/UserService.java): `backend/src/main/java/com/budgetsdf/user/service/UserService.java`
- [Google token check](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/common/security/GoogleTokenService.java): `backend/src/main/java/com/budgetsdf/common/security/GoogleTokenService.java`

### Inventory operations

- [Category API](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/category/controller/CategoryController.java): `backend/src/main/java/com/budgetsdf/category/controller/CategoryController.java`
- [Category service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/category/service/CategoryService.java): `backend/src/main/java/com/budgetsdf/category/service/CategoryService.java`
- [Product API](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/product/controller/ProductController.java): `backend/src/main/java/com/budgetsdf/product/controller/ProductController.java`
- [Product service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/product/service/ProductService.java): `backend/src/main/java/com/budgetsdf/product/service/ProductService.java`
- [Movement API](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/movement/controller/MovementController.java): `backend/src/main/java/com/budgetsdf/movement/controller/MovementController.java`
- [Movement service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/movement/service/MovementService.java): `backend/src/main/java/com/budgetsdf/movement/service/MovementService.java`

### Alerts and reporting

- [Stock alerts](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/AlertsPage.jsx): `frontend/src/pages/AlertsPage.jsx`
- [Alert API](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/alert/controller/AlertController.java): `backend/src/main/java/com/budgetsdf/alert/controller/AlertController.java`
- [Alert service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/alert/service/AlertService.java): `backend/src/main/java/com/budgetsdf/alert/service/AlertService.java`
- [Reports](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/pages/ReportsPage.jsx): `frontend/src/pages/ReportsPage.jsx`
- [Report service](https://github.com/sbedoyar/budget-sdf/blob/main/backend/src/main/java/com/budgetsdf/report/service/ReportService.java): `backend/src/main/java/com/budgetsdf/report/service/ReportService.java`
- [Excel export](https://github.com/sbedoyar/budget-sdf/blob/main/frontend/src/utils/reportExcelExporter.js): `frontend/src/utils/reportExcelExporter.js`

### Backend persistence

- **MySQL inventory**

### Other components

- **Shop owner**
- **Google identity**

## Connections

- Shop owner → Route selection: uses (evidence: `README.md`)
- Route selection → Login page: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Dashboard: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Categories: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Products: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Movements: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Stock alerts: routes to (evidence: `frontend/src/App.jsx`)
- Route selection → Reports: routes to (evidence: `frontend/src/App.jsx`)
- Login page → Session context: signs in
- Session context → Auth service: invokes (evidence: `frontend/src/contexts/AuthProvider.jsx`)
- Auth service → API client: posts login (evidence: `frontend/src/services/authService.js`)
- API client → Auth API: HTTP requests (evidence: `README.md`)
- Auth API → User service: delegates to (evidence: `backend/src/main/java/com/budgetsdf/user/controller/AuthController.java`)
- User service → Google token check: verifies Google
- Google token check → Google identity: validates token (evidence: `backend/src/main/java/com/budgetsdf/common/security/GoogleTokenService.java`)
- Categories → Category API: API operations (evidence: `README.md`)
- Products → Product API: API operations (evidence: `README.md`)
- Movements → Movement API: API operations (evidence: `README.md`)
- Stock alerts → Alert API: fetches alerts (evidence: `README.md`)
- Reports → Report service: requests reports (evidence: `frontend/src/pages/ReportsPage.jsx`)
- Reports → Excel export: exports report (evidence: `frontend/src/pages/ReportsPage.jsx`)
- Category API → Category service: delegates to (evidence: `backend/src/main/java/com/budgetsdf/category/controller/CategoryController.java`)
- Product API → Product service: delegates to (evidence: `backend/src/main/java/com/budgetsdf/product/controller/ProductController.java`)
- Movement API → Movement service: delegates to (evidence: `backend/src/main/java/com/budgetsdf/movement/controller/MovementController.java`)
- Alert API → Alert service: delegates to (evidence: `backend/src/main/java/com/budgetsdf/alert/controller/AlertController.java`)
- Category service → MySQL inventory: persists categories
- Product service → MySQL inventory: persists products
- Movement service → MySQL inventory: persists movements
- Report service → MySQL inventory: reads inventory
- Alert service → MySQL inventory: reads stock
