Compare commits

...

18 Commits

Author SHA1 Message Date
ba1677b2d3 add README.md
Some checks are pending
Deploy Prod / Run Python Tests (push) Waiting to run
Deploy Prod / Build and push image (reusable) (push) Blocked by required conditions
Deploy Prod / Generate Production URLs (push) Blocked by required conditions
Deploy Prod / Frontend - Build and Deploy to Cloudflare Pages (prod) (push) Blocked by required conditions
Deploy Prod / Helm upgrade/install (prod) (push) Blocked by required conditions
2025-11-13 15:50:19 +01:00
ribardej
8ea1ef9eea Merge remote-tracking branch 'origin/main' 2025-11-13 14:33:50 +01:00
ribardej
4b614902b2 feat(docs): report.md update 2025-11-13 14:33:42 +01:00
a152ecbe4d fix main.py 2025-11-13 14:30:31 +01:00
7d7dd98d0f Merge remote-tracking branch 'origin/main' 2025-11-13 14:16:30 +01:00
5aca071ac2 update report 2025-11-13 14:16:21 +01:00
ribardej
80991c7390 Merge remote-tracking branch 'origin/main' 2025-11-13 14:09:04 +01:00
ribardej
1403e0029b feat(docs): report.md update 2025-11-13 14:08:52 +01:00
aa63e51e6a update report 2025-11-13 14:06:35 +01:00
Dejan Ribarovski
4aaaba3956 Merge pull request #52 from dat515-2025/51-refactor-project-structure
feat(docs): codebase refactor - added src directory
2025-11-13 13:58:24 +01:00
ribardej
f0c28ba9e1 feat(docs): codebase refactor - added src directory 2025-11-13 13:55:40 +01:00
ribardej
b560c07d62 feat(docs): codebase refactor - added src directory 2025-11-13 13:52:27 +01:00
ribardej
f0b1452e30 feat(docs): codebase refactor - added src directory 2025-11-13 13:45:41 +01:00
6effb2793a update report 2025-11-13 13:24:24 +01:00
ribardej
ba7798259c feat(docs): report.md update 2025-11-13 12:36:05 +01:00
deb67f421e Create README.md 2025-11-13 12:24:29 +01:00
74557eeea8 update report 2025-11-13 12:06:15 +01:00
2e0619d03f update report 2025-11-13 11:52:07 +01:00
169 changed files with 205 additions and 191 deletions

View File

@@ -15,7 +15,7 @@ on:
context: context:
description: "Docker build context path" description: "Docker build context path"
required: false required: false
default: "7project/backend" default: "7project/src/backend"
type: string type: string
pr_number: pr_number:
description: "PR number (required when mode=pr)" description: "PR number (required when mode=pr)"

View File

@@ -21,7 +21,7 @@ jobs:
with: with:
mode: pr mode: pr
image_repo: lukastrkan/cc-app-demo image_repo: lukastrkan/cc-app-demo
context: 7project/backend context: 7project/src/backend
pr_number: ${{ github.event.pull_request.number }} pr_number: ${{ github.event.pull_request.number }}
secrets: inherit secrets: inherit
@@ -90,9 +90,9 @@ jobs:
PR=${{ github.event.pull_request.number }} PR=${{ github.event.pull_request.number }}
RELEASE=myapp-pr-$PR RELEASE=myapp-pr-$PR
NAMESPACE=pr-$PR NAMESPACE=pr-$PR
helm upgrade --install "$RELEASE" ./7project/charts/myapp-chart \ helm upgrade --install "$RELEASE" ./7project/src/charts/myapp-chart \
-n "$NAMESPACE" --create-namespace \ -n "$NAMESPACE" --create-namespace \
-f 7project/charts/myapp-chart/values-dev.yaml \ -f 7project/src/charts/myapp-chart/values-dev.yaml \
--set prNumber="$PR" \ --set prNumber="$PR" \
--set deployment="pr-$PR" \ --set deployment="pr-$PR" \
--set domain="$DOMAIN" \ --set domain="$DOMAIN" \

View File

@@ -4,9 +4,9 @@ on:
push: push:
branches: [ "main" ] branches: [ "main" ]
paths: paths:
- 7project/backend/** - ../../7project/src/backend/**
- 7project/frontend/** - ../../7project/src/frontend/**
- 7project/charts/myapp-chart/** - ../../7project/src/charts/myapp-chart/**
- .github/workflows/deploy-prod.yaml - .github/workflows/deploy-prod.yaml
- .github/workflows/build-image.yaml - .github/workflows/build-image.yaml
- .github/workflows/frontend-pages.yml - .github/workflows/frontend-pages.yml
@@ -32,7 +32,7 @@ jobs:
with: with:
mode: prod mode: prod
image_repo: lukastrkan/cc-app-demo image_repo: lukastrkan/cc-app-demo
context: 7project/backend context: 7project/src/backend
secrets: inherit secrets: inherit
get_urls: get_urls:
@@ -103,9 +103,9 @@ jobs:
SMTP_FROM: ${{ secrets.SMTP_FROM }} SMTP_FROM: ${{ secrets.SMTP_FROM }}
UNIRATE_API_KEY: ${{ secrets.UNIRATE_API_KEY }} UNIRATE_API_KEY: ${{ secrets.UNIRATE_API_KEY }}
run: | run: |
helm upgrade --install myapp ./7project/charts/myapp-chart \ helm upgrade --install myapp ./7project/src/charts/myapp-chart \
-n prod --create-namespace \ -n prod --create-namespace \
-f 7project/charts/myapp-chart/values-prod.yaml \ -f 7project/src/charts/myapp-chart/values-prod.yaml \
--set deployment="prod" \ --set deployment="prod" \
--set domain="$DOMAIN" \ --set domain="$DOMAIN" \
--set domain_scheme="$DOMAIN_SCHEME" \ --set domain_scheme="$DOMAIN_SCHEME" \

View File

@@ -35,7 +35,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
defaults: defaults:
run: run:
working-directory: 7project/frontend working-directory: 7project/src/frontend
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -45,7 +45,7 @@ jobs:
with: with:
node-version: '20' node-version: '20'
cache: 'npm' cache: 'npm'
cache-dependency-path: 7project/frontend/package-lock.json cache-dependency-path: 7project/src/frontend/package-lock.json
- name: Install dependencies - name: Install dependencies
run: npm ci run: npm ci
@@ -61,7 +61,7 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: frontend-dist name: frontend-dist
path: 7project/frontend/dist path: 7project/src/frontend/dist
deploy: deploy:
name: Deploy to Cloudflare Pages name: Deploy to Cloudflare Pages

View File

@@ -46,21 +46,21 @@ jobs:
- name: Add test dependencies to requirements - name: Add test dependencies to requirements
run: | run: |
echo "pytest==8.4.2" >> ./7project/backend/requirements.txt echo "pytest==8.4.2" >> ./7project/src/backend/requirements.txt
echo "pytest-asyncio==1.2.0" >> ./7project/backend/requirements.txt echo "pytest-asyncio==1.2.0" >> ./7project/src/backend/requirements.txt
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -r ./7project/backend/requirements.txt pip install -r ./7project/src/backend/requirements.txt
- name: Run Alembic migrations - name: Run Alembic migrations
run: | run: |
alembic upgrade head alembic upgrade head
working-directory: ./7project/backend working-directory: ./7project/src/backend
- name: Run tests with pytest - name: Run tests with pytest
env: env:
PYTEST_RUN_CONFIG: "True" PYTEST_RUN_CONFIG: "True"
run: pytest run: pytest
working-directory: ./7project/backend working-directory: ./7project/src/backend

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

16
7project/.gitignore vendored
View File

@@ -1,8 +1,8 @@
/tofu/controlplane.yaml /src/tofu/controlplane.yaml
/tofu/kubeconfig /src/tofu/kubeconfig
/tofu/talosconfig /src/tofu/talosconfig
/tofu/terraform.tfstate /src/tofu/terraform.tfstate
/tofu/terraform.tfstate.backup /src/tofu/terraform.tfstate.backup
/tofu/worker.yaml /src/tofu/worker.yaml
/tofu/.terraform.lock.hcl /src/tofu/.terraform.lock.hcl
/tofu/.terraform/ /src/tofu/.terraform/

8
7project/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -1,43 +1,6 @@
# Lab 6: Design Document for Course Project # Personal Finance Tracker
## Folder Structure
| Lab 6: | Design Document for Course Project | - meetings: Contains note from meetings
| ----------- | ---------------------------------- | - scr: Source code for the project
| Subject: | DAT515 Cloud Computing | - checklist: Project checklist and self assessment tracking
| Deadline: | **September 19, 2025 23:59** | - report.md: Detailed report of the project
| Grading: | No Grade |
| Submission: | Group |
## Table of Contents
- [Table of Contents](#table-of-contents)
- [1. Design Document (design.md)](#1-design-document-designmd)
The design document is the first deliverable for your project.
We separated this out as a separate deliverable, with its own deadline, to ensure that you have a clear plan before you start coding.
This part only needs a cursory review by the teaching staff to ensure it is sufficiently comprehensive, while still realistic.
The teaching staff will assign you to a project mentor who will provide guidance and support throughout the development process.
## 1. Design Document (design.md)
You are required to prepare a design document for your application.
The design doc should be brief, well-organized and easy to understand.
The design doc should be prepared in markdown format and named `design.md` and submitted in the project group's repository.
Remember that you can use [mermaid diagrams](https://github.com/mermaid-js/mermaid#readme) in markdown files.
The design doc **should include** the following sections:
- **Overview**: A brief description of the application and its purpose.
- **Architecture**: The high-level architecture of the application, including components, interactions, and data flow.
- **Technologies**: The cloud computing technologies or services used in the application.
- **Deployment**: The deployment strategy for the application, including any infrastructure requirements.
The design document should be updated throughout the development process and reflect the final implementation of your project.
Optional sections may include:
- Security: The security measures implemented in the application to protect data and resources.
- Scalability: The scalability considerations for the application, including load balancing and auto-scaling.
- Monitoring: The monitoring and logging strategy for the application to track performance and detect issues.
- Disaster Recovery: The disaster recovery plan for the application to ensure business continuity in case of failures.
- Cost Analysis: The cost analysis of running the application on the cloud, including pricing models and cost-saving strategies.
- References: Any external sources or references used in the design document.

View File

@@ -1,4 +0,0 @@
import uvicorn
if __name__ == "__main__":
uvicorn.run("app.app:app", host="0.0.0.0", log_level="info")

View File

@@ -7,64 +7,64 @@ Focus on areas that align with your project goals and interests.
The core deliverables are required. The core deliverables are required.
This means that you must get at least 2 points for each item in this category. This means that you must get at least 2 points for each item in this category.
| **Category** | **Item** | **Max Points** | **Points** | | **Category** | **Item** | **Max Points** | **Points** | **Comments** |
|----------------------------------| --------------------------------------- | -------------- |-------------------------------------------------| |----------------------------------| --------------------------------------- | -------------- |-------------------------------------------------| |
| **Core Deliverables (Required)** | | | | | **Core Deliverables (Required)** | | | | |
| Codebase & Organization | Well-organized project structure | 5 | 5 | | Codebase & Organization | Well-organized project structure | 5 | 5 | |
| | Clean, readable code | 5 | 4 | | | Clean, readable code | 5 | 4 | |
| | Use planning tool (e.g., GitHub issues) | 5 | 4 | | | Use planning tool (e.g., GitHub issues) | 5 | 4 | |
| | Proper version control usage | 5 | 5 | | | Proper version control usage | 5 | 5 | |
| 23 | Complete source code | 5 | 5 | | 23 | Complete source code | 5 | 5 | |
| Documentation | Comprehensive reproducibility report | 10 | 4-5 | | Documentation | Comprehensive reproducibility report | 10 | 4-5 | |
| | Updated design document | 5 | 2 | | | Updated design document | 5 | 2 | |
| | Clear build/deployment instructions | 5 | 2 | | | Clear build/deployment instructions | 5 | 2 | |
| | Troubleshooting guide | 5 | 1 | | | Troubleshooting guide | 5 | 1 | |
| | Completed self-assessment table | 5 | 2 | | | Completed self-assessment table | 5 | 2 | |
| 14 | Hour sheets for all members | 5 | 3 | | 14 | Hour sheets for all members | 5 | 3 | |
| Presentation Video | Project demonstration | 5 | 0 | | Presentation Video | Project demonstration | 5 | 0 | |
| | Code walk-through | 5 | 0 | | | Code walk-through | 5 | 0 | |
| 0 | Deployment showcase | 5 | 0 | | 0 | Deployment showcase | 5 | 0 | |
| **Technical Implementation** | | | | | **Technical Implementation** | | | | |
| Application Functionality | Basic functionality works | 10 | 8 | | Application Functionality | Basic functionality works | 10 | 8 | |
| | Advanced features implemented | 10 | 0 | | | Advanced features implemented | 10 | 0 | |
| | Error handling & robustness | 10 | 4 | | | Error handling & robustness | 10 | 4 | |
| 16 | User-friendly interface | 5 | 4 | | 16 | User-friendly interface | 5 | 4 | |
| Backend & Architecture | Stateless web server | 5 | 5 | | Backend & Architecture | Stateless web server | 5 | 5 | |
| | Stateful application | 10 | ? WHAT DOES THIS MEAN | | | Stateful application | 10 | ? WHAT DOES THIS MEAN | |
| | Database integration | 10 | 10 | | | Database integration | 10 | 10 | |
| | API design | 5 | 5 | | | API design | 5 | 5 | |
| 20 | Microservices architecture | 10 | 0 | | 20 | Microservices architecture | 10 | 0 | |
| Cloud Integration | Basic cloud deployment | 10 | 10 | | Cloud Integration | Basic cloud deployment | 10 | 10 | |
| | Cloud APIs usage | 10 | ? WHAT DOES THIS MEAN | | | Cloud APIs usage | 10 | ? WHAT DOES THIS MEAN | |
| | Serverless components | 10 | 0 | | | Serverless components | 10 | 0 | |
| 10 | Advanced cloud services | 5 | 0 | | 10 | Advanced cloud services | 5 | 0 | |
| **DevOps & Deployment** | | | | | **DevOps & Deployment** | | | | |
| Containerization | Basic Dockerfile | 5 | 5 | | Containerization | Basic Dockerfile | 5 | 5 | |
| | Optimized Dockerfile | 5 | 0 | | | Optimized Dockerfile | 5 | 0 | |
| | Docker Compose | 5 | 5 - dev only | | | Docker Compose | 5 | 5 - dev only | |
| 15 | Persistent storage | 5 | 5 | | 15 | Persistent storage | 5 | 5 | |
| Deployment & Scaling | Manual deployment | 5 | 5 | | Deployment & Scaling | Manual deployment | 5 | 5 | |
| | Automated deployment | 5 | 5 | | | Automated deployment | 5 | 5 | |
| | Multiple replicas | 5 | 5 | | | Multiple replicas | 5 | 5 | |
| 20 | Kubernetes deployment | 10 | 10 | | 20 | Kubernetes deployment | 10 | 10 | |
| **Quality Assurance** | | | | | **Quality Assurance** | | | | |
| Testing | Unit tests | 5 | 2 | | Testing | Unit tests | 5 | 2 | |
| | Integration tests | 5 | 2 | | | Integration tests | 5 | 2 | |
| | End-to-end tests | 5 | 5 | | | End-to-end tests | 5 | 5 | |
| 9 | Performance testing | 5 | 0 | | 9 | Performance testing | 5 | 0 | |
| Monitoring & Operations | Health checks | 5 | 5 | | Monitoring & Operations | Health checks | 5 | 5 | |
| | Logging | 5 | 2 - only to terminal add logstash | | | Logging | 5 | 2 - only to terminal add logstash | |
| 9 | Metrics/Monitoring | 5 | 2 - only DB, need to create Prometheus endpoint | | 9 | Metrics/Monitoring | 5 | 2 - only DB, need to create Prometheus endpoint | |
| Security | HTTPS/TLS | 5 | 5 | | Security | HTTPS/TLS | 5 | 5 | |
| | Authentication | 5 | 5 | | | Authentication | 5 | 5 | |
| 15 | Authorization | 5 | 5 | | 15 | Authorization | 5 | 5 | |
| **Innovation & Excellence** | | | | | **Innovation & Excellence** | | | | |
| Advanced Features and | AI/ML Integration | 10 | 0 | | Advanced Features and | AI/ML Integration | 10 | 0 | |
| Technical Excellence | Real-time features | 10 | 0 | | Technical Excellence | Real-time features | 10 | 0 | |
| | Creative problem solving | 10 | ? | | | Creative problem solving | 10 | ? | |
| | Performance optimization | 5 | 2 | | | Performance optimization | 5 | 2 | |
| 2 | Exceptional user experience | 5 | 0 | | 2 | Exceptional user experience | 5 | 0 | |
| **Total** | | **255** | **153** | | **Total** | | **255** | **153** | |
## Grading Scale ## Grading Scale

View File

@@ -9,6 +9,8 @@
**Project Name**: Personal Finance Tracker **Project Name**: Personal Finance Tracker
**Deployment URL**: https://finance.ltrk.cz/
**Group Members**: **Group Members**:
- 289229, Lukáš Trkan, lukastrkan - 289229, Lukáš Trkan, lukastrkan
@@ -32,7 +34,7 @@ Other services deployed in the cluster includes Longhorn for persistent storage,
### High-Level Architecture ### High-Level Architecture
```mermaid ```mermaid
flowchart LR flowchart TB
n3(("User")) <--> client["Frontend"] n3(("User")) <--> client["Frontend"]
proc_queue["Message Queue"] --> proc_queue_worker["Worker Service"] proc_queue["Message Queue"] --> proc_queue_worker["Worker Service"]
proc_queue_worker -- SMTP --> ext_mail[("Email Service")] proc_queue_worker -- SMTP --> ext_mail[("Email Service")]
@@ -61,7 +63,7 @@ The workflow works in the following way:
- On every push to main, the production app is automatically updated - On every push to main, the production app is automatically updated
- UI is responsive for mobile devices - UI is responsive for mobile devices
- Slow operations (emails, transactions fetching) are handled - Slow operations (emails, transactions fetching) are handled
in the background by Celery workers. in the background by Celery workers.
- App is monitored using prometheus metrics endpoint and metrics are shown in Grafana dashboard. - App is monitored using prometheus metrics endpoint and metrics are shown in Grafana dashboard.
### Components ### Components
@@ -73,7 +75,8 @@ in the background by Celery workers.
- Worker service (backend/app/workers): Celery worker handling background tasks (emails, transactions fetching). - Worker service (backend/app/workers): Celery worker handling background tasks (emails, transactions fetching).
- Database (MariaDB with Maxscale): Persists users, categories, transactions; schema managed by Alembic migrations. - Database (MariaDB with Maxscale): Persists users, categories, transactions; schema managed by Alembic migrations.
- Message Queue (RabbitMQ): Queues background tasks for Celery workers. - Message Queue (RabbitMQ): Queues background tasks for Celery workers.
- Infrastructure as Code (tofu/): OpenTofu modules provisioning cluster services (RabbitMQ, Redis, Cloudflare tunnel, etc.). - Infrastructure as Code (tofu/): OpenTofu modules provisioning cluster services (RabbitMQ, Redis, Cloudflare tunnel,
etc.).
- Deployment Chart (charts/myapp-chart/): Helm chart to deploy the application to Kubernetes. - Deployment Chart (charts/myapp-chart/): Helm chart to deploy the application to Kubernetes.
### Technologies Used ### Technologies Used
@@ -135,10 +138,10 @@ in the background by Celery workers.
#### Backend #### Backend
- `MOJEID_CLIENT_ID`, `MOJEID_CLIENT_SECRET` \- OAuth client ID and secret for - `MOJEID_CLIENT_ID`, `MOJEID_CLIENT_SECRET` \- OAuth client ID and secret for
MojeID - https://www.mojeid.cz/en/provider/ [MojeID](https://www.mojeid.cz/en/provider/)
- `BANKID_CLIENT_ID`, `BANKID_CLIENT_SECRET` \- OAuth client ID and secret for BankID - https://developer.bankid.cz/ - `BANKID_CLIENT_ID`, `BANKID_CLIENT_SECRET` \- OAuth client ID and secret for [BankID](https://developer.bankid.cz/)
- `CSAS_CLIENT_ID`, `CSAS_CLIENT_SECRET` \- OAuth client ID and secret for Česká - `CSAS_CLIENT_ID`, `CSAS_CLIENT_SECRET` \- OAuth client ID and secret for [Česká
spořitelna - https://developers.erstegroup.com/docs/apis/bank.csas spořitelna](https://developers.erstegroup.com/docs/apis/bank.csas)
- `DATABASE_URL`(or `MARIADB_HOST`, `MARIADB_PORT`, `MARIADB_DB`, `MARIADB_USER`, `MARIADB_PASSWORD`) \- MariaDB - `DATABASE_URL`(or `MARIADB_HOST`, `MARIADB_PORT`, `MARIADB_DB`, `MARIADB_USER`, `MARIADB_PASSWORD`) \- MariaDB
connection details connection details
- `RABBITMQ_USERNAME`, `RABBITMQ_PASSWORD` \- credentials for RabbitMQ - `RABBITMQ_USERNAME`, `RABBITMQ_PASSWORD` \- credentials for RabbitMQ
@@ -204,7 +207,7 @@ uvicorn app.app:fastApi --reload --host 0.0.0.0 --port 8000
### 6) Run Celery worker (optional, in another terminal) ### 6) Run Celery worker (optional, in another terminal)
```bash ```bash
cd Group-8/7project/backend cd Group-8/7project/src/backend
source .venv/bin/activate source .venv/bin/activate
celery -A app.celery_app.celery_app worker -l info celery -A app.celery_app.celery_app worker -l info
``` ```
@@ -234,7 +237,7 @@ docker buildx build --platform linux/amd64,linux/arm64 -t CHANGE_ME --push .
### Frontend ### Frontend
```bash ```bash
cd project7/frontend cd project7/src/frontend
npm ci npm ci
npm run build npm run build
``` ```
@@ -253,7 +256,7 @@ running on top of Proxmox VE.
4) Navigate to tofu directory 4) Navigate to tofu directory
```bash ```bash
cd 7project/tofu cd 7project/src/tofu
```` ````
5) Set IP addresses in environment variables 5) Set IP addresses in environment variables
@@ -416,37 +419,17 @@ tofu apply
- UNIRATE_API_KEY - UNIRATE_API_KEY
5) On Github open Actions tab, select "Deploy Prod" and run workflow manually 5) On Github open Actions tab, select "Deploy Prod" and run workflow manually
# TODO: REMOVE I guess
2) Deploy the app using Helm
```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"
```
## Testing Instructions ## Testing Instructions
The tests are located in 7project/backend/tests directory. All tests are run by GitHub actions on every pull request and The tests are located in 7project/backend/tests directory. All tests are run by GitHub actions on every pull request and
push to main. push to main.
See the workflow [here](../.github/workflows/run-tests.yml). See the workflow [here](../.github/workflows/run-tests.yml).
If you want to run the tests locally, the preferred is to use a [bash script](backend/test-with-ephemeral-mariadb.sh) If you want to run the tests locally, the preferred way is to use a [bash script](backend/test_locally.sh)
that will start a [test DB container](backend/docker-compose.test.yml) and remove it afterward. that will start a test DB container with [docker compose](backend/docker-compose.test.yml) and remove it afterwards.
```bash ```bash
cd 7project/backend cd 7project/src/backend
bash test-with-ephemeral-mariadb.sh bash test_locally.sh
``` ```
### Unit Tests ### Unit Tests
@@ -454,7 +437,7 @@ bash test-with-ephemeral-mariadb.sh
There are only 5 basic unit tests, since our services logic is very simple There are only 5 basic unit tests, since our services logic is very simple
```bash ```bash
bash test-with-ephemeral-mariadb.sh --only-unit bash test_locally.sh --only-unit
``` ```
### Integration Tests ### Integration Tests
@@ -462,7 +445,7 @@ bash test-with-ephemeral-mariadb.sh --only-unit
There are 9 basic unit tests, testing the individual backend API logic There are 9 basic unit tests, testing the individual backend API logic
```bash ```bash
bash test-with-ephemeral-mariadb.sh --only-integration bash test_locally.sh --only-integration
``` ```
### End-to-End Tests ### End-to-End Tests
@@ -470,7 +453,7 @@ bash test-with-ephemeral-mariadb.sh --only-integration
There are 7 e2e tests, testing more complex app logic There are 7 e2e tests, testing more complex app logic
```bash ```bash
bash test-with-ephemeral-mariadb.sh --only-e2e bash test_locally.sh --only-e2e
``` ```
## Usage Examples ## Usage Examples
@@ -503,7 +486,10 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
### Frontend ### Frontend
- Start with: npm run dev in 7project/frontend - Start with:
```bash
npm run dev in 7project/src/frontend
```
- Ensure VITE_BACKEND_URL is set to the backend URL (e.g., http://127.0.0.1:8000) - Ensure VITE_BACKEND_URL is set to the backend URL (e.g., http://127.0.0.1:8000)
- Open http://localhost:5173 - Open http://localhost:5173
- Login, view latest transactions, filter, and add new transactions from the UI. - Login, view latest transactions, filter, and add new transactions from the UI.
@@ -525,6 +511,9 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
## Troubleshooting ## Troubleshooting
running on arm
tofu apply error
### Common Issues ### Common Issues
#### Issue 1: [Common problem] #### Issue 1: [Common problem]
@@ -598,18 +587,22 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
### Dejan ### Dejan
| Date | Activity | Hours | Description | | Date | Activity | Hours | Description | Representative Commit / PR |
|-----------------|----------------------|--------|---------------------------------------------------------------| |:----------------|:-------------------------|:-------|:--------------------------------------------------------------|:---------------------------------------------------------|
| 25.9. | Design | 2 | 6design | | 25.9. | Design | 2 | 6design | |
| 9.10 to 11.10. | Backend APIs | 12 | Implemented Backend APIs | | 9.10 to 11.10. | Backend APIs | 14 | Implemented Backend APIs | `PR #26`, `20-create-a-controller-layer-on-backend-side` |
| 13.10 to 15.10. | Frontend Development | 8 | Created user interface mockups | | 13.10 to 15.10. | Frontend Development | 8 | Created user interface mockups | `PR #28`, `frontend basics` |
| Continually | Documentation | 6 | Documenting the dev process | | Continually | Documentation | 7 | Documenting the dev process | |
| 21.10 to 23.10 | Tests, frontend | 10 | Test basics, balance charts, and frontend improvement | | 21.10 to 23.10 | Tests, frontend | 10 | Test basics, balance charts, and frontend improvement | `PR #31`, `30 create tests and set up a GitHub pipeline` |
| 28.10 to 30.10 | CI | 6 | Integrated tests with test database setup on github workflows | | 28.10 to 30.10 | CI | 6 | Integrated tests with test database setup on github workflows | `PR #28`, `frontend basics` |
| 28.10 to 30.10 | Frontend | 7 | UI improvements and exchange rate API integration | | 28.10 to 30.10 | Frontend | 8 | UI improvements and exchange rate API integration | `PR #28`, `frontend basics` |
| 4.11 to 6.11 | Tests | 6 | Test fixes improvement, more integration and e2e | | 4.11 to 6.11 | Tests | 6 | Test fixes improvement, more integration and e2e | `PR #28`, `frontend basics` |
| 4.11 to 6.11 | Frontend | 6 | Fixes, Improved UI, added support for mobile devices | | 4.11 to 6.11 | Frontend | 6 | Fixes, Improved UI, added support for mobile devices | `PR #28`, `frontend basics` |
| **Total** | | **63** | | | 11.11 | Backend APIs | 4 | Moved rates API, mock bank to Backend, few fixes | `PR #28`, `frontend basics` |
| 11.11 to 12.11 | Tests | 3 | Local testing DB container, few fixes | `PR #28`, `frontend basics` |
| 12.11 | Frontend | 3 | Enabled multiple transaction edits at once, CSAS button state | `PR #28`, `frontend basics` |
| 13.11 | Video | 3 | Video | |
| **Total** | | **80** | | |
### Group Total: [XXX.X] hours ### Group Total: [XXX.X] hours
@@ -627,7 +620,11 @@ curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8000/authenticated-route
This was caused by single SATA SSD disk running all VMs. This was solved by adding second NVMe disk just for Talos VMs. This was caused by single SATA SSD disk running all VMs. This was solved by adding second NVMe disk just for Talos VMs.
[Describe the main challenges and how you overcame them] #### Stucked IaC deployment
If the deployed module (helm chart for example) was not configured properly, it would get stuck and timeout resulting in
namespace that cannot be deleted.
This was solved by using snapshots in Proxmox and restoring if this happened.
### If We Did This Again ### If We Did This Again
@@ -654,7 +651,11 @@ used not only by myself.
[Personal reflection on growth, challenges, and learning] [Personal reflection on growth, challenges, and learning]
#### [Team Member 2 Name] #### [Dejan]
Since I do not have a job, this project was probably the most complex one I have ever worked on.
It was also the first school project where I was encouraged to use AI.
Lukas
[Personal reflection on growth, challenges, and learning] [Personal reflection on growth, challenges, and learning]

23
7project/src/README.md Normal file
View File

@@ -0,0 +1,23 @@
## Folder structure
- `src/`
- `backend/`
- `alembic/` - database migrations
- `app/` - main application code
- `tests/` - tests
- `docker-compose.test.yml` - docker compose for testing database
- `Dockerfile` - production Dockerfile
- `main.py` - App entrypoint
- `requirements.txt` - Python dependencies
- `test_locally.sh` - script to run tests with temporary database
- `charts/`
- `myapp-chart/` - Helm chart for deploying the application, supports prod and dev environments
- `frontend/` - React frontend application
- `tofu/` - Terraform/OpenTofu services deployment configurations
- `modules/` - separated modules for different services
- `main.tf` - main deployment configuration
- `variables.tf` - deployment variables
- `terraform.tfvars.example` - example variables file
- `compose.yaml` - Docker Compose file for local development
- `create_migration.sh` - script to create new Alembic database migration
- `upgrade_database.sh` - script to upgrade database to latest Alembic revision

8
7project/src/backend/.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -0,0 +1,4 @@
import uvicorn
if __name__ == "__main__":
uvicorn.run("app.app:fastApi", host="0.0.0.0", log_level="info")

View File

@@ -4,13 +4,13 @@ set -euo pipefail
# Run tests against a disposable local MariaDB on host port 3307 using Docker Compose. # Run tests against a disposable local MariaDB on host port 3307 using Docker Compose.
# Requirements: Docker, docker compose plugin, Python, Alembic, pytest. # Requirements: Docker, docker compose plugin, Python, Alembic, pytest.
# Usage: # Usage:
# chmod +x ./test-with-ephemeral-mariadb.sh # chmod +x ./test_locally.sh
# # From 7project/backend directory # # From 7project/backend directory
# ./test-with-ephemeral-mariadb.sh [--only-unit|--only-integration|--only-e2e] [pytest-args...] # ./test_locally.sh [--only-unit|--only-integration|--only-e2e] [pytest-args...]
# # Examples: # # Examples:
# ./test-with-ephemeral-mariadb.sh --only-unit -q # ./test_locally.sh --only-unit -q
# ./test-with-ephemeral-mariadb.sh --only-integration -k "login" # ./test_locally.sh --only-integration -k "login"
# ./test-with-ephemeral-mariadb.sh --only-e2e -vv # ./test_locally.sh --only-e2e -vv
# #
# This script will: # This script will:
# 1) Start a MariaDB 11.4 container (ephemeral storage, port 3307) # 1) Start a MariaDB 11.4 container (ephemeral storage, port 3307)

Some files were not shown because too many files have changed in this diff Show More