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