"""initial schema. Revision ID: initial Revises: Create Date: 2026-09-07 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "initial" down_revision = None branch_labels = None depends_on = None def upgrade() -> None: # slabs op.create_table( "slabs", sa.Column("id", sa.Text(), nullable=False, primary_key=True), sa.Column("sku", sa.String(length=24), nullable=False), sa.Column("status", sa.Text(), nullable=False, server_default="draft"), sa.Column("length_in", sa.Float(), nullable=False), sa.Column("thickness_in", sa.Float(), nullable=False), sa.Column("sqft", sa.Float(), nullable=True), sa.Column("bdft", sa.Float(), nullable=True), sa.Column("width_min_in", sa.Float(), nullable=True), sa.Column("width_max_in", sa.Float(), nullable=True), sa.Column("width_avg_in", sa.Float(), nullable=True), sa.Column("species_id", sa.Integer(), nullable=True), sa.Column("wood_category_ids", sa.JSON(), nullable=True), sa.Column("edge_type_term_id", sa.Integer(), nullable=True), sa.Column("figure_term_ids", sa.JSON(), nullable=True), sa.Column("grade_term_ids", sa.JSON(), nullable=True), sa.Column("thickness_term_id", sa.Integer(), nullable=True), sa.Column("moisture_term_id", sa.Integer(), nullable=True), sa.Column("fig_tag_ids", sa.JSON(), nullable=True), sa.Column("feat_tag_ids", sa.JSON(), nullable=True), sa.Column("price_per_bdft", sa.Float(), nullable=True), sa.Column("price", sa.Float(), nullable=False), sa.Column("price_source", sa.Text(), nullable=True), sa.Column("title", sa.Text(), nullable=True), sa.Column("short_title", sa.Text(), nullable=True), sa.Column("description", sa.Text(), nullable=True), sa.Column("content_source", sa.Text(), nullable=True), sa.Column("client_rev", sa.Integer(), nullable=False, server_default="1"), sa.Column("server_rev", sa.Integer(), nullable=False, server_default="1"), sa.Column("created_at", sa.Text(), nullable=False, server_default=sa.text("datetime('now')")), sa.Column("updated_at", sa.Text(), nullable=False, server_default=sa.text("datetime('now')")), sa.Column("inference_thread_id", sa.Text(), nullable=True), sa.CheckConstraint("length_in >= 0"), sa.CheckConstraint("thickness_in >= 0"), sa.CheckConstraint("price >= 0"), sa.UniqueConstraint("sku"), ) op.create_index("idx_slabs_status", "slabs", ["status"]) op.create_index("idx_slabs_updated_at", "slabs", ["updated_at"]) # slab_photos op.create_table( "slab_photos", sa.Column("id", sa.Text(), nullable=False, primary_key=True), sa.Column("slab_id", sa.Text(), nullable=False), sa.Column("kind", sa.Text(), nullable=False), sa.Column("role", sa.Text(), nullable=True), sa.Column("seq", sa.Integer(), nullable=False, server_default="0"), sa.Column("original_path", sa.Text(), nullable=True), sa.Column("processed_path", sa.Text(), nullable=True), sa.Column("created_at", sa.Text(), server_default=sa.text("datetime('now')")), sa.ForeignKeyConstraint(["slab_id"], ["slabs.id"], ondelete="CASCADE"), ) # pricing_rules op.create_table( "pricing_rules", sa.Column("id", sa.Text(), nullable=False, primary_key=True), sa.Column("species", sa.Text(), nullable=False), sa.Column("price_per_bdft", sa.Float(), nullable=False), sa.Column("created_at", sa.Text(), server_default=sa.text("datetime('now')")), sa.Column("updated_at", sa.Text(), server_default=sa.text("datetime('now')")), sa.UniqueConstraint("species"), ) # woo_categories op.create_table( "woo_categories", sa.Column("woo_id", sa.Integer(), nullable=False, primary_key=True), sa.Column("name", sa.Text(), nullable=True), sa.Column("slug", sa.Text(), nullable=True), sa.Column("parent_id", sa.Integer(), nullable=True), sa.Column("synced_at", sa.Text(), nullable=True), sa.UniqueConstraint("woo_id"), ) # woo_attributes op.create_table( "woo_attributes", sa.Column("woo_id", sa.Integer(), nullable=False, primary_key=True), sa.Column("name", sa.Text(), nullable=True), sa.Column("slug", sa.Text(), nullable=True), sa.Column("type", sa.Text(), server_default="select"), sa.Column("synced_at", sa.Text(), nullable=True), sa.UniqueConstraint("woo_id"), ) # woo_attribute_terms op.create_table( "woo_attribute_terms", sa.Column("woo_id", sa.Integer(), nullable=False, primary_key=True), sa.Column("attribute_id", sa.Integer(), nullable=False), sa.Column("name", sa.Text(), nullable=True), sa.Column("slug", sa.Text(), nullable=True), sa.Column("synced_at", sa.Text(), nullable=True), sa.ForeignKeyConstraint(["attribute_id"], ["woo_attributes.woo_id"]), sa.UniqueConstraint("woo_id"), ) # woo_tags op.create_table( "woo_tags", sa.Column("woo_id", sa.Integer(), nullable=False, primary_key=True), sa.Column("name", sa.Text(), nullable=True), sa.Column("slug", sa.Text(), nullable=True), sa.Column("synced_at", sa.Text(), nullable=True), sa.UniqueConstraint("woo_id"), ) # settings op.create_table( "settings", sa.Column("key", sa.Text(), nullable=False, primary_key=True), sa.Column("value_enc", sa.LargeBinary(), nullable=True), sa.Column("updated_at", sa.Text(), server_default=sa.text("datetime('now')")), ) # sync_log op.create_table( "sync_log", sa.Column("id", sa.Integer(), nullable=False, autoincrement=True, primary_key=True), sa.Column("slab_id", sa.Text(), nullable=True), sa.Column("sku", sa.Text(), nullable=True), sa.Column("woo_product_id", sa.Integer(), nullable=True), sa.Column("status", sa.Text(), nullable=True), sa.Column("http_status", sa.Integer(), nullable=True), sa.Column("error", sa.Text(), nullable=True), sa.Column("detail", sa.Text(), nullable=True), sa.Column("payload_hash", sa.Text(), nullable=True), sa.Column("created_at", sa.Text(), server_default=sa.text("datetime('now')")), ) # inference_log op.create_table( "inference_log", sa.Column("id", sa.Integer(), nullable=False, autoincrement=True, primary_key=True), sa.Column("slab_id", sa.Text(), nullable=True), sa.Column("call", sa.Text(), nullable=True), sa.Column("request_payload", sa.Text(), nullable=True), sa.Column("response_payload", sa.Text(), nullable=True), sa.Column("created_at", sa.Text(), server_default=sa.text("datetime('now')")), ) def downgrade() -> None: op.drop_table("inference_log") op.drop_table("sync_log") op.drop_table("settings") op.drop_table("woo_tags") op.drop_table("woo_attribute_terms") op.drop_table("woo_attributes") op.drop_table("woo_categories") op.drop_table("pricing_rules") op.drop_table("slab_photos") op.drop_index("idx_slabs_updated_at", table_name="slabs") op.drop_index("idx_slabs_status", table_name="slabs") op.drop_table("slabs")