Backend: globale Einzelstueck-Liste (GET /items) + Bild-Version an Produkten
Neuer Endpoint GET /items liefert alle Einzelstuecke ueber alle Produkte, angereichert mit Produkt-, Kategorie-, Lagerort- und Shop-Angaben (Beziehungen vorgeladen). ItemOut bekommt category_id/category_name. ProductOut bekommt image_version (Epoch der letzten Bildaenderung, None ohne Bild) - identisch zum ETag der Bild-Route, damit Clients Bilder cachen und nur bei Aenderung neu laden. Grundlage fuer die neue Einzelstueck-Liste (Web+iOS) und den iOS-Bild-Cache. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@ from datetime import date
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from .models import Barcode, Category, CategoryTracking, Lot, Product
|
||||
from .models import Barcode, Category, CategoryTracking, Lot, Product, ProductImage
|
||||
from .schemas import BarcodeOut, LocationMinStockOut, ProductOut
|
||||
from .services.conversion import KIND_OF_BASE, display_unit_info
|
||||
from .services.stock import current_stock
|
||||
@@ -44,6 +44,14 @@ def product_to_out(db: Session, product: Product) -> ProductOut:
|
||||
for b in db.query(Barcode).filter(Barcode.product_id == product.id).order_by(Barcode.id).all()
|
||||
]
|
||||
out.category_name = product.category.name if product.category else None
|
||||
# Bild-Version = Epoch der letzten Bildänderung (identisch zum ETag der
|
||||
# Bild-Route), damit der Client nur geänderte Bilder neu lädt. None = kein Bild.
|
||||
bild_ts = (
|
||||
db.query(ProductImage.updated_at)
|
||||
.filter(ProductImage.product_id == product.id)
|
||||
.scalar()
|
||||
)
|
||||
out.image_version = int(bild_ts.timestamp()) if bild_ts is not None else None
|
||||
out.tracking = CategoryTracking(product_tracking(db, product))
|
||||
out.shop_name = product.shop.name if product.shop else None
|
||||
out.kind = KIND_OF_BASE[product.base_unit].value
|
||||
|
||||
Reference in New Issue
Block a user