product_service.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. # app/services/product_service.py
  2. from sqlalchemy.orm import Session
  3. from typing import Optional, List
  4. from app.utils.search import apply_keyword_search
  5. from app.utils.pagination import paginate
  6. from app.core.biz_exception import NotFoundError, PermissionDeniedError, BizLogicError
  7. from app.models.product import VasProduct
  8. from app.schemas.product import VasProductCreate, VasProductUpdate, VasProductOut
  9. class ProductService:
  10. def create(db: Session, data: VasProductCreate):
  11. rec = VasProduct(**data.dict())
  12. db.add(rec)
  13. db.commit()
  14. db.refresh(rec)
  15. return rec
  16. def get(db: Session, id:int):
  17. obj = db.query(VasProduct).filter_by(id=id).first()
  18. if not obj:
  19. raise NotFoundError('Product not exist')
  20. return obj
  21. def update(db: Session, id:int, data: VasProductUpdate):
  22. rec = db.query(VasProduct).filter_by(id=id).first()
  23. if not rec:
  24. raise NotFoundError('Product not exist')
  25. for k,v in data.dict(exclude_unset=True).items():
  26. setattr(rec,k,v)
  27. db.commit()
  28. db.refresh(rec)
  29. return rec
  30. def list_product(db: Session, country: str = None, visa_type: str = None, page: int=0, size: int=10, keyword: str=None):
  31. query = db.query(VasProduct)
  32. if country:
  33. query = query.filter(VasProduct.country == country)
  34. if visa_type:
  35. query = query.filter(VasProduct.visa_type == visa_type)
  36. query = apply_keyword_search(
  37. query=query,
  38. model=VasProduct,
  39. keyword=keyword,
  40. fields=["title", "provider", "description"]
  41. )
  42. return paginate(query, page, size)