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