Files
secure-online-shop/app/services/product_service.py
T

50 lines
1.4 KiB
Python

from __future__ import annotations
import logging
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.core.exceptions import ForbiddenError
from app.models.product import Product
from app.models.user import RoleEnum, User
from app.schemas.product import ProductCreate
audit_logger = logging.getLogger("app.audit")
class ProductService:
def __init__(self, db: Session) -> None:
self.db = db
def list_available_products(self) -> list[Product]:
statement = (
select(Product)
.where(Product.is_active.is_(True), Product.stock > 0)
.order_by(Product.created_at.desc())
)
return list(self.db.scalars(statement).all())
def create_product(self, payload: ProductCreate, actor: User) -> Product:
if actor.role != RoleEnum.shop:
raise ForbiddenError("Shop privileges are required")
product = Product(
name=payload.name,
description=payload.description,
price=payload.price,
stock=payload.stock,
is_active=payload.is_active,
)
self.db.add(product)
try:
self.db.commit()
self.db.refresh(product)
except Exception:
self.db.rollback()
raise
audit_logger.info("product_created product_id=%s shop_user_id=%s", product.id, actor.id)
return product