166 lines
5.7 KiB
Python
Executable File
166 lines
5.7 KiB
Python
Executable File
"""
|
||
Provider végpontok – Szolgáltató keresés és gyors felvétel (crowdsourced).
|
||
"""
|
||
|
||
import logging
|
||
from typing import Optional, List
|
||
|
||
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
||
from sqlalchemy import select
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
from app.db.session import get_db
|
||
from app.api.deps import get_current_user
|
||
from app.models.identity import User
|
||
from app.models.marketplace.service import ExpertiseTag
|
||
from app.schemas.provider import (
|
||
ProviderSearchResponse,
|
||
ProviderQuickAddIn,
|
||
ProviderQuickAddResponse,
|
||
ProviderUpdateIn,
|
||
ProviderUpdateResponse,
|
||
ExpertiseCategoryOut,
|
||
)
|
||
from app.services.provider_service import search_providers, quick_add_provider, update_provider
|
||
|
||
router = APIRouter()
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
@router.get("/categories", response_model=List[ExpertiseCategoryOut])
|
||
async def list_expertise_categories(
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user: User = Depends(get_current_user),
|
||
):
|
||
"""
|
||
Visszaadja az összes expertise kategóriát a frontend dropdown számára.
|
||
"""
|
||
try:
|
||
stmt = select(ExpertiseTag).order_by(ExpertiseTag.id)
|
||
result = await db.execute(stmt)
|
||
tags = result.scalars().all()
|
||
return [
|
||
ExpertiseCategoryOut(
|
||
id=t.id,
|
||
key=t.key,
|
||
name_hu=t.name_hu,
|
||
name_en=t.name_en,
|
||
category=t.category,
|
||
)
|
||
for t in tags
|
||
]
|
||
except Exception as e:
|
||
logger.error(f"Hiba a kategóriák lekérése során: {e}", exc_info=True)
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Hiba történt a kategóriák lekérése során.",
|
||
)
|
||
|
||
|
||
@router.get("/search", response_model=ProviderSearchResponse)
|
||
async def search_service_providers(
|
||
q: Optional[str] = Query(None, min_length=2, max_length=200, description="Keresőszó"),
|
||
category: Optional[str] = Query(None, max_length=50, description="Kategória szűrő (expertise_tags.key)"),
|
||
city: Optional[str] = Query(None, max_length=100, description="Város szűrő"),
|
||
limit: int = Query(20, ge=1, le=100, description="Találatok száma oldalanként"),
|
||
offset: int = Query(0, ge=0, description="Lapozási offset"),
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user: User = Depends(get_current_user),
|
||
):
|
||
"""
|
||
Szolgáltatók keresése egyesített forrásokból.
|
||
|
||
Három forrásból keres:
|
||
- **verified_org**: Verifikált szervezetek (fleet.organizations, org_type='service_provider')
|
||
- **staged_data**: Robotok által gyűjtött adatok (marketplace.service_staging)
|
||
- **crowd_added**: Közösség által hozzáadott adatok (marketplace.service_providers)
|
||
|
||
A találatok forrás szerint csoportosítva, lapozva érkeznek.
|
||
"""
|
||
try:
|
||
result = await search_providers(
|
||
db=db,
|
||
q=q,
|
||
category=category,
|
||
city=city,
|
||
limit=limit,
|
||
offset=offset,
|
||
)
|
||
return result
|
||
except Exception as e:
|
||
logger.error(f"Hiba a szolgáltató keresés során: {e}", exc_info=True)
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Hiba történt a keresés során.",
|
||
)
|
||
|
||
|
||
@router.post("/quick-add", response_model=ProviderQuickAddResponse, status_code=status.HTTP_201_CREATED)
|
||
async def quick_add_service_provider(
|
||
data: ProviderQuickAddIn,
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user: User = Depends(get_current_user),
|
||
):
|
||
"""
|
||
Gyors szolgáltató felvétel crowdsourcingból.
|
||
|
||
Létrehoz egy új Organization-t (is_verified=False, org_type='service_provider'),
|
||
hozzáköt egy ServiceProfile-t, a megadott kategóriát (expertise_tags),
|
||
létrehoz egy Branch-t a címmel, és a felhasználót beállítja OWNER-nek.
|
||
|
||
A szolgáltató 'pending_verification' státuszba kerül, amíg a robotok
|
||
vagy az adminok nem ellenőrzik.
|
||
"""
|
||
try:
|
||
result = await quick_add_provider(
|
||
db=db,
|
||
data=data,
|
||
user_id=current_user.id,
|
||
)
|
||
return result
|
||
except ValueError as e:
|
||
raise HTTPException(
|
||
status_code=status.HTTP_400_BAD_REQUEST,
|
||
detail=str(e),
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Hiba a gyors szolgáltató felvétel során: {e}", exc_info=True)
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Hiba történt a szolgáltató rögzítése során.",
|
||
)
|
||
|
||
|
||
@router.put("/{provider_id}", response_model=ProviderUpdateResponse)
|
||
async def update_service_provider(
|
||
provider_id: int,
|
||
data: ProviderUpdateIn,
|
||
db: AsyncSession = Depends(get_db),
|
||
current_user: User = Depends(get_current_user),
|
||
):
|
||
"""
|
||
Meglévő szolgáltató (Organization) adatainak szerkesztése.
|
||
|
||
Frissíti a szervezet alapadatait (név, cím) és a kapcsolódó
|
||
ServiceProfile kapcsolati mezőit (telefon, email, weboldal, címkék).
|
||
"""
|
||
try:
|
||
result = await update_provider(
|
||
db=db,
|
||
provider_id=provider_id,
|
||
data=data,
|
||
user_id=current_user.id,
|
||
)
|
||
return result
|
||
except ValueError as e:
|
||
raise HTTPException(
|
||
status_code=status.HTTP_404_NOT_FOUND,
|
||
detail=str(e),
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"Hiba a szolgáltató frissítése során (id={provider_id}): {e}", exc_info=True)
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="Hiba történt a szolgáltató frissítése során.",
|
||
)
|