9.8 KiB
Service Finder Fejlesztési Történet
2026-06-04 (B) - Magic Link Implementáció (Auto-Login Email Verification)
🎯 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-emailvégpont mostresponse_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
/loginendpoint - 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": ..., ...}
2. Frontend Magic Link Handler
Fájl: frontend/src/router/index.js
- Új route:
/magic-linka verify email oldalhoz - A route guard ellenőrzi a
tokenquery 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/softvégpont: lehetővé teszi a részleges KYC adatok mentését - Új
GET /kyc/statusvégpont: visszaadja a KYC státuszt és a hiányzó mezőket - A
PUT /users/me/personvégpont most már fogadja amothers_last_name,mothers_first_name,birth_place,birth_datemezőket
2. Trust Profile Extension
Fájl: backend/app/models/identity/identity.py
UserTrustProfilemodell bővítése:identity_score,verification_level,verified_channels,identity_risk_flagmező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
Devicemodell:fingerprint_hash,risk_score,is_bannedmezőkkel - Új
UserDeviceLinkkapcsoló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 UserTrustProfilebővítése új oszlopokkalsync_enginefuttatva: 1017/1017 elem szinkronban
🔗 Gitea
- Issue: #202 - Soft KYC, Trust Profile Extension & Device Hub
- Státusz: Completed
2026-06-05 - Fix KYC Data Binding & Magic Link Device Registration
🎯 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.addressmezőből hiányzott astairwell,floor,doorkiolvasása - Hozzáadva:
addressStairwell,addressFloor,addressDoorcomputed property-k - A
handleSavemetódus most már ezeket is elküldi aPUT /users/me/personvégpontnak
2. Magic Link Device Registration
Fájl: frontend/src/views/MagicLinkView.vue
- Sikeres Magic Link belépés után a frontend meghívja a
POST /devices/registervégpontot - A device fingerprint hash-t a
fingerprintjslibrary 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_docsmező módosításakor mostflag_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_codestá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
frontend/src/views/CompleteKycView.vue- zippopotam.us → internal APIfrontend/src/views/ProfileView.vue- Debounced zip lookup watcher
🧪 Tesztelési Eredmény
- ✅ Backend zip-lookup endpoint működik:
1111→{"city": "Budapest"}(200) - ✅ Ismeretlen irányítószám: 404 hibakód megfelelő üzenettel
- ✅ Frontend CompleteKycView belső API-t használ
- ✅ Frontend ProfileView debounced zip lookup implementálva
- ✅ 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 astairwell,floorésdoorparamé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- Aget_or_create_full_addressmetódus szignatúrája már tartalmazta astairwell,floor,doorparamétereket, és az Address entitásba is mentette őketbackend/app/schemas/user.py- APersonUpdateséma már deklarálta azaddress_stairwell,address_floor,address_doormező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:
backend/app/services/geo_service.py-{door}. ajtó→{door}. a.
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 aBROWSERLESS_URLkö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, aHEADLESSenv var figyelembevételével.
- Ha be van állítva →
- Gitea Issue: #215 - létrehozva, elindítva és lezárva.