Aplikacja do zarządzania budżetem domowym (FastAPI + SQLite/MySQL) z prostym, statycznym frontendem serwowanym przez FastAPI. Zaimplementowano pełną autentykację JWT (rejestracja/logowanie) oraz logowanie przez konto Google (OAuth2/OpenID Connect – Authlib). UI wyświetla e‑mail zalogowanego użytkownika obok przycisku „Wyloguj”.
Jest to projekt końcowy kursu Ready 4 AI
- Rejestracja i logowanie na e‑mail/hasło (JWT w localStorage)
- Logowanie przez Google (przekierowanie do Google, powrót na
/api/auth/google/callbacki wydanie lokalnego JWT) - Kategorie: tworzenie, lista, edycja, usuwanie
- Transakcje: tworzenie, lista z filtrami, usuwanie, szybki podgląd ostatnich
- Raporty: bilans oraz zestawienie wg kategorii
- Statyczny frontend (HTML + JS) serwowany z aplikacji
- app/
- main.py — konfiguracja aplikacji, CORS, SessionMiddleware, serwowanie statycznego frontendu
- api/ — moduły API (auth, google_auth, categories, transactions, reports, debug)
- core/ — konfiguracja (
config.py), bezpieczeństwo/JWT (security.py) - database.py — inicjalizacja bazy SQLAlchemy (SQLite domyślnie)
- models.py, schemas.py — modele ORM i schematy Pydantic
- static/ — pliki frontendu (index.html, login.html, register.html, main.js)
- requirements.txt — zależności
- README.md — ten plik
Gotowy obraz dostępny na Docker Hub:
👉 matemxvi/budget-planner
docker pull matemxvi/budget-plannerdocker run -d -p 8000:8000 matemxvi/budget-planner:latestUWAGA! W Dockerze obecnie nie działa logowanie przez konto Google!
- Python 3.11+
- Pip/virtualenv
- Pobranie kodu źródłowego
git clone https://github.com/matemxvi/budget-planner.git
cd budget-planner- (Opcjonalnie) środowisko wirtualne Windows:
python -m venv .venv
.venv\Scripts\Activate.ps1Linux:
python3 -m venv .venv
source .venv/bin/activate- Instalacja zależności
pip install -r requirements.txt- Konfiguracja środowiska (plik .env w katalogu głównym repo) Przykład minimalny do pracy lokalnej przy adresie 127.0.0.1:8000:
DATABASE_URL=sqlite:///./budget_planner.db
SERVER_BASE_URL=http://127.0.0.1:8000
GOOGLE_CLIENT_ID=...twoj_client_id... GOOGLE_CLIENT_SECRET=...twoj_client_secret...
-
Start aplikacji (dev) uvicorn app.main:app --reload
-
Wejdź w przeglądarce:
- http://127.0.0.1:8000/ — aplikacja (wymaga zalogowania, w przypadku braku użytkownika rejestracji, można zrobić przez konto Google)
- Swagger/OpenAPI: http://127.0.0.1:8000/docs
- Google Cloud Console → APIs & Services → Credentials → utwórz OAuth 2.0 Client ID (Web application).
- Authorized redirect URIs dodaj dokładnie adres(y) powrotu, np. dla pracy lokalnej:
- http://127.0.0.1:8000/api/auth/google/callback (opcjonalnie) dodaj też wariant z „localhost”:
- http://localhost:8000/api/auth/google/callback
- (Opcjonalnie) Authorized JavaScript origins:
- Wstaw GOOGLE_CLIENT_ID i GOOGLE_CLIENT_SECRET do pliku .env.
- Upewnij się, że SERVER_BASE_URL w .env jest zgodny z tym, czego używasz w przeglądarce (np. 127.0.0.1 vs localhost). Mismatch spowoduje błąd 400 redirect_uri_mismatch.
- Na ekranie logowania kliknij Zarejestruj się lub Zaloguj się jezeli już posiadasz konto
- Aby użyć logowania Google, kliknij „Zaloguj przez Google”; po powrocie token JWT zostanie zapisany w localStorage, a aplikacja przekieruje na „/”.
- Po zalogowaniu w nagłówku obok „Wyloguj” zobaczysz swój adres e‑mail.
- W aplikacji możesz dodawać kategorie i transakcje, filtrować, kasować oraz przeglądać szybkie raporty.
Uwierzytelnianie (JWT):
- POST /api/auth/register — body JSON: {"email","password"} → tworzy konto
- POST /api/auth/login — form-urlencoded: username, password → zwraca {access_token}
- GET /api/auth/me — dane bieżącego użytkownika (Authorization: Bearer )
- GET /api/auth/google/login — przekierowanie do Google (przeglądarka)
- GET /api/auth/google/callback — punkt powrotu z Google (generuje lokalny JWT)
Zasoby (wymagają Bearer token):
- /api/categories — GET, POST, GET/{id}, PUT/{id}, DELETE/{id}
- /api/transactions — GET (filtry: type, category_id, date_from, date_to, q, limit), POST, GET/{id}, PUT/{id}, DELETE/{id}
- /api/reports/balance — GET
- /api/reports/monthly — GET
- /api/reports/by-category — GET
Nagłówek autoryzacji dla żądań zabezpieczonych: Authorization: Bearer <JWT_TOKEN>
Przykład (PowerShell, pobranie bilansu): $Headers = @{ Authorization = "Bearer $env:ACCESS_TOKEN" } Invoke-WebRequest -Uri http://127.0.0.1:8000/api/reports/balance -Headers $Headers
- 400 redirect_uri_mismatch:
- Upewnij się, że redirect_uri wysyłane przez aplikację (SERVER_BASE_URL + /api/auth/google/callback) jest literalnie takie samo jak wpis w Google Console.
- 127.0.0.1 i localhost traktowane są jako różne hosty — dodaj oba, jeśli korzystasz z obu.
- „SessionMiddleware must be installed…”:
- Aplikacja ma włączony SessionMiddleware; zrestartuj serwer po instalacji zależności i zmianach .env.
- 401 Unauthorized:
- Brak/niepoprawny Bearer token w nagłówku Authorization albo wygasły JWT — zaloguj się ponownie.
- ImportError: Authlib/pydantic-settings:
- Upewnij się, że wykonałeś
pip install -r requirements.txt.
- Upewnij się, że wykonałeś
- Domyślnie używane jest SQLite. Możesz podać
DATABASE_URL(np. MySQL przezmysql+pymysql://user:pass@host:3306/db). - W produkcji korzystaj z HTTPS i silnych kluczy w .env.
Aplikacja ma zestaw testów oparty na pytest, obejmujący najważniejsze ścieżki backendu.
Jak uruchomić testy:
- Zainstaluj zależności (uwzględnia pytest): pip install -r requirements.txt
- Z katalogu głównego repo uruchom: pytest -q
Informacje o środowisku testowym:
- Testy używają niezależnej, w pamięci (in-memory) bazy SQLite i nadpisują zależność get_db w FastAPI, więc nie modyfikują lokalnego pliku budget_planner.db.
- Nie musisz konfigurować .env do testów – testy nie korzystają z Google OAuth end-to-end.
- Testy uruchamiają FastAPI w TestClient, więc nie jest potrzebny działający serwer uvicorn.
Zakres testów (skrót):
- Autoryzacja: rejestracja, logowanie, /api/auth/me, obsługa duplikatu e‑maila, brak autoryzacji.
- Kategorie: tworzenie, lista, usuwanie; weryfikacja odłączania transakcji (category_id=NULL) zamiast ich kasowania.
- Transakcje i raporty: filtry, raport bilansu, raport miesięczny, raport wg kategorii.
- Debug: /api/debug/clear kasuje tylko dane bieżącego użytkownika (izolacja użytkowników).