# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/admin_services.py """ Admin Service Catalog CRUD végpontok. Prefix: /admin/services Védve: Depends(get_current_admin) """ from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, func from typing import List from app.api import deps from app.models.identity import User from app.models.core_logic import ServiceCatalog from app.schemas.service_catalog import ( ServiceCatalogCreate, ServiceCatalogUpdate, ServiceCatalogResponse, ) router = APIRouter() @router.get("", response_model=List[ServiceCatalogResponse], tags=["Admin Service Catalog"]) async def list_service_catalog( skip: int = Query(0, ge=0, description="Hány rekordot hagyjunk ki (lapozás)"), limit: int = Query(50, ge=1, le=200, description="Maximum visszaadott rekordok száma"), is_active: bool | None = Query(None, description="Szűrés aktív/inaktív státuszra"), db: AsyncSession = Depends(deps.get_db), admin: User = Depends(deps.get_current_admin), ): """ Szolgáltatás katalógus bejegyzések listázása lapozással. """ query = select(ServiceCatalog) if is_active is not None: query = query.where(ServiceCatalog.is_active == is_active) # Teljes darabszám count_query = select(func.count()).select_from(query.subquery()) total_result = await db.execute(count_query) total = total_result.scalar() or 0 query = query.order_by(ServiceCatalog.id.desc()).offset(skip).limit(limit) result = await db.execute(query) items = result.scalars().all() return items @router.post("", response_model=ServiceCatalogResponse, status_code=status.HTTP_201_CREATED, tags=["Admin Service Catalog"]) async def create_service_catalog( data: ServiceCatalogCreate, db: AsyncSession = Depends(deps.get_db), admin: User = Depends(deps.get_current_admin), ): """ Új szolgáltatás katalógus bejegyzés létrehozása. """ # Ellenőrizzük, hogy a service_code már létezik-e existing = await db.execute( select(ServiceCatalog).where(ServiceCatalog.service_code == data.service_code) ) if existing.scalar_one_or_none(): raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail=f"Service code '{data.service_code}' already exists.", ) entry = ServiceCatalog( service_code=data.service_code, name=data.name, description=data.description, credit_cost=data.credit_cost, is_active=data.is_active, ) db.add(entry) await db.commit() await db.refresh(entry) return entry @router.patch("/{service_id}", response_model=ServiceCatalogResponse, tags=["Admin Service Catalog"]) async def update_service_catalog( service_id: int, data: ServiceCatalogUpdate, db: AsyncSession = Depends(deps.get_db), admin: User = Depends(deps.get_current_admin), ): """ Meglévő szolgáltatás katalógus bejegyzés módosítása. """ result = await db.execute(select(ServiceCatalog).where(ServiceCatalog.id == service_id)) entry = result.scalar_one_or_none() if not entry: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"Service catalog entry with ID {service_id} not found.", ) # Csak a megadott mezőket frissítjük update_data = data.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(entry, field, value) await db.commit() await db.refresh(entry) return entry