Files
service-finder/docs/p0_address_manager_usage_audit_2026-07-01.md
2026-07-01 19:49:58 +00:00

3.3 KiB

P0 Architecture Audit: AddressManager Usage Verification

Date: 2026-07-01
Auditor: Rendszer-Architect
Scope: Backend models, services, endpoints
Goal: Verify that no direct SQL/ORM inserts/updates are bypassing the AddressManager


1. Model Analysis

Organization (backend/app/models/marketplace/organization.py)

  • Status: CLEAN — Zero denormalized address fields
  • Uses only FK columns: address_id, billing_address_id, notification_address_idsystem.addresses.id
  • Has proper SQLAlchemy relationship definitions for all three address types

Branch (backend/app/models/marketplace/organization.py:324-366)

  • Status: CLEAN — Zero denormalized address fields
  • Uses only address_id FK → system.addresses.id

ServiceStaging (in backend/app/models/marketplace/service.py:170-195)

  • Status: CLEAN — Uses address_id FK → system.addresses.id

Address (backend/app/models/identity/address.py:39-74)

  • Status: CLEAN — Uses proper FK-based architecture
  • zip and city are properties resolved via the postal_code relationship

⚠️ ServiceProvider (backend/app/models/identity/social.py:23-71)

  • Status: INTENTIONAL DENORMALIZATION — Contains flat address fields
  • Marked "P0 HYBRID VENDOR REFACTOR" design choice

2. Critical Bugs Found

🔴 P0 CRITICAL: admin.py:943Organization.address_city REMOVED from ORM

File: backend/app/api/v1/endpoints/admin.py:943

The search_organizations_by_name endpoint selects Organization.address_city which is not defined in the Organization SQLAlchemy model. SQLAlchemy will raise an error at runtime.

Impact: Admin organization search (/admin/organizations/search?name=...) is broken.

🟡 P1: admin_persons.py:670-699 — Direct Address writes bypassing AddressManager

Directly writes address.street_name = ... without calling AddressManager.create_or_update(). No postal_code_id resolution.

🟡 P1: admin_organizations.py — Flat address fields silently ignored

OrganizationUpdate schema has address_zip, address_city etc. but hasattr(org, "address_zip") returns False → silently ignored.


3. Database Ghost Columns

The following old denormalized columns still exist in fleet.organizations table but have NO ORM mapping: address_city, address_zip, address_street_name, address_street_type, address_house_number, address_hrsz, billing_city/zip/street_name/street_type, notification_city/zip/street_name/street_type


4. Summary

Severity Issue File:Line
🔴 P0 Organization.address_city removed from ORM, still referenced admin.py:943
🟡 P1 Direct Address writes bypassing AddressManager admin_persons.py:670-699
🟡 P1 Flat address fields silently ignored on update admin_organizations.py:1242-1343
🟡 P2 Ghost columns in DB from old schema fleet.organizations
PASS Organization model uses FKs only organization.py
PASS Branch model uses FK only organization.py:333
PASS admin_organizations.py correctly uses AddressManager admin_organizations.py:1313-1335
PASS Address model properly normalized address.py