69 lines
3.6 KiB
Python
69 lines
3.6 KiB
Python
"""add domain constraints and operational indexes
|
|
|
|
Revision ID: c24f6a9d013e
|
|
Revises: b913a72e8c14
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
|
|
from alembic import op
|
|
|
|
revision = "c24f6a9d013e"
|
|
down_revision = "b913a72e8c14"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
checks = (
|
|
("bookings", "ck_bookings_status", "status IN ('reserved','active','returned','cancelled','blocked')"),
|
|
("bookings", "ck_bookings_time_window", "ends_at > starts_at"),
|
|
("bookings", "ck_bookings_start_odometer", "start_odometer_km IS NULL OR start_odometer_km >= 0"),
|
|
("bookings", "ck_bookings_end_odometer", "end_odometer_km IS NULL OR end_odometer_km >= 0"),
|
|
("vehicles", "ck_vehicles_operational_status", "operational_status IN ('available','rented','cleaning','maintenance','blocked')"),
|
|
("vehicles", "ck_vehicles_model_year", "model_year BETWEEN 1900 AND 2100"),
|
|
("vehicles", "ck_vehicles_odometer", "odometer_km >= 0"),
|
|
("vehicles", "ck_vehicles_next_service", "next_service_km >= 0"),
|
|
("vehicles", "ck_vehicles_version", "version >= 1"),
|
|
("data_quality_issues", "ck_data_quality_rule_type", "rule_type IN ('possible_duplicate_customer','missing_required_field','odometer_regression','booking_overlap','vehicle_status_conflict')"),
|
|
("data_quality_issues", "ck_data_quality_severity", "severity IN ('low','medium','high')"),
|
|
("data_quality_issues", "ck_data_quality_status", "status IN ('open','deferred','resolved','rejected')"),
|
|
("outbox_events", "ck_outbox_delivery_status", "delivery_status IN ('pending','delivering','succeeded','failed')"),
|
|
("outbox_events", "ck_outbox_attempts", "attempts >= 0"),
|
|
("audit_events", "ck_audit_actor_type", "actor_type IN ('user','service','system')"),
|
|
)
|
|
for table, name, condition in checks:
|
|
op.create_check_constraint(name, table, condition)
|
|
|
|
op.create_index("ix_bookings_vehicle_status_window", "bookings", ["vehicle_id", "status", "starts_at", "ends_at"])
|
|
op.create_index("ix_data_quality_work_queue", "data_quality_issues", ["status", "due_at", "severity"])
|
|
op.create_index("ix_outbox_delivery_next_attempt", "outbox_events", ["delivery_status", "next_attempt_at"])
|
|
op.create_index("ix_audit_action_occurred", "audit_events", ["action", "occurred_at"])
|
|
op.create_index("ix_audit_entity", "audit_events", ["entity_type", "entity_id"])
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index("ix_audit_entity", table_name="audit_events")
|
|
op.drop_index("ix_audit_action_occurred", table_name="audit_events")
|
|
op.drop_index("ix_outbox_delivery_next_attempt", table_name="outbox_events")
|
|
op.drop_index("ix_data_quality_work_queue", table_name="data_quality_issues")
|
|
op.drop_index("ix_bookings_vehicle_status_window", table_name="bookings")
|
|
for table, name in (
|
|
("audit_events", "ck_audit_actor_type"),
|
|
("outbox_events", "ck_outbox_attempts"),
|
|
("outbox_events", "ck_outbox_delivery_status"),
|
|
("data_quality_issues", "ck_data_quality_status"),
|
|
("data_quality_issues", "ck_data_quality_severity"),
|
|
("data_quality_issues", "ck_data_quality_rule_type"),
|
|
("vehicles", "ck_vehicles_version"),
|
|
("vehicles", "ck_vehicles_next_service"),
|
|
("vehicles", "ck_vehicles_odometer"),
|
|
("vehicles", "ck_vehicles_model_year"),
|
|
("vehicles", "ck_vehicles_operational_status"),
|
|
("bookings", "ck_bookings_end_odometer"),
|
|
("bookings", "ck_bookings_start_odometer"),
|
|
("bookings", "ck_bookings_time_window"),
|
|
("bookings", "ck_bookings_status"),
|
|
):
|
|
op.drop_constraint(name, table, type_="check")
|