0017_storefront.py 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import sqlalchemy as sa
  2. from alembic import op
  3. from sqlalchemy.dialects import mysql
  4. revision = "0017_storefront"
  5. down_revision = "0016_platform"
  6. branch_labels = None
  7. depends_on = None
  8. def upgrade():
  9. op.create_table(
  10. "catalog_categories",
  11. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  12. sa.Column("store_id", mysql.BINARY(16), primary_key=True),
  13. sa.Column("code", sa.String(32), primary_key=True),
  14. sa.Column("name", sa.String(64), nullable=False),
  15. sa.Column("position", mysql.BIGINT(unsigned=True), nullable=False),
  16. sa.ForeignKeyConstraint(["tenant_id", "store_id"], ["stores.tenant_id", "stores.id"]),
  17. sa.UniqueConstraint("tenant_id", "store_id", "code", name="uq_catalog_category_code"),
  18. )
  19. op.create_table(
  20. "catalog_products",
  21. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  22. sa.Column("store_id", mysql.BINARY(16), primary_key=True),
  23. sa.Column("id", sa.String(64), primary_key=True),
  24. sa.Column("category_code", sa.String(32), nullable=False),
  25. sa.Column("name", sa.String(128), nullable=False),
  26. sa.Column("description", sa.String(4000), nullable=False),
  27. sa.Column("specifications", sa.JSON(), nullable=False),
  28. sa.Column("delivery", sa.String(500), nullable=False),
  29. sa.Column("image_url", sa.String(1024), nullable=False),
  30. sa.Column("image_source", sa.String(1024), nullable=False),
  31. sa.Column("status", sa.String(16), nullable=False),
  32. sa.ForeignKeyConstraint(
  33. ["tenant_id", "store_id", "category_code"],
  34. ["catalog_categories.tenant_id", "catalog_categories.store_id",
  35. "catalog_categories.code"],
  36. ),
  37. sa.CheckConstraint("status IN ('ACTIVE','HIDDEN')", name="status"),
  38. )
  39. op.create_table(
  40. "identity_challenges",
  41. sa.Column("id", mysql.BINARY(16), primary_key=True),
  42. sa.Column("tenant_id", mysql.BINARY(16), nullable=False),
  43. sa.Column("store_id", mysql.BINARY(16), nullable=False),
  44. sa.Column("customer_id", mysql.BINARY(16), nullable=False),
  45. sa.Column("request_key", sa.String(64, collation="utf8mb4_bin"), nullable=False),
  46. sa.Column("channel", sa.String(32), nullable=False),
  47. sa.Column("status", sa.String(16), nullable=False),
  48. sa.Column("external_subject", sa.String(128, collation="utf8mb4_bin"), nullable=True),
  49. sa.Column("display_name", sa.String(128), nullable=True),
  50. sa.Column("verified_by", mysql.BINARY(16), nullable=True),
  51. sa.Column("expires_at", mysql.DATETIME(fsp=6), nullable=False),
  52. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  53. sa.ForeignKeyConstraint(["tenant_id", "store_id"], ["stores.tenant_id", "stores.id"]),
  54. sa.ForeignKeyConstraint(
  55. ["tenant_id", "customer_id"], ["principals.tenant_id", "principals.id"]
  56. ),
  57. sa.UniqueConstraint(
  58. "tenant_id", "customer_id", "request_key", name="uq_identity_challenge_key"
  59. ),
  60. sa.CheckConstraint("status IN ('PENDING','VERIFIED','LINKED')", name="status"),
  61. )
  62. op.create_table(
  63. "channel_identities",
  64. sa.Column("tenant_id", mysql.BINARY(16), primary_key=True),
  65. sa.Column("store_id", mysql.BINARY(16), primary_key=True),
  66. sa.Column("channel", sa.String(32), primary_key=True),
  67. sa.Column("external_subject", sa.String(128, collation="utf8mb4_bin"), primary_key=True),
  68. sa.Column("customer_id", mysql.BINARY(16), nullable=False),
  69. sa.Column("display_name", sa.String(128), nullable=False),
  70. sa.Column("challenge_id", mysql.BINARY(16), nullable=False),
  71. sa.Column("created_at", mysql.DATETIME(fsp=6), nullable=False),
  72. sa.ForeignKeyConstraint(["tenant_id", "store_id"], ["stores.tenant_id", "stores.id"]),
  73. sa.ForeignKeyConstraint(
  74. ["tenant_id", "customer_id"], ["principals.tenant_id", "principals.id"]
  75. ),
  76. sa.UniqueConstraint(
  77. "tenant_id", "store_id", "channel", "customer_id", name="uq_channel_customer"
  78. ),
  79. )
  80. def downgrade():
  81. op.drop_table("channel_identities")
  82. op.drop_table("identity_challenges")
  83. op.drop_table("catalog_products")
  84. op.drop_table("catalog_categories")