Files
MobilityOps/backend/alembic/versions/c24f6a9d013e_domain_constraints_indexes.py
T

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")