payment_provider_service.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 delete(db: Session, id: int):
  53. provider = db.query(VasPaymentProvider).filter_by(id=id).first()
  54. if not provider:
  55. raise NotFoundError("Provider not exist")
  56. db.delete(provider)
  57. db.commit()
  58. def list_all(db: Session):
  59. return db.query(VasPaymentProvider).all()
  60. def list_enabled(
  61. db: Session,
  62. currency: str = None
  63. ):
  64. q = db.query(VasPaymentProvider).filter(
  65. VasPaymentProvider.enabled == 1
  66. )
  67. if currency:
  68. q = q.filter(VasPaymentProvider.currency == currency)
  69. return q.all()
  70. def get_by_name(
  71. db: Session,
  72. name: str
  73. ):
  74. q = db.query(VasPaymentProvider).filter(
  75. VasPaymentProvider.enabled == 1
  76. )
  77. if name:
  78. q = q.filter(VasPaymentProvider.name == name)
  79. return q.first()