Files
service-finder/docs/admin_providers_root_cause_analysis.md
2026-07-01 02:27:38 +00:00

6.5 KiB

🔍 Admin Service Provider Root Cause Analysis

Összefoglaló

Felfedezett hiba: Az admin felület szolgáltató (provider) listája és "Jóváhagyásra váró" oldala csak a marketplace.service_providers táblában tárolt 6 rekordot jeleníti meg. A robotok által begyűjtött 8569 rekord a marketplace.service_staging táblában teljesen láthatatlan az admin számára.

Dátum: 2026-06-30 Vizsgáló: Rendszer-Architect


🗺️ Adatbázis Táblák Állapota

Tábla Séma Rekordszám Státuszértékek Forrás
service_providers marketplace 6 approved, rejected API (user/manuális)
service_staging marketplace 8569 research_in_progress (5096), no_web_presence (3472), auditing (1) Robotok (bot)
organizations fleet 1 (service_provider = true) active Regisztráció

🔬 Root Cause Analysis

1. Admin API csak a service_providers táblát kérdezi

A backend/app/api/v1/endpoints/admin_providers.py list_providers() metódusa kizárólag a ServiceProvider modellre hivatkozik:

@router.get("", response_model=List[ProviderListItem])
async def list_providers(...):
    query = select(ServiceProvider)  # ← CSAK marketplace.service_providers
    ...

Ugyanez a helyzet a get_provider_stats() endpointtal (261. sor).

Következmény: A botok által felfedezett 8569 rekord admin felületről nem látható, nem moderálható, nem kereshető.

2. A Public API már helyesen kezeli a 3 forrást

A backend/app/services/provider_service.py search_providers() (public API) UNION ALL lekérdezéssel egyesíti mindhárom forrást:

org_query = select(Organization.id, Organization.name, ...)
staging_query = select(ServiceStaging.id, ServiceStaging.name, ...)
provider_query = select(ServiceProvider.id, ServiceProvider.name, ...)
union_query = union_all(org_query, staging_query, provider_query)

Ezt a mintát kell alkalmazni az admin API-ban is.

3. A "Jóváhagyásra váró" lista azért üres, mert...

  • A service_providers táblában nincs pending státuszú rekord (csak approved/rejected)
  • A service_staging tábla 8569 rekordja ki van zárva az admin lekérdezésből
  • A frontend pending.vue ugyanezt az admin API-t hívja status=pending paraméterrel

4. Validációs rendszer már létezik, csak csatornázni kell

A meglévő adatbázis tartalmazza az összes szükséges validációs infrastruktúrát:

  • marketplace.provider_validations - upvote/downvote rendszer súlyozással, dedikált validációs tábla
  • marketplace.service_providers.validation_score - közvetlen validációs pontszám
  • marketplace.service_providers.status - moderációs státusz (ModerationStatus enum)
  • marketplace.service_profiles.trust_score - bizalmi pontszám
  • marketplace.service_profiles.is_verified - ellenőrzöttségi jelző
  • marketplace.service_profiles.verification_log - JSON validációs napló

Nem kell új mezőket létrehozni - a ServiceStaging adatokat megfelelően be kell csatornázni a meglévő validációs rendszerbe.


🩹 Javasolt Javítási Terv

Rövid távú (P0) - Admin API UNION ALL kiterjesztése

  1. list_providers() módosítása admin_providers.py-ban:

    • UNION ALL lekérdezés a ServiceStaging táblából is (a search_providers() mintájára)
    • A ServiceStaging rekordok leképezése a ProviderListItem response modelre
    • A ServiceStaging rekordoknál: status -> research_in_progress mint pending, source -> bot
  2. get_provider_stats() módosítása admin_providers.py-ban:

    • A pending count kiegészítése a research_in_progress ServiceStaging rekordokkal
  3. Jóváhagyási flow (approve/reject):

    • ServiceStaging rekord jóváhagyásakor: ServiceProvider rekord létrehozása az adatokkal
    • A meglévő provider_validations és service_profiles validációs rendszer használata

Implementációs Részletek

A ProviderListItem modelt ki kell egészíteni egy source_table mezővel, hogy a frontend tudja, melyik táblából jött a rekord:

class ProviderListItem(BaseModel):
    id: int
    name: str
    address: Optional[str]
    city: Optional[str]
    status: str  # "pending" | "approved" | "rejected"
    source: str  # "api" | "manual" | "bot"
    source_table: str  # "service_providers" | "service_staging" | "organizations"
    validation_score: Optional[int]
    created_at: datetime

🔗 Érintett Fájlok

Fájl Szerep
backend/app/api/v1/endpoints/admin_providers.py Root cause - Javítandó fájl
backend/app/services/provider_service.py Minta - UNION ALL implementáció
backend/app/models/identity/social.py ServiceProvider modell
backend/app/models/marketplace/service.py ServiceStaging modell
frontend_admin/pages/providers/index.vue Admin provider lista oldal
frontend_admin/pages/providers/pending.vue Admin pending queue oldal
plans/logic_spec_service_provider_discovery_admin.md Meglévő tervdokumentáció

Következő Lépések

  1. Gitea kártya létrehozása: Admin API UNION ALL kiterjesztése ServiceStaging táblával
  2. ProviderListItem response model kiegészítése source_table mezővel
  3. list_providers() módosítása: UNION ALL 3 forrás
  4. get_provider_stats() módosítása: staging rekordok beszámítása
  5. Jóváhagyási flow: ServiceStaging -> ServiceProvider átvezetés
  6. Tesztelés: frontend pending lista megjelenése