# 🔍 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`](../backend/app/api/v1/endpoints/admin_providers.dart:231) [`list_providers()`](../backend/app/api/v1/endpoints/admin_providers.dart:231) metódusa kizárólag a `ServiceProvider` modellre hivatkozik: ```python @router.get("", response_model=List[ProviderListItem]) async def list_providers(...): query = select(ServiceProvider) # ← CSAK marketplace.service_providers ... ``` Ugyanez a helyzet a [`get_provider_stats()`](../backend/app/api/v1/endpoints/admin_providers.dart:261) 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`](../backend/app/services/provider_service.dart:216) [`search_providers()`](../backend/app/services/provider_service.dart:216) (public API) UNION ALL lekérdezéssel egyesíti mindhárom forrást: ```python 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`](../frontend_admin/pages/providers/pending.dart:1) 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`](../backend/app/api/v1/endpoints/admin_providers.dart:231)-ban: - UNION ALL lekérdezés a `ServiceStaging` táblából is (a [`search_providers()`](../backend/app/services/provider_service.dart:216) 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`](../backend/app/api/v1/endpoints/admin_providers.dart:261)-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: ```python 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`](../backend/app/api/v1/endpoints/admin_providers.dart:1) | **Root cause** - Javítandó fájl | | [`backend/app/services/provider_service.py`](../backend/app/services/provider_service.dart:216) | **Minta** - UNION ALL implementáció | | [`backend/app/models/identity/social.py`](../backend/app/models/identity/social.dart:23) | `ServiceProvider` modell | | [`backend/app/models/marketplace/service.py`](../backend/app/models/marketplace/service.dart:162) | `ServiceStaging` modell | | [`frontend_admin/pages/providers/index.vue`](../frontend_admin/pages/providers/index.dart:1) | Admin provider lista oldal | | [`frontend_admin/pages/providers/pending.vue`](../frontend_admin/pages/providers/pending.dart:1) | Admin pending queue oldal | | [`plans/logic_spec_service_provider_discovery_admin.md`](../plans/logic_spec_service_provider_discovery_admin.dart:1) | 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