10 KiB
🏗️ Logic Spec: Provider Taxonomy Audit & Smart Search API
1. Modul Célja és Masterbook 2.0 Illeszkedés
Mérföldkő: Crowdsourced Partnerkereső (Marketplace Engine) Cél: A szolgáltatói kategóriarendszer (taxonómia) feltöltése és egy okos, egyesített kereső API (search + quick-add) megvalósítása a crowdsourced partnerkereséshez.
Masterbook 2.0 Kapcsolódás
- Epic: Marketplace & Service Discovery (08_Marketplace)
- Robot Kapcsolat: A meglévő
service_stagingadatok (robotok által gyűjtött) publikusan kereshetővé tétele - Üzleti Logika: Bárki (még nem verifikált) gyorsan felvehet egy szolgáltatót, ami automatikusan a
service_stagingtáblába kerül, ahol a robotok később feldolgozhatják
2. Adatbázis Audit Eredmények
Meglévő Táblák Állapota
| Tábla | Séma | Állapot | Rekordok |
|---|---|---|---|
expertise_tags |
marketplace |
ÜRES - nincs egyetlen kategória sem | 0 |
service_specialties |
marketplace |
ÜRES - egyszerű (id, parent_id, name, slug) | 0 |
service_providers |
marketplace |
ÜRES - crowdsourced provider tábla | 0 |
organizations (org_type='service_provider') |
fleet |
NINCS ilyen rekord | 0 |
service_staging |
marketplace |
Van benne ~2000+ rekord (robot gyűjtés) | ~2000 |
Használandó Meglévő Struktúrák
marketplace.expertise_tags- A kategória mestertábla (twin: name_hu/name_en, search_keywords JSONB). Ez a legalkalmasabb.fleet.organizations.aliases- JSONB mező a szolgáltató alternatív neveihez (már létezik!)fleet.organizations.tags- JSONB mező a crowdsourced címkékhez (már létezik!)marketplace.service_staging- Robotok által gyűjtött adatok (már létezik adatokkal)marketplace.service_providers- Crowdsourced provider tábla (üres, de használható)
3. Technikai Terv
3.1 Seed Script: backend/app/scripts/seed_expertise_tags.py
Fájl: backend/app/scripts/seed_expertise_tags.py
Feltölti az expertise_tags táblát az alábbi alapkategóriákkal:
| key | name_hu | name_en | category | search_keywords |
|---|---|---|---|---|
| auto_szerelo | Autószerelő | Car Mechanic | vehicle_service | ["szerelő", "autószerelő", "mechanic", "garage"] |
| motor_szerelo | Motorkerékpár szerelő | Motorcycle Mechanic | vehicle_service | ["motor", "motorszerelő", "motorcycle"] |
| gumiszerviz | Gumiszerviz | Tire Service | vehicle_service | ["gumi", "gumis", "tire", "tyre", "abroncs"] |
| karosszerialakatos | Karosszérialakatos | Body Shop | body_paint | ["karosszéria", "lakatos", "bodyshop"] |
| fényező | Fényező | Painter | body_paint | ["fényező", "fényezés", "painter", "spray"] |
| autómentő | Autómentő / Motormentő | Tow Truck / Roadside | roadside | ["mentő", "autómentő", "tow", "roadside"] |
| benzinkút | Benzinkút | Gas Station | fuel | ["benzin", "kút", "gas station", "fuel"] |
| alkatrész_kereskedés | Alkatrész kereskedés | Parts Store | parts | ["alkatrész", "parts", "spares"] |
| vizsgaállomás | Vizsgaállomás | Inspection Station | inspection | ["vizsga", "műszaki", "inspection", "MOT"] |
| autókozmetika | Autókozmetika | Car Detailing | detailing | ["kozmetika", "detailing", "takarítás"] |
| egyéb | Egyéb szolgáltató | Other Service | other | ["egyéb", "other", "szolgáltató"] |
Futtatás: docker exec sf_api python3 /app/backend/app/scripts/seed_expertise_tags.py
3.2 API Végpont: GET /api/v1/providers/search
Fájl: backend/app/api/v1/endpoints/providers.py
Végpont Specifikáció
GET /api/v1/providers/search?q={keresőszó}&category={kategória}&city={város}&limit={limit}&offset={offset}
Keresés Logikája (három tábla egyesítése)
flowchart TD
A[GET /providers/search?q=kereső] --> B{Ellenőrizd a q paramétert}
B -->|Van| C[Három tábla egyesített keresése]
B -->|Nincs| D[Kategória/Város szűrés, ha van]
C --> E1[1. fleet.organizations]
C --> E2[2. marketplace.service_staging]
C --> E3[3. marketplace.service_providers]
E1 --> F1{org_type = service_provider}
F1 --> G1[ILIKE a name-re]
F1 --> G2[ILIKE az aliases JSONB-ben]
E2 --> G3[ILIKE a name-re]
E2 --> G4[ILIKE a city-re]
E3 --> G5[ILIKE a name-re]
D --> H[Közös UNION / egységesítés]
H --> I[Forrás jelölés: verified_org / staged_data / crowd_added]
I --> J[Rendezes + lapozás]
J --> K[Response]
Response Schema (ProviderSearchResult)
{
"results": [
{
"id": 1,
"name": "MOL Autószerviz",
"category": null,
"specialization": ["autószerelő", "gumiszerviz"],
"city": "Budapest",
"address": "Budapest, Kossuth u. 1",
"source": "verified_org",
"is_verified": true,
"rating": 4.5
}
],
"total": 42,
"page": 1,
"per_page": 20
}
3.3 API Végpont: POST /api/v1/providers/quick-add
Fájl: backend/app/api/v1/endpoints/providers.py
Végpont Specifikáció
POST /api/v1/providers/quick-add
Content-Type: application/json
{
"name": "Teszt Autószerviz",
"category_id": 1,
"city": "Budapest",
"street": "Kossuth utca 1",
"tags": ["olcsó", "gyors"]
}
Folyamat
flowchart TD
A[POST /providers/quick-add] --> B[Authentikáció: current_user]
B --> C[Validáció: name kötelező]
C --> D{Kategória ID ellenőrzése}
D -->|Létezik| E[Létrehozás: Organization]
D -->|Nem létezik| F[400: Invalid category]
E --> G[Organization létrehozása]
G --> H[org_type = service_provider]
H --> I[is_verified = False]
I --> J[tags = megadott tömbből]
J --> K[ServiceProfile létrehozása]
K --> L[expertise_tags kapcsolat]
L --> M[Branch létrehozása a címmel]
M --> N[commit]
N --> O[Response: quick-add success]
Request Schema (ProviderQuickAddIn)
| Mező | Típus | Kötelező | Leírás |
|---|---|---|---|
| name | string | Igen | Szolgáltató neve (2-200 karakter) |
| category_id | int | Igen | Kategória ID (expertise_tags.id) |
| city | string | Nem | Város |
| street | string | Nem | Utca/házszám |
| tags | string[] | Nem | Címkék (pl. ["olcsó", "gyors"]) |
Response Schema (ProviderQuickAddResponse)
| Mező | Típus | Leírás |
|---|---|---|
| id | int | Az új szervezet ID-ja |
| name | string | A szolgáltató neve |
| status | string | "pending_verification" |
| message | string | Sikeres üzenet |
3.4 Router Regisztráció
A providers.py-t be kell regisztrálni az api.py-ban:
from app.api.v1.endpoints import providers
api_router.include_router(providers.router, prefix="/providers", tags=["Providers"])
3.5 Szükséges Schémák
Fájl: backend/app/schemas/provider.py (ÚJ)
class ProviderSearchResult(BaseModel):
id: int
name: str
category: Optional[str] = None
specialization: List[str] = []
city: Optional[str] = None
address: Optional[str] = None
source: str # "verified_org" | "staged_data" | "crowd_added"
is_verified: bool = False
rating: Optional[float] = None
model_config = ConfigDict(from_attributes=True)
class ProviderSearchResponse(BaseModel):
results: List[ProviderSearchResult]
total: int
page: int = 1
per_page: int = 20
class ProviderQuickAddIn(BaseModel):
name: str = Field(..., min_length=2, max_length=200)
category_id: int = Field(..., ge=1)
city: Optional[str] = Field(None, max_length=100)
street: Optional[str] = Field(None, max_length=255)
tags: List[str] = Field(default_factory=list)
class ProviderQuickAddResponse(BaseModel):
id: int
name: str
status: str = "pending_verification"
message: str = "Szolgáltató sikeresen rögzítve. Ellenőrzés alatt."
3.6 Service Réteg
Fájl: backend/app/services/provider_service.py (ÚJ)
A service réteg tartalmazza:
search_providers(db, q, category, city, limit, offset)- Egyesített keresésquick_add_provider(db, data, user_id)- Gyors szolgáltató felvétel
4. Adatmodell Változások
4.1 NINCS új modell vagy migráció!
A meglévő modellek és adatbázis táblák TELJESEN lefedik a funkcionalitást:
marketplace.expertise_tags- már létezik, csak adat kellfleet.organizations- már vanaliases,tags,org_typemezőmarketplace.service_staging- már létezik adatokkalmarketplace.service_providers- már létezik (üres)
4.2 Csak Seed Adat Kell
A seed_expertise_tags.py INSERT utasításokkal tölti fel az expertise_tags táblát.
5. Megvalósítási Terv
5.1 Végrehajtandó Lépések
| # | Lépés | Fájl | Leírás |
|---|---|---|---|
| 1 | Seed script | backend/app/scripts/seed_expertise_tags.py |
Feltölti a 11 alapkategóriát |
| 2 | Seed futtatás | Terminál | docker exec sf_api python3 /app/backend/app/scripts/seed_expertise_tags.py |
| 3 | Pydantic schémák | backend/app/schemas/provider.py (ÚJ) |
ProviderSearchResult, ProviderQuickAddIn |
| 4 | Service réteg | backend/app/services/provider_service.py (ÚJ) |
search_providers, quick_add_provider |
| 5 | Endpointok | backend/app/api/v1/endpoints/providers.py |
GET /search, POST /quick-add |
| 6 | Router regisztráció | backend/app/api/v1/api.py |
providers router hozzáadása |
| 7 | Ellenőrző teszt | Terminál | API hívások tesztelése |
5.2 Függőségek
- Bemenet: Meglévő modell réteg (Organization, ServiceStaging, ServiceProvider, ExpertiseTag)
- Kimenet: A
/api/v1/providers/searchés/api/v1/providers/quick-addvégpontok - Blokkoló: Nincs - minden meglévő kód használható
6. Admin Kontroll
A Seed script FUTTATHATÓ többször is (idempotens) - ON CONFLICT DO NOTHING klauzulával.
A kategóriák később az Admin felületen keresztül módosíthatók/bővíthetők.
7. Geo-Logika
A keresés jelenleg NEM tartalmaz PostGIS távolságszűrést (az külön endpoint: /search/match). A /providers/search csak szöveges keresés (ILIKE).