0016_platform.py 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import sqlalchemy as sa
  2. from alembic import op
  3. from sqlalchemy.dialects import mysql
  4. revision = "0016_platform"
  5. down_revision = "0015_merchant"
  6. branch_labels = None
  7. depends_on = None
  8. def upgrade():
  9. op.create_table(
  10. "platform_accounts",
  11. sa.Column("id", mysql.BINARY(16), primary_key=True),
  12. sa.Column("username", sa.String(128), nullable=False, unique=True),
  13. sa.Column("password_hash", sa.String(512), nullable=False),
  14. sa.Column("status", sa.String(16), nullable=False),
  15. sa.Column("permissions", sa.JSON(), nullable=False),
  16. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  17. sa.CheckConstraint("status IN ('ACTIVE','SUSPENDED')", name="status"),
  18. )
  19. op.create_table(
  20. "platform_sessions",
  21. sa.Column("token_hash", mysql.BINARY(32), primary_key=True),
  22. sa.Column("account_id", mysql.BINARY(16), nullable=False),
  23. sa.Column("expires_at", mysql.DATETIME(fsp=6), nullable=False),
  24. sa.Column("revoked", sa.Boolean(), nullable=False),
  25. sa.ForeignKeyConstraint(["account_id"], ["platform_accounts.id"]),
  26. )
  27. op.create_table(
  28. "tenant_registrations",
  29. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  30. sa.Column("contact", sa.String(100), nullable=False),
  31. sa.Column("status", sa.String(16), nullable=False),
  32. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  33. sa.ForeignKeyConstraint(["tenant_id"], ["tenants.id"]),
  34. sa.CheckConstraint("status IN ('PENDING','COMPLETE')", name="status"),
  35. )
  36. op.create_table(
  37. "platform_audit",
  38. sa.Column("id", mysql.BINARY(16), primary_key=True),
  39. sa.Column("actor_id", mysql.BINARY(16), nullable=False),
  40. sa.Column("action", sa.String(128), nullable=False),
  41. sa.Column("object_id", mysql.BINARY(16), nullable=False),
  42. sa.Column("object_name", sa.String(128), nullable=False),
  43. sa.Column("before", sa.JSON(), nullable=False),
  44. sa.Column("after", sa.JSON(), nullable=False),
  45. sa.Column("reason", sa.String(1000), nullable=False),
  46. sa.Column("request_id", sa.String(36), nullable=False),
  47. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  48. sa.ForeignKeyConstraint(["actor_id"], ["platform_accounts.id"]),
  49. )
  50. op.create_index("ix_platform_audit_time", "platform_audit", ["created_at", "id"])
  51. op.create_table(
  52. "platform_commands",
  53. sa.Column("actor_id", mysql.BINARY(16), primary_key=True),
  54. sa.Column("route", sa.String(128), primary_key=True),
  55. sa.Column("key", sa.String(64, collation="utf8mb4_bin"), primary_key=True),
  56. sa.Column("request_hash", mysql.BINARY(32), nullable=False),
  57. sa.Column("response", sa.JSON(), nullable=False),
  58. sa.ForeignKeyConstraint(["actor_id"], ["platform_accounts.id"]),
  59. )
  60. op.create_table(
  61. "channel_deliveries",
  62. sa.Column("id", mysql.BINARY(16), primary_key=True),
  63. sa.Column("event_id", mysql.BINARY(16), nullable=False),
  64. sa.Column("tenant_id", mysql.BINARY(16), nullable=False),
  65. sa.Column("store_id", mysql.BINARY(16), nullable=False),
  66. sa.Column("status", sa.String(16), nullable=False),
  67. sa.Column("attempts", mysql.BIGINT(unsigned=True), nullable=False),
  68. sa.Column("version", mysql.BIGINT(unsigned=True), nullable=False),
  69. sa.Column("lease_token", mysql.BIGINT(unsigned=True), nullable=False),
  70. sa.Column("lease_until", mysql.DATETIME(fsp=6)),
  71. sa.Column("next_attempt_at", mysql.DATETIME(fsp=6)),
  72. sa.Column("last_error", sa.String(128)),
  73. sa.Column("response_status", sa.Integer()),
  74. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  75. sa.Column("sent_at", mysql.DATETIME(fsp=6)),
  76. sa.ForeignKeyConstraint(["event_id"], ["business_events.id"]),
  77. sa.ForeignKeyConstraint(
  78. ["tenant_id", "store_id"],
  79. ["channel_applications.tenant_id", "channel_applications.store_id"],
  80. ),
  81. sa.UniqueConstraint("event_id", "tenant_id", "store_id", name="uq_channel_delivery_event"),
  82. sa.CheckConstraint("status IN ('QUEUED','SENDING','FAILED','SENT')", name="status"),
  83. )
  84. op.create_index(
  85. "ix_channel_delivery_due", "channel_deliveries", ["status", "next_attempt_at", "id"],
  86. )
  87. def downgrade():
  88. op.drop_table("channel_deliveries")
  89. op.drop_table("platform_commands")
  90. op.drop_table("platform_audit")
  91. op.drop_table("tenant_registrations")
  92. op.drop_table("platform_sessions")
  93. op.drop_table("platform_accounts")