0004_fulfillment.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import sqlalchemy as sa
  2. from alembic import op
  3. from sqlalchemy.dialects.mysql import BIGINT, BINARY, DATETIME
  4. revision = "0004_fulfillment"
  5. down_revision = "0003_proposal_submitter"
  6. branch_labels = None
  7. depends_on = None
  8. def identifier(name, primary=False):
  9. return sa.Column(name, BINARY(16), primary_key=primary, nullable=False)
  10. def upgrade():
  11. op.drop_constraint(op.f("ck_tickets_status"), "tickets", type_="check")
  12. op.create_check_constraint(
  13. op.f("ck_tickets_status"),
  14. "tickets",
  15. "status IN ('DRAFT','WAITING_REVIEW','APPROVED','REJECTED','CANCELLED',"
  16. "'PROCESSING','RESULT_UNKNOWN','COMPLETED','FAILED','NEEDS_REVISION')",
  17. )
  18. op.add_column("business_events", sa.Column("lease_until", DATETIME(fsp=6), nullable=True))
  19. op.add_column(
  20. "business_events",
  21. sa.Column("lease_token", BIGINT(unsigned=True), nullable=False, server_default="0"),
  22. )
  23. op.create_table(
  24. "oms_connectors",
  25. identifier("tenant_id", True),
  26. identifier("store_id", True),
  27. sa.Column("source_system", sa.String(64), nullable=False),
  28. sa.Column("base_url", sa.String(512), nullable=False),
  29. sa.Column("credential_env", sa.String(128), nullable=False),
  30. sa.Column("enabled", sa.Boolean(), nullable=False),
  31. sa.ForeignKeyConstraint(["tenant_id", "store_id"], ["stores.tenant_id", "stores.id"]),
  32. )
  33. op.create_table(
  34. "external_operations",
  35. identifier("id", True),
  36. identifier("tenant_id"),
  37. identifier("ticket_id"),
  38. identifier("store_id"),
  39. identifier("order_id"),
  40. sa.Column("proposal_version", BIGINT(unsigned=True), nullable=False),
  41. sa.Column("request", sa.JSON(), nullable=False),
  42. sa.Column("status", sa.String(32), nullable=False),
  43. sa.Column("external_version", BIGINT(unsigned=True), nullable=False),
  44. sa.Column("lease_token", BIGINT(unsigned=True), nullable=False),
  45. sa.Column("lease_until", DATETIME(fsp=6), nullable=True),
  46. sa.Column("next_attempt_at", DATETIME(fsp=6), nullable=False),
  47. sa.Column("last_error", sa.String(64), nullable=True),
  48. sa.Column("base_url", sa.String(512), nullable=False),
  49. sa.Column("credential_env", sa.String(128), nullable=False),
  50. sa.UniqueConstraint(
  51. "tenant_id", "ticket_id", "proposal_version", name="uq_operation_proposal"
  52. ),
  53. sa.UniqueConstraint("tenant_id", "id", name="uq_operation_tenant_id"),
  54. sa.ForeignKeyConstraint(["tenant_id", "ticket_id"], ["tickets.tenant_id", "tickets.id"]),
  55. sa.CheckConstraint(
  56. "status IN ('PREPARED','UNKNOWN','ACCEPTED','COMPLETED','FAILED')",
  57. name=op.f("ck_external_operations_status"),
  58. ),
  59. )
  60. op.create_index("ix_operations_due", "external_operations", ["status", "next_attempt_at", "id"])
  61. op.create_table(
  62. "reservations",
  63. identifier("operation_id", True),
  64. identifier("tenant_id"),
  65. identifier("order_id"),
  66. sa.Column("quantity", sa.Integer(), nullable=False),
  67. sa.Column("status", sa.String(16), nullable=False),
  68. sa.ForeignKeyConstraint(
  69. ["tenant_id", "operation_id"],
  70. ["external_operations.tenant_id", "external_operations.id"],
  71. ),
  72. sa.CheckConstraint("quantity > 0", name=op.f("ck_reservations_quantity")),
  73. sa.CheckConstraint(
  74. "status IN ('HELD','CONSUMED','RELEASED')", name=op.f("ck_reservations_status")
  75. ),
  76. )
  77. op.create_index("ix_reservations_order", "reservations", ["tenant_id", "order_id", "status"])
  78. op.create_table(
  79. "consumer_receipts",
  80. sa.Column("consumer", sa.String(64), primary_key=True),
  81. identifier("event_id", True),
  82. identifier("tenant_id"),
  83. sa.Column("processed_at", DATETIME(fsp=6), nullable=False),
  84. )
  85. def downgrade():
  86. op.drop_table("consumer_receipts")
  87. op.drop_table("reservations")
  88. op.drop_table("external_operations")
  89. op.drop_table("oms_connectors")
  90. op.drop_column("business_events", "lease_token")
  91. op.drop_column("business_events", "lease_until")
  92. op.drop_constraint(op.f("ck_tickets_status"), "tickets", type_="check")
  93. op.create_check_constraint(
  94. op.f("ck_tickets_status"),
  95. "tickets",
  96. "status IN ('DRAFT','WAITING_REVIEW','APPROVED','REJECTED','CANCELLED')",
  97. )