payment_provider_service.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # app/services/payment_provider.py
  2. from sqlalchemy.orm import Session
  3. from app.core.biz_exception import NotFoundError, PermissionDeniedError, BizLogicError
  4. from app.models.payment_provider import VasPaymentProvider
  5. from app.schemas.payment_provider import VasPaymentProviderCreate, VasPaymentProviderUpdate
  6. class PaymentProviderSerivce:
  7. def create(
  8. db: Session,
  9. data: VasPaymentProviderCreate
  10. ) -> VasPaymentProvider:
  11. # 防止重复注册
  12. exists = (
  13. db.query(VasPaymentProvider)
  14. .filter(
  15. VasPaymentProvider.name == data.name,
  16. VasPaymentProvider.channel == data.channel,
  17. VasPaymentProvider.currency == data.currency,
  18. )
  19. .first()
  20. )
  21. if exists:
  22. raise BizLogicError("Payment provider already exists")
  23. provider = VasPaymentProvider(
  24. name=data.name,
  25. channel=data.channel,
  26. currency=data.currency,
  27. icon=data.icon,
  28. enabled=data.enabled if data.enabled is not None else 1,
  29. config=data.config,
  30. )
  31. db.add(provider)
  32. db.commit()
  33. db.refresh(provider)
  34. return provider
  35. def update(
  36. db: Session,
  37. provider_id: int,
  38. data: VasPaymentProviderUpdate
  39. ) -> VasPaymentProvider:
  40. provider = db.query(VasPaymentProvider).get(provider_id)
  41. if not provider:
  42. raise BizLogicError("Payment provider not found")
  43. update_data = data.dict(exclude_unset=True)
  44. # 安全起见,禁止修改三元组
  45. for forbidden in ("name", "channel", "currency"):
  46. update_data.pop(forbidden, None)
  47. for key, value in update_data.items():
  48. setattr(provider, key, value)
  49. db.commit()
  50. db.refresh(provider)
  51. return provider
  52. def list_enabled(
  53. db: Session,
  54. currency: str = None
  55. ):
  56. q = db.query(VasPaymentProvider).filter(
  57. VasPaymentProvider.enabled == 1
  58. )
  59. if currency:
  60. q = q.filter(VasPaymentProvider.currency == currency)
  61. return q.all()
  62. def get_by_name(
  63. db: Session,
  64. name: str
  65. ):
  66. q = db.query(VasPaymentProvider).filter(
  67. VasPaymentProvider.enabled == 1
  68. )
  69. if name:
  70. q = q.filter(VasPaymentProvider.name == name)
  71. return q.first()