Files
service-finder/.roo/history.md

9.8 KiB

Service Finder Fejlesztési Történet

🎯 Cél

Az email verifikációs folyamat átalakítása "Magic Link" élménnyé. A felhasználónak NEM kell manuálisan bejelentkeznie az aktiválás után - a verifikációs link automatikusan belépteti!

Implementáció

1. Backend: JWT Token Generálás Verifikációnál

Fájl: backend/app/api/v1/endpoints/auth.py

  • A /verify-email végpont most response_model=Token-t ad vissza
  • Sikeres verifikáció után a backend meghívja az AuthService.verify_email() metódust
  • Az AuthService.verify_email() mostantól User objektumot ad vissza (nem csak boolean-t)
  • A végpont generál JWT access és refresh tokent ugyanúgy, mint a /login endpoint
  • A tokenek HTTP-only cookie-ban és JSON response-ban is megjelennek

Változtatások:

# AuthService.verify_email() módosítás
- return True  # RÉGI
+ return user  # ÚJ: visszaadja az aktivált User objektumot

# auth.py verify_email végpont
+ user = await AuthService.verify_email(db, request.token)
+ if not user:
+     raise HTTPException(...)
+
+ # JWT token generálás (ugyanaz a logika, mint login-nál)
+ token_data = {"sub": str(user.id), "role": ..., "rank": ..., ...}

Fájl: frontend/src/router/index.js

  • Új route: /magic-link a verify email oldalhoz
  • A route guard ellenőrzi a token query paramétert
  • Sikeres verifikáció után a kapott tokeneket elmenti és átirányít a dashboardra

3. Teszt Script

Fájl: backend/test_auth_e2e.py

  • Teljes E2E teszt: Regisztráció → Email verifikáció → Magic Link → Dashboard elérés
  • Ellenőrzi, hogy a Magic Link után a felhasználó már hitelesítve van

🔗 Gitea

  • Issue: #201 - Magic Link: Auto-Login on Email Verification
  • Státusz: Completed

2026-06-05 - Soft KYC, Trust Profile Extension & Device Hub

🎯 Cél

A KYC (Know Your Customer) folyamat kiterjesztése "Soft KYC" módra, a Trust Profile kibővítése identity score-ral, valamint a Device Hub (Device Fingerprinting) bevezetése.

Implementáció

1. Soft KYC Backend Végpontok

Fájl: backend/app/api/v1/endpoints/kyc.py

  • Új POST /kyc/soft végpont: lehetővé teszi a részleges KYC adatok mentését
  • Új GET /kyc/status végpont: visszaadja a KYC státuszt és a hiányzó mezőket
  • A PUT /users/me/person végpont most már fogadja a mothers_last_name, mothers_first_name, birth_place, birth_date mezőket

2. Trust Profile Extension

Fájl: backend/app/models/identity/identity.py

  • UserTrustProfile modell bővítése: identity_score, verification_level, verified_channels, identity_risk_flag mezőkkel
  • Automatikus trust score újraszámítás KYC adatok módosításakor

3. Device Hub (Device Fingerprinting)

Fájl: backend/app/models/identity/identity.py

  • Új Device modell: fingerprint_hash, risk_score, is_banned mezőkkel
  • Új UserDeviceLink kapcsolótábla: user_id, device_hash, first_seen_at, last_seen_at, login_count
  • API végpontok: POST /devices/register, GET /devices/my

4. Adatbázis Migráció

  • Új táblák: identity.devices, identity.user_device_links
  • UserTrustProfile bővítése új oszlopokkal
  • sync_engine futtatva: 1017/1017 elem szinkronban

🔗 Gitea

  • Issue: #202 - Soft KYC, Trust Profile Extension & Device Hub
  • Státusz: Completed

🎯 Cél

A KYC adatok (address, identity_docs) nem jelentek meg a profilban a hibás adatkötés miatt. Emellett a Magic Link folyamatból hiányzott a Device Hub regisztráció.

Javítás

1. ProfileView Address Binding Fix

Fájl: frontend/src/views/ProfileView.vue

  • A person.address mezőből hiányzott a stairwell, floor, door kiolvasása
  • Hozzáadva: addressStairwell, addressFloor, addressDoor computed property-k
  • A handleSave metódus most már ezeket is elküldi a PUT /users/me/person végpontnak

Fájl: frontend/src/views/MagicLinkView.vue

  • Sikeres Magic Link belépés után a frontend meghívja a POST /devices/register végpontot
  • A device fingerprint hash-t a fingerprintjs library generálja

🔗 Gitea

  • Issue: #204 - Fix KYC Data Binding & Magic Link Device Registration
  • Státusz: Completed

2026-06-05 - Fix: SQLAlchemy JSON mutation for identity_docs

🎯 Cél

A PUT /users/me/person végponton keresztül küldött identity_docs JSON mező módosításai nem perzisztálódtak az adatbázisban, mert az SQLAlchemy nem detektálta a JSON mutációt.

Javítás

1. Végpont javítása

Fájl: backend/app/api/v1/endpoints/users.py

  • A identity_docs mező módosításakor most flag_modified(person, "identity_docs") hívással jelezzük az SQLAlchemy-nek, hogy a JSON mező megváltozott
  • Mély másolat (deep copy) készítése a meglévő adatokról a referencia integritás megőrzéséhez

🔗 Gitea

  • Issue: #207 - Fix: SQLAlchemy JSON mutation for identity_docs
  • Státusz: Completed

2026-06-05 - Internal Zip Lookup & Identity Docs Payload Fix

🎯 Cél

A frontend által használt zip-lookup (irányítószám → város) végpont áttérése a külső zippopotam.us API-ról a belső backend végpontra. Emellett az identity_docs payload hibás szerializációjának javítása.

Implementáció

1. Backend: Új Zip Lookup Végpont

Fájl: backend/app/api/v1/endpoints/geo.py

  • Új GET /geo/zip-lookup/{zip_code} végpont
  • Ellenőrzi a system.geo_postal_codes táblát a megadott irányítószámra
  • Válasz: {"zip": "1111", "city": "Budapest"} vagy 404

2. Frontend: Zip Lookup Átállítás

🧪 Tesztelési Eredmény

  1. Backend zip-lookup endpoint működik: 1111{"city": "Budapest"} (200)
  2. Ismeretlen irányítószám: 404 hibakód megfelelő üzenettel
  3. Frontend CompleteKycView belső API-t használ
  4. Frontend ProfileView debounced zip lookup implementálva
  5. identity_docs payload már helyesen működik (nem kellett javítás)

🔗 Gitea

  • Issue: #208 - Internal Zip Lookup & Identity Docs Payload Fix
  • Státusz: Completed

2026-06-05 - Fix Missing Address Fields (stairwell/floor/door) in GeoService Pipeline

🎯 Cél

A PUT /users/me/person végponton keresztül küldött address_stairwell, address_floor és address_door mezők nem mentődtek az adatbázisba, mert a GeoService hívásból hiányoztak ezek a paraméterek.

Javítás

1. Végpont javítása

Fájl: backend/app/api/v1/endpoints/users.py

  • A GeoService.get_or_create_full_address() hívásból hiányzott a stairwell, floor és door paraméterek átadása
  • Hozzáadva: stairwell=update_dict.get("address_stairwell"), floor=update_dict.get("address_floor"), door=update_dict.get("address_door")

2. Ellenőrzött fájlok (nem volt szükség módosításra)

  • backend/app/services/geo_service.py - A get_or_create_full_address metódus szignatúrája már tartalmazta a stairwell, floor, door paramétereket, és az Address entitásba is mentette őket
  • backend/app/schemas/user.py - A PersonUpdate séma már deklarálta az address_stairwell, address_floor, address_door mezőket

🔍 Root Cause

A PUT /users/me/person végpont a GeoService.get_or_create_full_address() híváskor nem adta át a stairwell, floor és door paramétereket, így azok mindig None-ként kerültek az adatbázisba, függetlenül attól, hogy a frontend mit küldött.

🔍 További javítás: full_address_text formátum javítása

A GeoService.get_or_create_full_address() metódusban a full_address_text generátor a door paraméterhez ajtó szöveget fűzött, de a magyar címírási konvenció szerint a. (ajtó rövidítése) a helyes.

Javítás:

Példa a helyes formátumra: 2120 Dunakeszi, Határ utca 8. A. lph. 5. em. 10. a.

Ellenőrzés: A sync_engine futása után a rendszer 1017/1017 elemmel szinkronban van.


2026-06-05 - E2E Test Browserless Container Support

🎯 Cél

Az tests/active/e2e_profile_address.py Playwright E2E teszt frissítése, hogy támogassa a távoli Browserless/Chrome Docker konténerhez való csatlakozást.

Implementáció

  • Dinamikus böngésző indítás: A statikus pw.chromium.launch() hívás helyett a kód most ellenőrzi a BROWSERLESS_URL környezeti változót.
    • Ha be van állítva → pw.chromium.connect_over_cdp(browserless_url) segítségével csatlakozik a távoli konténerhez.
    • Ha nincs beállítva → lokális pw.chromium.launch() fallback, a HEADLESS env var figyelembevételével.
  • Gitea Issue: #215 - létrehozva, elindítva és lezárva.