# tebogomoremi/cloudspends architecture

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

## Overview

CloudSpend is a cloud-spend tracking application. Users select and manage cloud accounts, register resources, record or review costs, and inspect account-level totals and breakdowns; dashboards summarize spend and resource counts, while budgets provide utilization and alert evaluation. The graph separates the React interface, API boundary, domain services, and persistence. Controller-to-service and service-to-repository links are shown where sampled code supports them; frontend API wiring and unsampled subsystems are represented cautiously from the tree, so some links are omitted.

Main entry points: [`frontend/src/App.jsx`](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/App.jsx) (App routes), [`backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudAccountRepository.java`](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudAccountRepository.java) (Account repository), [`backend/src/main/java/com/tebogo/cloudspend_api/service/CostRecordService.java`](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostRecordService.java) (Cost analysis), [`backend/src/main/java/com/tebogo/cloudspend_api/service/CostAlertService.java`](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostAlertService.java) (Alert evaluation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web interface"]
  node_app["App routes<br/>[App.jsx]"]
  node_accounts_ui["Accounts<br/>[AccountsPage.jsx]"]
  node_resources_ui["Resources<br/>[ResourcesPage.jsx]"]
  node_costs_ui["Costs<br/>[CostsPage.jsx]"]
  node_overview_ui["Overview<br/>[OverviewPage.jsx]"]
  node_budgets_ui["Budgets<br/>[BudgetsPage.jsx]"]
  node_alerts_ui["Alerts<br/>[AlertsPage.jsx]"]
  node_account_context["Account context<br/>[AccountContext.jsx]"]
  node_api_client_account["Account API<br/>[accountApi.js]"]
  node_api_client_resource["Resource API<br/>[resourceApi.js]"]
  node_api_client_cost["Cost API<br/>[costApi.js]"]
  node_api_client_dashboard["Dashboard API<br/>[dashboardApi.js]"]
  node_api_client_budget["Budget API<br/>[budgetApi.js]"]
  node_api_client_alert["Alert API<br/>[alertApi.js]"]
end

subgraph group_api["HTTP API"]
  node_accounts_api["Account endpoints"]
  node_resources_api["Resource endpoints"]
  node_cost_api["Cost endpoints"]
  node_account_cost_api["Account cost endpoints"]
  node_dashboard_api["Dashboard endpoints"]
  node_budget_api["Budget endpoints"]
  node_alert_api["Alert endpoints"]
end

subgraph group_domain["Spend services"]
  node_account_service["Account management"]
  node_resource_service["Resource management"]
  node_cost_service["Cost analysis"]
  node_dashboard_service["Dashboard summary"]
  node_budget_service["Budget utilization<br/>[BudgetService.java]"]
  node_alert_service["Alert evaluation"]
end

subgraph group_data["Persistence"]
  node_account_repo["Account repository"]
  node_resource_repo["Resource repository"]
  node_cost_repo["Cost repository"]
  node_budget_repo["Budget repository"]
  node_alert_repo["Alert repository"]
end

node_user(("User"))
node_store[("Relational store")]

node_user -->|"uses"| node_app
node_app -->|"routes"| node_accounts_ui
node_app -->|"routes"| node_resources_ui
node_app -->|"routes"| node_costs_ui
node_app -->|"routes"| node_overview_ui
node_app -->|"routes"| node_budgets_ui
node_app -->|"routes"| node_alerts_ui
node_app -->|"provides"| node_account_context
node_accounts_ui -.->|"requests"| node_api_client_account
node_resources_ui -.->|"requests"| node_api_client_resource
node_costs_ui -.->|"requests"| node_api_client_cost
node_overview_ui -.->|"requests"| node_api_client_dashboard
node_budgets_ui -.->|"requests"| node_api_client_budget
node_alerts_ui -.->|"requests"| node_api_client_alert
node_api_client_account -.->|"HTTP requests"| node_accounts_api
node_api_client_resource -.->|"HTTP requests"| node_resources_api
node_api_client_cost -.->|"HTTP requests"| node_cost_api
node_api_client_cost -.->|"HTTP requests"| node_account_cost_api
node_api_client_dashboard -.->|"HTTP requests"| node_dashboard_api
node_api_client_budget -.->|"HTTP requests"| node_budget_api
node_api_client_alert -.->|"HTTP requests"| node_alert_api
node_resources_api -->|"calls"| node_resource_service
node_cost_api -->|"calls"| node_cost_service
node_account_cost_api -->|"calls"| node_cost_service
node_dashboard_api -.->|"calls"| node_dashboard_service
node_budget_api -->|"calls"| node_budget_service
node_alert_api -.->|"calls"| node_alert_service
node_accounts_api -.->|"calls"| node_account_service
node_dashboard_service -->|"calls"| node_cost_service
node_resource_service -->|"reads"| node_account_repo
node_resource_service -->|"reads/writes"| node_resource_repo
node_resource_service -->|"queries"| node_cost_repo
node_cost_service -->|"validates"| node_account_repo
node_cost_service -->|"reads"| node_resource_repo
node_cost_service -->|"queries/writes"| node_cost_repo
node_budget_service -->|"validates"| node_account_repo
node_budget_service -->|"reads/writes"| node_budget_repo
node_budget_service -->|"reads"| node_cost_repo
node_alert_service -->|"validates"| node_account_repo
node_alert_service -->|"reads"| node_budget_repo
node_alert_service -->|"reads"| node_cost_repo
node_alert_service -->|"reads/writes"| node_alert_repo
node_dashboard_service -->|"validates"| node_account_repo
node_dashboard_service -->|"counts"| node_resource_repo
node_account_service -.->|"reads/writes"| node_account_repo
node_account_repo -->|"persists"| node_store
node_resource_repo -->|"persists"| node_store
node_cost_repo -->|"persists"| node_store

click node_app "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/App.jsx"
click node_accounts_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/AccountsPage.jsx"
click node_resources_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/ResourcesPage.jsx"
click node_costs_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/CostsPage.jsx"
click node_overview_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/OverviewPage.jsx"
click node_budgets_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/BudgetsPage.jsx"
click node_alerts_ui "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/AlertsPage.jsx"
click node_account_context "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/context/AccountContext.jsx"
click node_api_client_account "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/accountApi.js"
click node_api_client_resource "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/resourceApi.js"
click node_api_client_cost "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/costApi.js"
click node_api_client_dashboard "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/dashboardApi.js"
click node_api_client_budget "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/budgetApi.js"
click node_api_client_alert "https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/alertApi.js"
click node_accounts_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudAccountController.java"
click node_resources_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudResourceController.java"
click node_cost_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CostRecordController.java"
click node_account_cost_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/AccountCostController.java"
click node_dashboard_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/DashboardController.java"
click node_budget_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/BudgetController.java"
click node_alert_api "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CostAlertController.java"
click node_account_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CloudAccountService.java"
click node_resource_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CloudResourceService.java"
click node_cost_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostRecordService.java"
click node_dashboard_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/DashboardService.java"
click node_budget_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/BudgetService.java"
click node_alert_service "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostAlertService.java"
click node_account_repo "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudAccountRepository.java"
click node_resource_repo "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudResourceRepository.java"
click node_cost_repo "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CostRecordRepository.java"
click node_budget_repo "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/BudgetRepository.java"
click node_alert_repo "https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CostAlertRepository.java"

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_accounts_ui,node_resources_ui,node_costs_ui,node_overview_ui,node_budgets_ui,node_alerts_ui,node_account_context,node_api_client_account,node_api_client_resource,node_api_client_cost,node_api_client_dashboard,node_api_client_budget,node_api_client_alert,node_user toneBlue
class node_accounts_api,node_resources_api,node_cost_api,node_account_cost_api,node_dashboard_api,node_budget_api,node_alert_api,node_store toneAmber
class node_account_service,node_resource_service,node_cost_service,node_dashboard_service,node_budget_service,node_alert_service toneMint
class node_account_repo,node_resource_repo,node_cost_repo,node_budget_repo,node_alert_repo toneRose
```

## Components

### Web interface

- [App routes](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Accounts](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/AccountsPage.jsx): `frontend/src/pages/AccountsPage.jsx`
- [Resources](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/ResourcesPage.jsx): `frontend/src/pages/ResourcesPage.jsx`
- [Costs](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/CostsPage.jsx): `frontend/src/pages/CostsPage.jsx`
- [Overview](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/OverviewPage.jsx): `frontend/src/pages/OverviewPage.jsx`
- [Budgets](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/BudgetsPage.jsx): `frontend/src/pages/BudgetsPage.jsx`
- [Alerts](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/pages/AlertsPage.jsx): `frontend/src/pages/AlertsPage.jsx`
- [Account context](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/context/AccountContext.jsx): `frontend/src/context/AccountContext.jsx`
- [Account API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/accountApi.js): `frontend/src/services/accountApi.js`
- [Resource API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/resourceApi.js): `frontend/src/services/resourceApi.js`
- [Cost API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/costApi.js): `frontend/src/services/costApi.js`
- [Dashboard API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/dashboardApi.js): `frontend/src/services/dashboardApi.js`
- [Budget API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/budgetApi.js): `frontend/src/services/budgetApi.js`
- [Alert API](https://github.com/tebogomoremi/cloudspends/blob/main/frontend/src/services/alertApi.js): `frontend/src/services/alertApi.js`

### HTTP API

- [Account endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudAccountController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudAccountController.java`
- [Resource endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudResourceController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/CloudResourceController.java`
- [Cost endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CostRecordController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/CostRecordController.java`
- [Account cost endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/AccountCostController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/AccountCostController.java`
- [Dashboard endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/DashboardController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/DashboardController.java`
- [Budget endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/BudgetController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/BudgetController.java`
- [Alert endpoints](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/controller/CostAlertController.java): `backend/src/main/java/com/tebogo/cloudspend_api/controller/CostAlertController.java`

### Spend services

- [Account management](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CloudAccountService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/CloudAccountService.java`
- [Resource management](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CloudResourceService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/CloudResourceService.java`
- [Cost analysis](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostRecordService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/CostRecordService.java`
- [Dashboard summary](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/DashboardService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/DashboardService.java`
- [Budget utilization](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/BudgetService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/BudgetService.java`
- [Alert evaluation](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/service/CostAlertService.java): `backend/src/main/java/com/tebogo/cloudspend_api/service/CostAlertService.java`

### Persistence

- [Account repository](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudAccountRepository.java): `backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudAccountRepository.java`
- [Resource repository](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudResourceRepository.java): `backend/src/main/java/com/tebogo/cloudspend_api/repository/CloudResourceRepository.java`
- [Cost repository](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CostRecordRepository.java): `backend/src/main/java/com/tebogo/cloudspend_api/repository/CostRecordRepository.java`
- [Budget repository](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/BudgetRepository.java): `backend/src/main/java/com/tebogo/cloudspend_api/repository/BudgetRepository.java`
- [Alert repository](https://github.com/tebogomoremi/cloudspends/blob/main/backend/src/main/java/com/tebogo/cloudspend_api/repository/CostAlertRepository.java): `backend/src/main/java/com/tebogo/cloudspend_api/repository/CostAlertRepository.java`

### Other components

- **User**
- **Relational store**

## Connections

- User → App routes: uses
- App routes → Accounts: routes
- App routes → Resources: routes
- App routes → Costs: routes
- App routes → Overview: routes
- App routes → Budgets: routes
- App routes → Alerts: routes
- App routes → Account context: provides
- Accounts → Account API: requests
- Resources → Resource API: requests
- Costs → Cost API: requests
- Overview → Dashboard API: requests
- Budgets → Budget API: requests
- Alerts → Alert API: requests
- Account API → Account endpoints: HTTP requests
- Resource API → Resource endpoints: HTTP requests
- Cost API → Cost endpoints: HTTP requests
- Cost API → Account cost endpoints: HTTP requests
- Dashboard API → Dashboard endpoints: HTTP requests
- Budget API → Budget endpoints: HTTP requests
- Alert API → Alert endpoints: HTTP requests
- Resource endpoints → Resource management: calls
- Cost endpoints → Cost analysis: calls
- Account cost endpoints → Cost analysis: calls
- Dashboard endpoints → Dashboard summary: calls
- Budget endpoints → Budget utilization: calls
- Alert endpoints → Alert evaluation: calls
- Account endpoints → Account management: calls
- Dashboard summary → Cost analysis: calls
- Resource management → Account repository: reads
- Resource management → Resource repository: reads/writes
- Resource management → Cost repository: queries
- Cost analysis → Account repository: validates
- Cost analysis → Resource repository: reads
- Cost analysis → Cost repository: queries/writes
- Budget utilization → Account repository: validates
- Budget utilization → Budget repository: reads/writes
- Budget utilization → Cost repository: reads
- Alert evaluation → Account repository: validates
- Alert evaluation → Budget repository: reads
- Alert evaluation → Cost repository: reads
- Alert evaluation → Alert repository: reads/writes
- Dashboard summary → Account repository: validates
- Dashboard summary → Resource repository: counts
- Account management → Account repository: reads/writes
- Account repository → Relational store: persists
- Resource repository → Relational store: persists
- Cost repository → Relational store: persists
