feat(tests): implemented local test DB container for isolation

This commit is contained in:
ribardej
2025-11-12 13:29:20 +01:00
parent 1679abb71f
commit 50e489a8e0

View File

@@ -1,9 +1,9 @@
# Personal finance tracker # Personal finance tracker
> **Instructions**: <!--- **Instructions**:
> This template provides the structure for your project report. > This template provides the structure for your project report.
> Replace the placeholder text with your actual content. > Replace the placeholder text with your actual content.
> Remove instructions that are not relevant for your project, but leave the headings along with a (NA) label. > Remove instructions that are not relevant for your project, but leave the headings along with a (NA) label. -->
## Project Overview ## Project Overview
@@ -12,15 +12,21 @@
**Group Members**: **Group Members**:
- 289229, Lukáš Trkan, lukastrkan - 289229, Lukáš Trkan, lukastrkan
- 289258, Dejan Ribarovski, derib2613, ribardej - 289258, Dejan Ribarovski, ribardej (derib2613)
**Brief Description**: **Brief Description**:
Our application is a finance tracker, so a person can easily track his cash flow Our application allows users to easily track their cash flow
through multiple bank accounts. Person can label transactions with custom categories through multiple bank accounts. Users can label their transactions with custom categories that can be later used for
and later filter by them. filtering and visualization. New transactions are automatically fetched in the background.
## Architecture Overview ## Architecture Overview
Our system is a fullstack web application composed of a React frontend, a FastAPI backend, a PostgreSQL database, and asynchronous background workers powered by Celery with RabbitMQ. Redis is available for caching/kv and may be used by Celery as a result backend. The backend exposes REST endpoints for authentication (email/password and OAuth), users, categories, and transactions. A thin controller layer (FastAPI routers) lives under app/api. Infrastructure for Kubernetes is provided via OpenTofu (Terraformcompatible) modules and the application is packaged via a Helm chart. Our system is a fullstack web application composed of a React frontend, a FastAPI backend,
a PostgreSQL database, and asynchronous background workers powered by Celery with RabbitMQ.
Redis is available for caching/kv and may be used by Celery as a result backend. The backend
exposes REST endpoints for authentication (email/password and OAuth), users, categories,
transactions, exchange rates and bank APIs. A thin controller layer (FastAPI routers) lives under app/api.
Infrastructure for Kubernetes is provided via OpenTofu (Terraformcompatible) modules and
the application is packaged via a Helm chart.
### High-Level Architecture ### High-Level Architecture
@@ -34,20 +40,27 @@ flowchart LR
client[Client/Frontend] <--> svc[Backend API] client[Client/Frontend] <--> svc[Backend API]
svc --> proc_queue svc --> proc_queue
svc <--> db[(Database)] svc <--> db[(Database)]
svc <--> api[(UniRate API)]
``` ```
The workflow works in the following way: The workflow works in the following way:
- Client connects to the frontend. After login, frontend automatically fetches the stored transactions from - Client connects to the frontend. After login, frontend automatically fetches the stored transactions from
the database via the backend API the database via the backend API and currency rates from UniRate API.
- When the client opts for fetching new transactions via the Bank API, the backend delegates the task - When the client opts for fetching new transactions via the Bank API, the backend delegates the task
to a background worker service via the Message queue. to a background worker service via the Message queue.
- After successful load, these transactions are stored to the database and displayed to the client - After successful load, these transactions are stored to the database and displayed to the client
- There is also a Task planner, that executes periodic tasks, like fetching new transactions automatically from the Bank API - There is also a Task planner, that executes periodic tasks, like fetching new transactions automatically from the Bank APIs
### Features
- The stored transactions are encrypted in the DB for security reasons.
- For every pull request the full APP is deployed on a separate URL and the tests are run by github CI/CD
- On every push to main, the production app is automatically updated
-
### Components ### Components
- Frontend (frontend/): React + TypeScript app built with Vite. Talks to the backend via REST, handles login/registration, shows latest transactions, filtering, and allows adding transactions. - Frontend (frontend/): React + TypeScript app built with Vite. Talks to the backend via REST, handles login/registration, shows latest transactions, filtering, and allows adding transactions.
- Backend API (backend/app): FastAPI app with routers under app/api for auth, categories, and transactions. Uses FastAPI Users for auth (JWT + OAuth), SQLAlchemy ORM, and Pydantic v2 schemas. - Backend API (backend/app): FastAPI app with routers under app/api for auth, users, categories, transactions, exchange rates and bankAPI. Uses FastAPI Users for auth (JWT + OAuth), SQLAlchemy ORM, and Pydantic v2 schemas.
- Worker service (backend/app/workers): Celery worker handling asynchronous tasks (e.g., sending verification emails, future background processing). - Worker service (backend/app/workers): Celery worker handling asynchronous tasks (e.g., sending verification emails, future background processing).
- Database (PostgreSQL): Persists users, categories, transactions; schema managed by Alembic migrations. - Database (PostgreSQL): Persists users, categories, transactions; schema managed by Alembic migrations.
- Message Queue (RabbitMQ): Transports background jobs from the API to the worker. - Message Queue (RabbitMQ): Transports background jobs from the API to the worker.
@@ -59,7 +72,7 @@ to a background worker service via the Message queue.
- Backend: Python, FastAPI, FastAPI Users, SQLAlchemy, Pydantic, Alembic, Celery - Backend: Python, FastAPI, FastAPI Users, SQLAlchemy, Pydantic, Alembic, Celery
- Frontend: React, TypeScript, Vite - Frontend: React, TypeScript, Vite
- Database: MariaDB (Maxscale) - Database: MariaDB with Maxscale
- Background jobs: RabbitMQ, Celery - Background jobs: RabbitMQ, Celery
- Containerization/Orchestration: Docker, Docker Compose (dev), Kubernetes, Helm - Containerization/Orchestration: Docker, Docker Compose (dev), Kubernetes, Helm
- IaC/Platform: Proxmox, Talos, Cloudflare pages, OpenTofu (Terraform), cert-manager, MetalLB, Cloudflare Tunnel, Prometheus, Loki - IaC/Platform: Proxmox, Talos, Cloudflare pages, OpenTofu (Terraform), cert-manager, MetalLB, Cloudflare Tunnel, Prometheus, Loki
@@ -86,7 +99,7 @@ to a background worker service via the Message queue.
### Environment Variables (common) ### Environment Variables (common)
# TODO: UPDATE # TODO: UPDATE
- Backend: SECRET, FRONTEND_URL, BACKEND_URL, DATABASE_URL, RABBITMQ_URL, REDIS_URL - Backend: SECRET, FRONTEND_URL, BACKEND_URL, DATABASE_URL, RABBITMQ_URL, REDIS_URL, UNIRATE_API_KEY
- OAuth vars (Backend): MOJEID_CLIENT_ID/SECRET, BANKID_CLIENT_ID/SECRET (optional) - OAuth vars (Backend): MOJEID_CLIENT_ID/SECRET, BANKID_CLIENT_ID/SECRET (optional)
- Frontend: VITE_BACKEND_URL - Frontend: VITE_BACKEND_URL