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_providerstáblában nincspendingstátuszú rekord (csak approved/rejected) - A
service_stagingtábla 8569 rekordja ki van zárva az admin lekérdezésből - A frontend
pending.vueugyanezt az admin API-t hívjastatus=pendingparamé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áblamarketplace.service_providers.validation_score- közvetlen validációs pontszámmarketplace.service_providers.status- moderációs státusz (ModerationStatus enum)marketplace.service_profiles.trust_score- bizalmi pontszámmarketplace.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
-
list_providers()módosításaadmin_providers.py-ban:- UNION ALL lekérdezés a
ServiceStagingtáblából is (asearch_providers()mintájára) - A
ServiceStagingrekordok leképezése aProviderListItemresponse modelre - A
ServiceStagingrekordoknál:status->research_in_progressmintpending,source->bot
- UNION ALL lekérdezés a
-
get_provider_stats()módosításaadmin_providers.py-ban:- A
pendingcount kiegészítése aresearch_in_progressServiceStaging rekordokkal
- A
-
Jóváhagyási flow (approve/reject):
ServiceStagingrekord jóváhagyásakor:ServiceProviderrekord létrehozása az adatokkal- A meglévő
provider_validationsésservice_profilesvalidá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
- Gitea kártya létrehozása: Admin API UNION ALL kiterjesztése ServiceStaging táblával
ProviderListItemresponse model kiegészítésesource_tablemezővellist_providers()módosítása: UNION ALL 3 forrásget_provider_stats()módosítása: staging rekordok beszámítása- Jóváhagyási flow: ServiceStaging -> ServiceProvider átvezetés
- Tesztelés: frontend pending lista megjelenése