mirror of
https://github.com/dat515-2025/Group-8.git
synced 2026-03-22 15:12:08 +01:00
feat(tests): implemented local test DB container for isolation
This commit is contained in:
@@ -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 full‑stack 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 (Terraform‑compatible) modules and the application is packaged via a Helm chart.
|
Our system is a full‑stack 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 (Terraform‑compatible) 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
|
||||||
|
|||||||
Reference in New Issue
Block a user