hesabixArc/hesabixAPI/app/services/product_attribute_service.py

110 lines
3.9 KiB
Python
Raw Normal View History

2025-09-30 17:12:53 +03:30
from __future__ import annotations
from typing import Dict, Any, Optional
from sqlalchemy.orm import Session
from sqlalchemy import and_, func
from adapters.db.repositories.product_attribute_repository import ProductAttributeRepository
from adapters.db.models.product_attribute import ProductAttribute
from adapters.api.v1.schema_models.product_attribute import (
ProductAttributeCreateRequest,
ProductAttributeUpdateRequest,
)
from app.core.responses import ApiError
def create_attribute(db: Session, business_id: int, payload: ProductAttributeCreateRequest) -> Dict[str, Any]:
repo = ProductAttributeRepository(db)
# جلوگیری از عنوان تکراری در هر کسب‌وکار
dup = db.query(ProductAttribute).filter(
and_(ProductAttribute.business_id == business_id, func.lower(ProductAttribute.title) == func.lower(payload.title.strip()))
).first()
if dup:
raise ApiError("DUPLICATE_ATTRIBUTE_TITLE", "عنوان ویژگی تکراری است", http_status=400)
obj = repo.create(business_id=business_id, title=payload.title.strip(), description=payload.description)
return {
"message": "ویژگی با موفقیت ایجاد شد",
"data": _to_dict(obj),
}
def list_attributes(db: Session, business_id: int, query: Dict[str, Any]) -> Dict[str, Any]:
repo = ProductAttributeRepository(db)
take = int(query.get("take", 20) or 20)
skip = int(query.get("skip", 0) or 0)
sort_by = query.get("sort_by")
sort_desc = bool(query.get("sort_desc", True))
search = query.get("search")
filters = query.get("filters")
result = repo.search(
business_id=business_id,
take=take,
skip=skip,
sort_by=sort_by,
sort_desc=sort_desc,
search=search,
filters=filters,
)
return result
def get_attribute(db: Session, attribute_id: int, business_id: int) -> Optional[Dict[str, Any]]:
obj = db.get(ProductAttribute, attribute_id)
if not obj or obj.business_id != business_id:
return None
return _to_dict(obj)
def update_attribute(db: Session, attribute_id: int, business_id: int, payload: ProductAttributeUpdateRequest) -> Optional[Dict[str, Any]]:
repo = ProductAttributeRepository(db)
# کنترل مالکیت
obj = db.get(ProductAttribute, attribute_id)
if not obj or obj.business_id != business_id:
return None
# بررسی تکراری نبودن عنوان
if payload.title is not None:
title_norm = payload.title.strip()
dup = db.query(ProductAttribute).filter(
and_(
ProductAttribute.business_id == business_id,
func.lower(ProductAttribute.title) == func.lower(title_norm),
ProductAttribute.id != attribute_id,
)
).first()
if dup:
raise ApiError("DUPLICATE_ATTRIBUTE_TITLE", "عنوان ویژگی تکراری است", http_status=400)
updated = repo.update(
attribute_id=attribute_id,
title=payload.title.strip() if isinstance(payload.title, str) else None,
description=payload.description,
)
if not updated:
return None
return {
"message": "ویژگی با موفقیت ویرایش شد",
"data": _to_dict(updated),
}
def delete_attribute(db: Session, attribute_id: int, business_id: int) -> bool:
repo = ProductAttributeRepository(db)
obj = db.get(ProductAttribute, attribute_id)
if not obj or obj.business_id != business_id:
return False
return repo.delete(attribute_id=attribute_id)
def _to_dict(obj: ProductAttribute) -> Dict[str, Any]:
return {
"id": obj.id,
"business_id": obj.business_id,
"title": obj.title,
"description": obj.description,
"is_active": obj.is_active,
"created_at": obj.created_at,
"updated_at": obj.updated_at,
}