130 lines
6.5 KiB
Markdown
130 lines
6.5 KiB
Markdown
# 🔍 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
|