Chore: Pushing changes to migrate from windows/wsl to fedora

This commit is contained in:
2025-07-25 21:27:16 +02:00
parent e60489715a
commit b0f9685a0a
16 changed files with 442 additions and 19 deletions
+99
View File
@@ -0,0 +1,99 @@
"""
The products endpoint
"""
from fastapi import APIRouter, HTTPException
from sqlmodel import select
from app.api.deps import SessionDep, exists
from app.schemas.models import Product
from app.schemas.schemas import ProductCreate, ProductUpdate
from pydantic import ValidationError
from typing import Sequence, List, Optional
router = APIRouter(prefix="/products", tags=["products"])
@router.get("/", response_model=List[Product])
def fetch_products(session: SessionDep) -> Sequence[Product]:
"""Fetch product list
"""
products = session.exec(select(Product)).all()
return products
@router.post("/", response_model=ProductCreate)
def create_product(product_data: ProductCreate, session: SessionDep) -> Product:
"""Create a product
"""
name_exists = exists(session, Product, product_name=product_data.product_name)
if name_exists:
raise HTTPException(
status_code=400,
detail="Product with this product_name exists"
)
existing = exists(session, Product, product_code=product_data.product_code)
if existing:
raise HTTPException(
status_code=400,
detail="Product with this product_code exists"
)
try:
product = Product.model_validate(product_data)
except ValidationError as e:
raise HTTPException(status_code=400, detail=e.errors())
session.add(product)
session.commit()
session.refresh(product)
return product
@router.get("/{product_id}", response_model=Product)
def get_product(product_id: int, session: SessionDep) -> Optional[Product]:
"""Returns a product by its id
"""
stmt = select(Product).where(Product.id == product_id)
result: Optional[Product] = session.exec(stmt).first()
if not result:
raise HTTPException(status_code=404, detail="Product not found")
return result
@router.patch("/{product_id}",response_model=ProductUpdate)
def update_product(
product_id: int,
product_data: ProductUpdate,
session: SessionDep
) -> Optional[Product]:
"""Updates a product
"""
product = session.get(Product, product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
updated_fields = product_data.model_dump(exclude_unset=True)
for key, value in updated_fields.items():
setattr(product, key, value)
session.add(product)
session.commit()
session.refresh(product)
return product
@router.delete("/{product_id}", status_code=204)
def delete_product(product_id: int, session: SessionDep):
"""Deletes a product
"""
product = session.get(Product, product_id)
if not product:
raise HTTPException(status_code=404, detail="Product not found")
session.delete(product)
session.commit()