billing_service.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import os
  2. import requests
  3. from extensions.ext_database import db
  4. from models.account import TenantAccountJoin, TenantAccountRole
  5. class BillingService:
  6. base_url = os.environ.get("BILLING_API_URL", "BILLING_API_URL")
  7. secret_key = os.environ.get("BILLING_API_SECRET_KEY", "BILLING_API_SECRET_KEY")
  8. @classmethod
  9. def get_info(cls, tenant_id: str):
  10. params = {"tenant_id": tenant_id}
  11. billing_info = cls._send_request("GET", "/subscription/info", params=params)
  12. return billing_info
  13. @classmethod
  14. def get_subscription(cls, plan: str, interval: str, prefilled_email: str = "", tenant_id: str = ""):
  15. params = {"plan": plan, "interval": interval, "prefilled_email": prefilled_email, "tenant_id": tenant_id}
  16. return cls._send_request("GET", "/subscription/payment-link", params=params)
  17. @classmethod
  18. def get_model_provider_payment_link(cls, provider_name: str, tenant_id: str, account_id: str, prefilled_email: str):
  19. params = {
  20. "provider_name": provider_name,
  21. "tenant_id": tenant_id,
  22. "account_id": account_id,
  23. "prefilled_email": prefilled_email,
  24. }
  25. return cls._send_request("GET", "/model-provider/payment-link", params=params)
  26. @classmethod
  27. def get_invoices(cls, prefilled_email: str = "", tenant_id: str = ""):
  28. params = {"prefilled_email": prefilled_email, "tenant_id": tenant_id}
  29. return cls._send_request("GET", "/invoices", params=params)
  30. @classmethod
  31. def _send_request(cls, method, endpoint, json=None, params=None):
  32. headers = {"Content-Type": "application/json", "Billing-Api-Secret-Key": cls.secret_key}
  33. url = f"{cls.base_url}{endpoint}"
  34. response = requests.request(method, url, json=json, params=params, headers=headers)
  35. return response.json()
  36. @staticmethod
  37. def is_tenant_owner_or_admin(current_user):
  38. tenant_id = current_user.current_tenant_id
  39. join = (
  40. db.session.query(TenantAccountJoin)
  41. .filter(TenantAccountJoin.tenant_id == tenant_id, TenantAccountJoin.account_id == current_user.id)
  42. .first()
  43. )
  44. if not TenantAccountRole.is_privileged_role(join.role):
  45. raise ValueError("Only team owner or team admin can perform this action")