How z33xd/finance-tracker works
Purpose and Entry Points
Finance Tracker is a personal-finance system with a Spring Boot REST API and React/Vite client. The backend starts at src/main/java/com/fintrack/finance_tracker/FinanceTrackerApplication.java; the browser client starts at frontend/src/main.jsx and routes from frontend/src/App.jsx. The API manages authenticated users’ accounts, ledger transactions, categories, budgets, CSV imports, and currency reporting.
Client Application
The React SPA presents dashboard, account, transaction, budget, category, profile, and authentication views. frontend/src/context/AuthContext.jsx owns client authentication state; frontend/src/components/ProtectedRoute.jsx gates secured views. frontend/src/services/api.js is the HTTP boundary to the backend, while frontend/src/components/Navbar.jsx provides authenticated navigation. The production frontend is containerized and served through Nginx (frontend/Dockerfile, frontend/nginx.conf).
API and Domain Boundary
Backend domains follow a controller → service → Spring Data JPA repository/entity structure. Controllers expose REST endpoints, services implement user-scoped business rules and ledger effects, and repositories persist relational records to PostgreSQL. Core financial resources are:
• Accounts and dashboard summaries: accounts/AccountController.java, accounts/AccountService.java, accounts/AccountSummary.java
• Transactions, the primary ledger: transactions/TransactionController.java, transactions/TransactionService.java, transactions/Transaction.java
• Category-based spending caps: budgets/BudgetService.java, budgets/BudgetSummary.java, categories/Category.java
Authentication and Data Isolation
Public registration, login, and verification flow through authentication/AuthenticationController.java and authentication/AuthenticationService.java. JWT issuance and validation are separated into jwt/JwtService.java and config/JwtAuthenticationFilter.java; config/SecurityConfiguration.java applies stateless Spring Security. The authenticated principal is the isolation boundary: financial controllers/services scope operations to the current user rather than accepting an unrestricted tenant context. Signup verification uses email/EmailService.java with mail configuration in config/EmailConfiguration.java.
Financial Reporting and Exchange Rates
Amounts remain native to account/budget currencies. Read-time summaries convert balances or spending using persisted date-specific exchange-rate pairs. exchange_rates/ExchangeRateService.java manages retrieval/cache behavior, exchange_rates/CurrencyConversionService.java performs conversions, and exchange_rates/BaseCurrencyResolver.java determines the reporting anchor from the user’s first account. The external ExchangeRate-API is accessed through Spring’s configured web client (config/WebClientConfig.java) and requires an API key.
CSV Import Pipeline
Bulk uploads enter at import_batches/ImportBatchController.java and are staged/audited as ImportBatch records. import_batches/ImportBatchService.java parses and validates rows, detects duplicates, records job totals/status, and creates accepted ledger entries through the transaction path. This boundary protects account balance consistency while preserving batch-level processing telemetry; transactions/TransactionRepository.java and import_batches/ImportBatchRepository.java support the persistence side.
Runtime and Infrastructure
The backend is Java 21, Spring Boot 3, Maven, Spring Security, JPA/Hibernate, and PostgreSQL (pom.xml, src/main/resources/application.properties). Docker packaging exists for both application tiers (Dockerfile, frontend/Dockerfile) and orchestration is defined in docker-compose.yml. Required external dependencies are PostgreSQL, an SMTP/mail provider for verification, and ExchangeRate-API.
Components 21
React Client
- React SPA · Browser application entry and route shell.
frontend/src/main.jsx - Auth Context
frontend/src/context/AuthContext.jsx - Protected Routes
frontend/src/components/ProtectedRoute.jsx - API Client
frontend/src/services/api.js
Spring Boot API
- Security Filter Chain · Applies JWT authentication to secured API routes.
- JWT Filter
- Authentication API · Registration, login, and verification endpoints.
- JWT Service
- Email Service
Financial Domain
- Accounts & Dashboard · User-scoped account operations and balance summaries.
- Transaction Ledger · Primary user-scoped ledger and balance-effect path.
- Budgets & Categories · Category-based spending caps and summaries.
- CSV Import API
- Import Batch Pipeline · Validates rows, detects duplicates, and records batch status.
- Currency Reporting · Resolves reporting currency and converts read-time summaries.
- Exchange Rate Service
Infrastructure & Integrations
- Nginx Frontend
frontend/nginx.conf - PostgreSQL · JPA persistence for users, accounts, ledger, budgets, and import batches.
src/main/resources/application.properties - ExchangeRate-API
- SMTP Provider
- Docker Compose · Runs the packaged application tiers and database.
docker-compose.yml
Connections 29
- React SPA → Auth Context: owns session
- React SPA → Protected Routes: routes secured views
- Protected Routes → Auth Context: checks auth
- React SPA → API Client: calls API
- Nginx Frontend → React SPA: serves build
- API Client → Security Filter Chain: REST requests
- Security Filter Chain → JWT Filter: authenticates
- JWT Filter → JWT Service: validates token
- Security Filter Chain → Authentication API: permits public flow
- Authentication API → JWT Service: issues JWT
- Authentication API → Email Service: sends verification
- Email Service → SMTP Provider: delivers mail
- Security Filter Chain → Accounts & Dashboard: authenticated principal
- Security Filter Chain → Transaction Ledger: authenticated principal
- Security Filter Chain → Budgets & Categories: authenticated principal
- Security Filter Chain → CSV Import API: authenticated principal
- CSV Import API → Import Batch Pipeline: uploads CSV
- Import Batch Pipeline → Transaction Ledger: creates accepted entries
- Accounts & Dashboard → Currency Reporting: requests summaries
- Budgets & Categories → Currency Reporting: converts spending
- Currency Reporting → Exchange Rate Service: uses dated rates
- Exchange Rate Service → ExchangeRate-API: fetches rates
- Accounts & Dashboard → PostgreSQL: persists accounts
- Transaction Ledger → PostgreSQL: persists transactions
- Budgets & Categories → PostgreSQL: persists budgets/categories
- Import Batch Pipeline → PostgreSQL: persists batches
- Authentication API → PostgreSQL: persists users
- Docker Compose → Nginx Frontend: orchestrates
- Docker Compose → PostgreSQL: orchestrates