Compare commits

..

1 Commits

Author SHA1 Message Date
ribardej
405be381fc feat(backend): fixed a naming conflict in app.py 2025-10-13 14:09:39 +02:00
3 changed files with 105 additions and 250 deletions

View File

@@ -1,53 +0,0 @@
# Weekly Meeting Notes
- Group 8 - Personal finance tracker
- Mentor: Jaychander
Keep all meeting notes in the `meetings.md` file in your project folder.
Just copy the template below for each weekly meeting and fill in the details.
## Administrative Info
- Date: 2025-10-08
- Attendees: Dejan Ribarovski, Lukas Trkan
- Notetaker: Dejan Ribarovski
## Progress Update (Before Meeting)
Summary of what has been accomplished since the last meeting in the following categories.
## Action Items from Last Week (During Meeting)
- [x] start coding the app logic
- [x] start writing the report so it matches the actual progress
- [x] redo the system diagram so it includes a response flow
### Coding
Implemented initial functioning version of the app, added OAuth with BankId and MojeID,
added database snapshots.
### Documentation
report.md is up to date
## Questions and Topics for Discussion (Before Meeting)
Prepare 3-5 questions and topics you want to discuss with your mentor.
1. What other functionality should be added to the app
2. Priority for the next week (Testing maybe?)
3. Question 3
## Discussion Notes (During Meeting)
## Action Items for Next Week (During Meeting)
Last 3 minutes of the meeting, summarize action items.
- [ ] OAuth
- [ ] CI/CD fix
- [ ] Database local (multiple bank accounts)
- [ ] Add tests and set up github pipeline
- [ ] Frontend imporvment - user experience
- [ ] make the report more clear
---

View File

@@ -1,4 +1,4 @@
# Personal finance tracker # Project Report
> **Instructions**: > **Instructions**:
> This template provides the structure for your project report. > This template provides the structure for your project report.
@@ -7,211 +7,126 @@
## Project Overview ## Project Overview
**Project Name**: Personal Finance Tracker **Project Name**: [Your project name]
**Group Members**: **Group Members**:
- 289229, Lukáš Trkan, lukastrkan - Student number, Name, GitHub username
- 289258, Dejan Ribarovski, derib2613, ribardej - Student number, Name, GitHub username
- Student number, Name, GitHub username
**Brief Description**: **Brief Description**:
Our application is a finance tracker, so a person can easily track his cash flow [2-3 sentences describing what your application does and its main purpose]
through multiple bank accounts. Person can label transactions with custom categories
and later filter by them.
## 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.
### High-Level Architecture ### High-Level Architecture
[Describe the overall system architecture. Consider including a diagram using mermaid or linking to an image]
```mermaid ```mermaid
flowchart LR graph TD
proc_queue[Message Queue] --> proc_queue_worker[Worker Service] A[Component A] --> B[Component B]
proc_queue_worker --> ext_mail[(Email Service)] B --> C[Component C]
proc_cron[Task planner] --> proc_queue
proc_queue_worker --> ext_bank[(Bank API)]
proc_queue_worker --> db
client[Client/Frontend] <--> svc[Backend API]
svc --> proc_queue
svc <--> db[(Database)]
svc <--> cache[(Cache)]
``` ```
### 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. - **Component 1**: [Description of what this component does]
- 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. - **Component 2**: [Description of what this component does]
- Worker service (backend/app/workers): Celery worker handling asynchronous tasks (e.g., sending verification emails, future background processing). - **Component 3**: [Description of what this component does]
- Database (PostgreSQL): Persists users, categories, transactions; schema managed by Alembic migrations.
- Message Queue (RabbitMQ): Transports background jobs from the API to the worker.
- Cache/Result Store (Redis): Available for caching or Celery result backend.
- Infrastructure as Code (tofu/): OpenTofu modules provisioning cluster services (RabbitMQ, Redis, Argo CD, cert-manager, Cloudflare tunnel, etc.).
- Deployment Chart (charts/myapp-chart/): Helm chart to deploy the application to Kubernetes.
### Technologies Used ### Technologies Used
- Backend: Python, FastAPI, FastAPI Users, SQLAlchemy, Pydantic, Alembic, Celery - **Backend**: [e.g., Go, Node.js, Python]
- Frontend: React, TypeScript, Vite - **Database**: [e.g., PostgreSQL, MongoDB, Redis]
- Database: PostgreSQL - **Cloud Services**: [e.g., AWS EC2, Google Cloud Run, Azure Functions]
- Messaging: RabbitMQ - **Container Orchestration**: [e.g., Docker, Kubernetes]
- Cache: Redis - **Other**: [List other significant technologies]
- Containerization/Orchestration: Docker, Docker Compose (dev), Kubernetes, Helm
- IaC/Platform: OpenTofu (Terraform), Argo CD, cert-manager, MetalLB, Cloudflare Tunnel, Prometheus
## Prerequisites ## Prerequisites
### System Requirements ### System Requirements
- Operating System: Linux, macOS, or Windows - Operating System: [e.g., Linux, macOS, Windows]
- Minimum RAM: 4 GB (8 GB recommended for running backend, frontend, and database together) - Minimum RAM: [e.g., 8GB]
- Storage: 2 GB free (Docker images may require additional space) - Storage: [e.g., 10GB free space]
### Required Software ### Required Software
- Docker Desktop or Docker Engine 24+ - [Software 1] (version X.X or higher)
- Docker Compose v2+ - [Software 2] (version X.X or higher)
- Node.js 20+ and npm 10+ (for local frontend dev/build) - [etc.]
- Python 3.12+ (for local backend dev outside Docker)
- PostgreSQL 15+ (optional if running DB outside Docker)
- Helm 3.12+ and kubectl 1.29+ (for Kubernetes deployment)
- OpenTofu 1.7+ (for infrastructure provisioning)
### Environment Variables (common) ### Dependencies
- Backend: SECRET, FRONTEND_URL, BACKEND_URL, DATABASE_URL, RABBITMQ_URL, REDIS_URL ```bash
- OAuth vars (Backend): MOJEID_CLIENT_ID/SECRET, BANKID_CLIENT_ID/SECRET (optional) # List key dependencies that need to be installed
- Frontend: VITE_BACKEND_URL # For example:
# Docker Engine 20.10+
### Dependencies (key libraries) # Node.js 18+
I am not sure what is meant by "key libraries" # Go 1.25+
```
Backend: FastAPI, fastapi-users, SQLAlchemy, pydantic v2, Alembic, Celery
Frontend: React, TypeScript, Vite
Services: PostgreSQL, RabbitMQ, Redis
## Build Instructions ## Build Instructions
You can run the project with Docker Compose (recommended for local development) or run services manually. ### 1. Clone the Repository
### 1) Clone the Repository
```bash ```bash
git clone https://github.com/dat515-2025/Group-8.git git clone [your-repository-url]
cd 7project cd [repository-name]
``` ```
### 2) Install dependencies ### 2. Install Dependencies
Backend
```bash ```bash
# In 7project/backend # Provide step-by-step commands
python3.12 -m venv .venv # For example:
source .venv/bin/activate # Windows: .venv\Scripts\activate # npm install
pip install -r requirements.txt # go mod download
``` ```
Frontend
### 3. Build the Application
```bash ```bash
# In 7project/frontend # Provide exact build commands
npm install # For example:
# make build
# docker build -t myapp .
``` ```
### 3) Manual Local Run ### 4. Configuration
Backend
```bash ```bash
# From the 7project/ directory # Any configuration steps needed
docker compose up --build # Environment variables to set
# This starts: PostgreSQL, RabbitMQ/Redis (if defined) # Configuration files to create
# Set environment variables (or create .env file)
export SECRET=CHANGE_ME_SECRET
export BACKEND_URL=http://127.0.0.1:8000
export FRONTEND_URL=http://localhost:5173
export DATABASE_URL=postgresql+asyncpg://user:password@127.0.0.1:5432/app
export RABBITMQ_URL=amqp://guest:guest@127.0.0.1:5672/
export REDIS_URL=redis://127.0.0.1:6379/0
# Apply DB migrations (Alembic)
# From 7project/backend
alembic upgrade head
# Run API
uvicorn app.app:fastApi --reload --host 0.0.0.0 --port 8000
# Run Celery worker (optional, for emails/background tasks)
celery -A app.celery_app.celery_app worker -l info
``` ```
Frontend
```bash
# Configure backend URL for dev
echo 'VITE_BACKEND_URL=http://127.0.0.1:8000' > .env
npm run dev
# Open http://localhost:5173
```
- Backend default: http://127.0.0.1:8000 (OpenAPI at /docs)
- Frontend default: http://localhost:5173
If needed, adjust compose services/ports in compose.yml.
## Deployment Instructions ## Deployment Instructions
### Local (Docker Compose) ### Local Deployment
Described in the previous section (Manual Local Run)
### Kubernetes (via OpenTofu + Helm)
1) Provision platform services (RabbitMQ/Redis/ingress/tunnel/etc.) with OpenTofu
```bash ```bash
cd tofu # Step-by-step commands for local deployment
# copy and edit variables # For example:
cp terraform.tfvars.example terraform.tfvars # docker-compose up -d
# authenticate to your cluster/cloud as needed, then: # kubectl apply -f manifests/
tofu init
tofu plan
tofu apply
``` ```
2) Deploy the app using Helm ### Cloud Deployment
```bash
# Set the namespace
kubectl create namespace myapp || true
# Install/upgrade the chart with required values
helm upgrade --install myapp charts/myapp-chart \
-n myapp \
-f charts/myapp-chart/values.yaml \
--set image.backend.repository=myorg/myapp-backend \
--set image.backend.tag=latest \
--set env.BACKEND_URL="https://myapp.example.com" \
--set env.FRONTEND_URL="https://myapp.example.com" \
--set env.SECRET="CHANGE_ME_SECRET"
```
Adjust values to your registry and domain. The charts NOTES.txt includes additional examples.
3) Expose and access
- If using Cloudflare Tunnel or an ingress, configure DNS accordingly (see tofu/modules/cloudflare and deployment/tunnel.yaml).
- For quick testing without ingress:
```bash ```bash
kubectl -n myapp port-forward deploy/myapp-backend 8000:8000 # Commands for cloud deployment
kubectl -n myapp port-forward deploy/myapp-frontend 5173:80 # Include any cloud-specific setup
``` ```
### Verification ### Verification
```bash ```bash
# Check pods # Commands to verify deployment worked
kubectl -n myapp get pods # How to check if services are running
# Example health check endpoints
# Backend health
curl -i http://127.0.0.1:8000/
# OpenAPI
open http://127.0.0.1:8000/docs
# Frontend (if port-forwarded)
open http://localhost:5173
``` ```
## Testing Instructions ## Testing Instructions
@@ -241,38 +156,19 @@ open http://localhost:5173
## Usage Examples ## Usage Examples
All endpoints are documented at OpenAPI: http://127.0.0.1:8000/docs ### Basic Usage
### Auth: Register and Login (JWT)
```bash ```bash
# Register # Examples of how to use the application
curl -X POST http://127.0.0.1:8000/auth/register \ # Common commands or API calls
-H 'Content-Type: application/json' \ # Sample data or test scenarios
-d '{
"email": "user@example.com",
"password": "StrongPassw0rd",
"first_name": "Jane",
"last_name": "Doe"
}'
# Login (JWT)
TOKEN=$(curl -s -X POST http://127.0.0.1:8000/auth/jwt/login \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'username=user@example.com&password=StrongPassw0rd' | jq -r .access_token)
echo $TOKEN
# Call a protected route
curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
``` ```
### Frontend ### Advanced Features
- Start with: npm run dev in 7project/frontend ```bash
- Ensure VITE_BACKEND_URL is set to the backend URL (e.g., http://127.0.0.1:8000) # Examples showcasing advanced functionality
- Open http://localhost:5173 ```
- Login, view latest transactions, filter, and add new transactions from the UI.
--- ---
@@ -320,17 +216,17 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
> Link to the specific commit on GitHub for each contribution. > Link to the specific commit on GitHub for each contribution.
| Task/Component | Assigned To | Status | Time Spent | Difficulty | Notes | | Task/Component | Assigned To | Status | Time Spent | Difficulty | Notes |
|-----------------------------------------------------------------------|-------------| ------------- |----------------|------------| ----------- | | ------------------------------------------------------------------- | ----------- | ------------- | ---------- | ---------- | ----------- |
| [Project Setup & Repository](https://github.com/dat515-2025/Group-8#) | Lukas | ✅ Complete | [X hours] | Medium | [Any notes] | | Project Setup & Repository | [Name] | ✅ Complete | [X hours] | Medium | [Any notes] |
| [Design Document](https://github.com/dat515-2025/Group-8/blob/main/6design/design.md) | Both | ✅ Complete | 2 Hours | Easy | [Any notes] | | [Design Document](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Easy | [Any notes] |
| [Backend API Development](https://github.com/dat515-2025/Group-8/tree/main/7project/backend/app/api) | Dejan | ✅ Complete | 10 hours | Medium | [Any notes] | | [Backend API Development](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Hard | [Any notes] |
| [Database Setup & Models](https://github.com/dat515-2025/Group-8/tree/main/7project/backend/app/models) | Lukas | ✅ Complete | [X hours] | Medium | [Any notes] | | [Database Setup & Models](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Medium | [Any notes] |
| [Frontend Development](https://github.com/dat515-2025/Group-8/tree/main/7project/frontend) | Dejan | 🔄 In Progress | 7 hours so far | Medium | [Any notes] | | [Frontend Development](https://github.com/dat515-2025/group-name) | [Name] | 🔄 In Progress | [X hours] | Medium | [Any notes] |
| [Docker Configuration](https://github.com/dat515-2025/Group-8/blob/main/7project/compose.yml) | Lukas | ✅ Complete | [X hours] | Easy | [Any notes] | | [Docker Configuration](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Easy | [Any notes] |
| [Cloud Deployment](https://github.com/dat515-2025/Group-8/blob/main/7project/deployment/app-demo-deployment.yaml) | Lukas | ✅ Complete | [X hours] | Hard | [Any notes] | | [Cloud Deployment](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Hard | [Any notes] |
| [Testing Implementation](https://github.com/dat515-2025/group-name) | Dejan | ❌ Not Started | [X hours] | Medium | [Any notes] | | [Testing Implementation](https://github.com/dat515-2025/group-name) | [Name] | ⏳ Pending | [X hours] | Medium | [Any notes] |
| [Documentation](https://github.com/dat515-2025/group-name) | Both | ❌ Not Started | [X hours] | Easy | [Any notes] | | [Documentation](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Easy | [Any notes] |
| [Presentation Video](https://github.com/dat515-2025/group-name) | Both | ❌ Not Started | [X hours] | Medium | [Any notes] | | [Presentation Video](https://github.com/dat515-2025/group-name) | [Name] | ✅ Complete | [X hours] | Medium | [Any notes] |
**Legend**: ✅ Complete | 🔄 In Progress | ⏳ Pending | ❌ Not Started **Legend**: ✅ Complete | 🔄 In Progress | ⏳ Pending | ❌ Not Started
@@ -348,16 +244,25 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
| [Date] | Documentation | [X.X] | Updated README and design doc | | [Date] | Documentation | [X.X] | Updated README and design doc |
| **Total** | | **[XX.X]** | | | **Total** | | **[XX.X]** | |
### Dejan ### [Team Member 2 Name]
| Date | Activity | Hours | Description | | Date | Activity | Hours | Description |
|-------------|----------------------|--------|--------------------------------| | --------- | -------------------- | ---------- | ----------------------------------------- |
| 25.9. | Design | 1.5 | 6design | | [Date] | Frontend Development | [X.X] | Created user interface mockups |
| 9-11.10. | Backend APIs | 10 | Implemented Backend APIs | | [Date] | Integration | [X.X] | Connected frontend to backend API |
| 13-15.10. | Frontend Development | 6.5 | Created user interface mockups | | [Date] | Deployment | [X.X] | Docker configuration and cloud deployment |
| Continually | Documantation | 3 | Documenting the dev process | | [Date] | Testing | [X.X] | End-to-end testing |
| **Total** | | **21** | | | **Total** | | **[XX.X]** | |
### [Team Member 3 Name] (if applicable)
| Date | Activity | Hours | Description |
| --------- | ------------------------ | ---------- | -------------------------------- |
| [Date] | Database Design | [X.X] | Schema design and implementation |
| [Date] | Cloud Configuration | [X.X] | AWS/GCP setup and configuration |
| [Date] | Performance Optimization | [X.X] | Caching and query optimization |
| [Date] | Monitoring | [X.X] | Logging and monitoring setup |
| **Total** | | **[XX.X]** | |
### Group Total: [XXX.X] hours ### Group Total: [XXX.X] hours
@@ -387,8 +292,11 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
[Personal reflection on growth, challenges, and learning] [Personal reflection on growth, challenges, and learning]
#### [Team Member 3 Name] (if applicable)
[Personal reflection on growth, challenges, and learning]
--- ---
**Report Completion Date**: [Date] **Report Completion Date**: [Date]
**Last Updated**: 15.10.2025 **Last Updated**: [Date]