BuyingAgent/backend/app/api/products.py
Lars b276758ee1
All checks were successful
Deploy Development / deploy (push) Successful in 1m19s
Test Suite / pytest-backend (push) Successful in 31s
Test Suite / smoke-dev (push) Successful in 0s
Test Suite / frontend-checks (push) Successful in 28s
Stelle den Frontend-MVP und die v0.3-API auf develop bereit, damit Dev API und PWA zusammen deployen.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-04 13:04:59 +02:00

64 lines
2.6 KiB
Python

from uuid import UUID
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.api.schemas import AttributeIn, AttributeOut, ProductIn, ProductOut, VariantIn, VariantOut
from app.errors import AppError
from app.persistence.db import get_session
from app.persistence.repositories import CatalogRepository
from app.services.ingestion_service import IngestionService
router = APIRouter(prefix="/api/v1")
@router.post("/products", status_code=201)
def create_product(payload: ProductIn, session: Session = Depends(get_session)) -> ProductOut:
product = IngestionService(session).create_product(payload.model_dump())
return ProductOut.model_validate(product.__dict__)
@router.get("/products/{product_id}")
def get_product(product_id: UUID, session: Session = Depends(get_session)) -> ProductOut:
product = CatalogRepository(session).get_product(product_id)
if product is None:
raise AppError(404, "NOT_FOUND", "product not found", {"id": str(product_id)})
return ProductOut.model_validate(product.__dict__)
@router.post("/products/{product_id}/variants", status_code=201)
def create_variant(product_id: UUID, payload: VariantIn, session: Session = Depends(get_session)):
variant = IngestionService(session).create_variant(product_id, payload.model_dump())
return {
"id": variant.id,
"product_id": variant.product_id,
"name": variant.name,
"manufacturer_sku": variant.manufacturer_sku,
"identifiers": variant.identifiers,
"created_at": variant.created_at,
}
@router.get("/variants/{variant_id}")
def get_variant(variant_id: UUID, session: Session = Depends(get_session)) -> VariantOut:
repo = CatalogRepository(session)
variant = repo.get_variant(variant_id)
if variant is None:
raise AppError(404, "NOT_FOUND", "variant not found", {"id": str(variant_id)})
attributes = [AttributeOut.model_validate(item.__dict__) for item in repo.list_attributes(variant_id)]
return VariantOut(
id=variant.id,
product_id=variant.product_id,
name=variant.name,
manufacturer_sku=variant.manufacturer_sku,
identifiers=variant.identifiers,
created_at=variant.created_at,
attributes=attributes,
)
@router.post("/variants/{variant_id}/attributes", status_code=201)
def add_attribute(variant_id: UUID, payload: AttributeIn, session: Session = Depends(get_session)) -> AttributeOut:
statement = IngestionService(session).add_attribute(variant_id, payload.model_dump())
return AttributeOut.model_validate(statement.__dict__)