admin_szolgáltatók_

This commit is contained in:
Roo
2026-07-01 02:27:38 +00:00
parent 189cbfd7ca
commit 6e627d0ebe
491 changed files with 20965 additions and 9703 deletions

View File

@@ -0,0 +1,129 @@
# 🔍 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