Automated Action 609e7fb237 Implement retail management and payment API with FastAPI
This API provides endpoints for:
- Product and inventory management
- Customer management
- Order processing
- Payment processing with Stripe integration
- User authentication

generated with BackendIM... (backend.im)
2025-05-12 12:00:19 +00:00

125 lines
4.0 KiB
Python

from typing import Any, List
from fastapi import APIRouter, Body, Depends, HTTPException, Path, Query
from sqlalchemy.orm import Session
from app import crud, models, schemas
from app.api import deps
router = APIRouter()
@router.get("/", response_model=List[schemas.Product])
def list_products(
db: Session = Depends(deps.get_db),
skip: int = Query(0, description="Skip first N items"),
limit: int = Query(100, description="Limit the number of items returned"),
active_only: bool = Query(False, description="Only return active products"),
) -> Any:
"""
Retrieve products with optional filtering
"""
if active_only:
products = crud.product.get_active(db, skip=skip, limit=limit)
else:
products = crud.product.get_multi(db, skip=skip, limit=limit)
return products
@router.post("/", response_model=schemas.Product)
def create_product(
*,
db: Session = Depends(deps.get_db),
product_in: schemas.ProductCreate,
inventory_quantity: int = Body(0, description="Initial inventory quantity"),
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Create new product with optional initial inventory
"""
product = crud.product.get_by_sku(db, sku=product_in.sku)
if product:
raise HTTPException(
status_code=400,
detail="A product with this SKU already exists",
)
product = crud.product.create_with_inventory(
db, obj_in=product_in, inventory_quantity=inventory_quantity
)
return product
@router.get("/{product_id}", response_model=schemas.ProductWithInventory)
def get_product(
*,
db: Session = Depends(deps.get_db),
product_id: int = Path(..., description="The ID of the product to get"),
) -> Any:
"""
Get a specific product by id with inventory information
"""
product = crud.product.get(db, id=product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
# Get inventory information
inventory = crud.inventory.get_by_product_id(db, product_id=product_id)
inventory_quantity = inventory.quantity if inventory else 0
# Create combined response
product_data = schemas.Product.from_orm(product)
product_with_inventory = schemas.ProductWithInventory(
**product_data.dict(),
inventory_quantity=inventory_quantity
)
return product_with_inventory
@router.put("/{product_id}", response_model=schemas.Product)
def update_product(
*,
db: Session = Depends(deps.get_db),
product_id: int = Path(..., description="The ID of the product to update"),
product_in: schemas.ProductUpdate,
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Update a product
"""
product = crud.product.get(db, id=product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
# If SKU is being updated, check for uniqueness
if product_in.sku and product_in.sku != product.sku:
existing = crud.product.get_by_sku(db, sku=product_in.sku)
if existing:
raise HTTPException(
status_code=400,
detail="A product with this SKU already exists",
)
product = crud.product.update(db, db_obj=product, obj_in=product_in)
return product
@router.delete("/{product_id}", response_model=schemas.Product)
def delete_product(
*,
db: Session = Depends(deps.get_db),
product_id: int = Path(..., description="The ID of the product to delete"),
current_user: models.User = Depends(deps.get_current_active_superuser),
) -> Any:
"""
Delete a product
"""
product = crud.product.get(db, id=product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
# Check for any pending orders with this product
# TODO: Implement order item check
product = crud.product.remove(db, id=product_id)
return product