9.3 KiB
🏗️ Cím API Végpontok Egységességi Auditja
Dátum: 2026-07-01
Auditor: Rendszer-Architect
Cél: Annak ellenőrzése, hogy a címet kezelő API végpontok be- és kimeneti formátuma egységes-e, és alkalmas-e egy központi címmodul (Address Module) kezelésére.
📊 Összefoglaló
Verdikt: 🔴 NEM EGYSÉGES — 3 párhuzamos címformátum létezik, súlyos inkonzisztenciákkal.
A rendszerben jelenleg 3 féle cím séma és 2 teljesen eltérő címkezelési stratégia fut párhuzamosan. Egy központi címmodul bevezetése sürgős refaktorálást igényel.
🔍 Feltárt címformátumok
1. AddressIn / AddressOut (Unified P0 Refactored)
Fájl: backend/app/schemas/address.py
| Mező | Típus | Leírás |
|---|---|---|
zip |
Optional[str] |
Irányítószám |
city |
Optional[str] |
Város |
street_name |
Optional[str] |
Utca neve |
street_type |
Optional[str] |
Közterület jellege |
house_number |
Optional[str] |
Házszám |
stairwell |
Optional[str] |
Lépcsőház |
floor |
Optional[str] |
Emelet |
door |
Optional[str] |
Ajtó |
parcel_id |
Optional[str] |
Helyrajzi szám |
full_address_text |
Optional[str] |
Teljes cím szöveg |
latitude |
Optional[float] |
GPS szélesség |
longitude |
Optional[float] |
GPS hosszúság |
Használja: organizations.py (P0 refactored — nested AddressIn bemenet, AddressOut kimenet)
2. AddressResponse (user.py séma)
Fájl: backend/app/schemas/user.py
| Mező | Típus | Eltérés |
|---|---|---|
address_zip |
Optional[str] |
🟡 address_ előtaggal |
address_city |
Optional[str] |
🟡 address_ előtaggal |
address_street_name |
Optional[str] |
|
address_street_type |
Optional[str] |
|
address_house_number |
Optional[str] |
|
address_stairwell |
Optional[str] |
|
address_floor |
Optional[str] |
|
address_door |
Optional[str] |
|
address_hrsz |
Optional[str] |
🟡 eltérő név: hrsz vs parcel_id |
full_address_text |
Optional[str] |
|
latitude |
Optional[float] |
|
longitude |
Optional[float] |
Használja: users.py (response), admin_persons.py (response + input: PersonAddressUpdate)
3. Admin endpointok saját belső sémái
Fájl: backend/app/api/v1/endpoints/admin_providers.py
| Mező | Típus | Megjegyzés |
|---|---|---|
address |
Optional[str] |
🟡 Szabad szöveges cím (legacy) |
city |
Optional[str] |
🟡 city (előtag nélkül) |
address_zip |
Optional[str] |
🟡 address_ előtaggal |
address_street_name |
Optional[str] |
|
address_street_type |
Optional[str] |
|
address_house_number |
Optional[str] |
|
plus_code |
Optional[str] |
🟢 Csak itt van |
contact_phone |
Optional[str] |
Használja: admin_providers.py (ProviderListItem, ProviderDetail, AdminProviderUpdate), admin_organizations.py
4. Admin user list (admin.py)
Fájl: backend/app/api/v1/endpoints/admin.py
| Mező | Típus | Megjegyzés |
|---|---|---|
postal_code |
Optional[str] |
🔴 Teljesen eltérő név |
city |
Optional[str] |
🟡 előtag nélkül |
street |
Optional[str] |
🔴 street (nem street_name) |
house_number |
Optional[str] |
🟢 Ok |
address |
Optional[str] |
🟡 Összefűzött string |
🗺️ Érintett API Végpontok és Formátumuk
| # | Végpont fájl | Cím bemenet | Cím kimenet | Formátum azonosság |
|---|---|---|---|---|
| 1 | organizations.py |
AddressIn (nested) |
AddressOut (nested) |
✅ Egységes (P0) |
| 2 | users.py |
Denormalizált address_* |
AddressResponse (address_*) |
⚠️ Részben |
| 3 | admin.py |
— | Saját dict: postal_code, city, street |
🔴 Eltérő |
| 4 | admin_providers.py |
Saját AdminProviderUpdate |
Saját ProviderDetail |
⚠️ Részben |
| 5 | admin_organizations.py |
Denormalizált address_* |
Denormalizált address_* |
⚠️ Részben |
| 6 | admin_persons.py |
PersonAddressUpdate (address_*) |
AddressResponse (address_*) |
⚠️ Részben |
| 7 | providers.py |
ProviderQuickAddIn / ProviderUpdateIn |
ProviderSearchResult |
⚠️ Saját séma |
| 8 | gamification.py |
city, address (string) |
— | 🔴 Eltérő |
🚨 Kritikus Inkonzisztenciák
1. 🔴 Mezőelnevezési konfliktus: zip vs address_zip vs postal_code
A 3 különböző séma 3 különböző néven hivatkozik ugyanarra az adatra:
zip(AddressIn/AddressOut— P0 refactored)address_zip(AddressResponse,PersonUpdate— user séma)postal_code(admin.pyuser list response)
Következmény: A frontend fejlesztőknek tudniuk kell, hogy melyik endpoint melyik mezőnevet várja/adja. Ez magas hibalehetőséget hordoz.
2. 🔴 address_hrsz vs parcel_id — névütközés
AddressResponse/PersonAddressUpdate:address_hrszAddressIn/AddressOut:parcel_id- Modell (
Address):parcel_id
Következmény: Ugyanaz az adat (helyrajzi szám) két különböző néven szerepel.
3. 🔴 Kétféle címkezelési stratégia (FK vs denormalizált)
Stratégia A — Unified (P0 Refactored):
system.addressestábla +address_idFKAddressIn/AddressOutséma- Használja:
organizations.py
Stratégia B — Denormalizált:
- Címmezők közvetlenül a szülő táblában (
address_city,address_zip, stb.) - Külön
Addressentitás nélkül - Használja:
admin_organizations.py,admin_providers.py,providers.py,users.py
4. 🟡 Duplikált séma definíciók
Az admin_providers.py fájlban a ProviderListItem, ProviderDetail, AdminProviderCreate és AdminProviderUpdate osztályok saját Pydantic sémákként vannak definiálva a fájlon belül. Ezek mezői részben átfednek az AddressIn/AddressOut sémákkal, de nem azokat használják.
5. 🟡 ProviderSearchResult duplikált címmezőkkel
A ProviderSearchResult (backend/app/schemas/provider.py) tartalmaz egy address (string) mezőt és atomizált mezőket is (address_zip, address_street_name, stb.). Ez redundáns.
📋 Javasolt Refaktor Terv
Fázis 1: Egységes címmodul megerősítése
Az AddressIn/AddressOut séma megtartása és kiterjesztése:
class AddressIn(BaseModel):
"""Unified address input schema."""
zip: Optional[str] = None
city: Optional[str] = None
street_name: Optional[str] = None
street_type: Optional[str] = None
house_number: Optional[str] = None
stairwell: Optional[str] = None
floor: Optional[str] = None
door: Optional[str] = None
parcel_id: Optional[str] = None
full_address_text: Optional[str] = None
latitude: Optional[float] = None
longitude: Optional[float] = None
Fázis 2: Érintett endpointok átállítása
| Prioritás | Végpont | Jelenlegi | Átállás |
|---|---|---|---|
| 🔴 P1 | admin.py user list |
postal_code/city/street dict |
AddressOut-ra váltás |
| 🔴 P1 | admin_persons.py |
PersonAddressUpdate |
AddressIn használata |
| 🟡 P2 | users.py |
Denormalizált address_* |
AddressIn + FK |
| 🟡 P2 | admin_providers.py |
Saját ProviderDetail etc. |
AddressOut beágyazás |
| 🟡 P2 | admin_organizations.py |
Denormalizált address_* |
AddressIn/AddressOut |
| 🟢 P3 | providers.py |
ProviderSearchResult |
AddressOut beágyazás |
| 🟢 P3 | gamification.py |
city/address string |
AddressIn használata |
Fázis 3: AddressResponse eltávolítása
AddressResponse(backend/app/schemas/user.py) → eltávolítani- Helyette
AddressOut-t használni mindenhol - Frontend kompatibilitás: mapping réteg a frontenden, ha az
address_*előtagot várja
⚙️ Technikai Megvalósítási Javaslat
Backend oldalon:
AddressInbővítésecountrymezővel- Az összes admin endpoint átállítása
AddressIn/AddressOuthasználatára Organizationmodell denormalizáltaddress_*mezőinek deprecated flaggelésecreate_or_update_addressservice kiterjesztése az összes használati esetre
Frontend oldalon:
- Egységes
addresskomponens bevezetése, amiAddressOutformátumot vár - Mapping réteg a régi
address_*formátumról az újAddressOutformátumra
📈 Következtetés
A rendszer JELENLEG NEM alkalmas egy központi címmodul kezelésére.
A P0 refactored AddressIn/AddressOut séma irányába történő elmozdulás elkezdődött (organizations.py), de a többi endpoint és séma még a régi, denormalizált megközelítést használja. A kettősség komoly karbantartási terhet és hibalehetőséget jelent.
Javasolt lépések:
- 🔴 Azonnal:
admin.pyuser list válasz átállításaAddressOutformátumra - 🔴 Rövidtávon:
AddressResponse(user.py) ésPersonAddressUpdate(admin_persons.py) lecseréléseAddressOut/AddressIn-re - 🟡 Középtávon: Az összes admin provider/organization endpoint átállítása
- 🟢 Hosszútávon: Provider sémák (
ProviderSearchResult,ProviderQuickAddIn) átállítása