admin_szolgáltatók_
This commit is contained in:
129
docs/admin_providers_root_cause_analysis.md
Normal file
129
docs/admin_providers_root_cause_analysis.md
Normal 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
|
||||
Reference in New Issue
Block a user