0014_money_budget.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import sqlalchemy as sa
  2. from alembic import op
  3. from sqlalchemy.dialects import mysql
  4. revision = "0014_money_budget"
  5. down_revision = "0013_token_budget"
  6. branch_labels = None
  7. depends_on = None
  8. def upgrade():
  9. op.create_table(
  10. "billing_grants",
  11. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  12. sa.Column("principal_id", mysql.BINARY(16), primary_key=True),
  13. sa.Column("permission", sa.String(32), primary_key=True),
  14. sa.ForeignKeyConstraint(
  15. ["tenant_id", "principal_id"],
  16. ["principals.tenant_id", "principals.id"],
  17. ondelete="CASCADE",
  18. ),
  19. )
  20. op.create_table(
  21. "billing_changes",
  22. sa.Column("id", mysql.BINARY(16), primary_key=True),
  23. sa.Column("tenant_id", mysql.BINARY(16), nullable=False),
  24. sa.Column("applicant_id", mysql.BINARY(16), nullable=False),
  25. sa.Column("reviewer_id", mysql.BINARY(16), nullable=True),
  26. sa.Column("payload", sa.JSON(), nullable=False),
  27. sa.Column("status", sa.String(16), nullable=False),
  28. sa.Column("version", mysql.BIGINT(unsigned=True), nullable=False),
  29. sa.Column("decision_reason", sa.String(1000), nullable=True),
  30. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  31. sa.Column("expires_at", mysql.DATETIME(fsp=6), nullable=False),
  32. sa.ForeignKeyConstraint(["tenant_id"], ["tenants.id"], ondelete="CASCADE"),
  33. sa.CheckConstraint("status IN ('PENDING','APPROVED','REJECTED')", name="status"),
  34. )
  35. op.create_index("ix_billing_changes_tenant_id", "billing_changes", ["tenant_id", "id"])
  36. op.create_table(
  37. "money_policies",
  38. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  39. sa.Column("daily_limit", mysql.BIGINT(unsigned=True), nullable=False),
  40. sa.Column("version", mysql.BIGINT(unsigned=True), nullable=False),
  41. sa.ForeignKeyConstraint(["tenant_id"], ["tenants.id"], ondelete="CASCADE"),
  42. )
  43. op.create_table(
  44. "billing_routes",
  45. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  46. sa.Column("route_key", mysql.BINARY(32), primary_key=True),
  47. sa.Column("price", sa.JSON(), nullable=False),
  48. sa.Column("version", mysql.BIGINT(unsigned=True), nullable=False),
  49. sa.ForeignKeyConstraint(["tenant_id"], ["tenants.id"], ondelete="CASCADE"),
  50. )
  51. op.create_table(
  52. "money_accounts",
  53. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  54. sa.Column("period", mysql.DATE(), primary_key=True),
  55. sa.Column("daily_limit", mysql.BIGINT(unsigned=True), nullable=False),
  56. sa.Column("reserved", mysql.BIGINT(unsigned=True), nullable=False),
  57. sa.Column("consumed", mysql.BIGINT(unsigned=True), nullable=False),
  58. sa.ForeignKeyConstraint(["tenant_id"], ["tenants.id"], ondelete="CASCADE"),
  59. )
  60. op.create_table(
  61. "money_entries",
  62. sa.Column("id", mysql.BINARY(16), primary_key=True),
  63. sa.Column("tenant_id", mysql.BINARY(16), nullable=False),
  64. sa.Column("period", mysql.DATE(), nullable=False),
  65. sa.Column("price", sa.JSON(), nullable=False),
  66. sa.Column("reserved", mysql.BIGINT(unsigned=True), nullable=False),
  67. sa.Column("charged", mysql.BIGINT(unsigned=True), nullable=True),
  68. sa.Column("status", sa.String(16), nullable=False),
  69. sa.Column("version", mysql.BIGINT(unsigned=True), nullable=False),
  70. sa.Column("basis", sa.String(32), nullable=True),
  71. sa.ForeignKeyConstraint(["id"], ["token_entries.id"], ondelete="CASCADE"),
  72. sa.ForeignKeyConstraint(
  73. ["tenant_id", "period"],
  74. ["money_accounts.tenant_id", "money_accounts.period"],
  75. ondelete="CASCADE",
  76. ),
  77. sa.CheckConstraint("status IN ('PENDING','UNKNOWN','SETTLED','RELEASED')", name="status"),
  78. )
  79. op.create_index("ix_money_entries_tenant_id", "money_entries", ["tenant_id", "id"])
  80. def downgrade():
  81. for table in (
  82. "money_entries",
  83. "money_accounts",
  84. "billing_routes",
  85. "money_policies",
  86. "billing_changes",
  87. "billing_grants",
  88. ):
  89. op.drop_table(table)