From e813aeb31ed633045536d633ebad15e2fb63c895 Mon Sep 17 00:00:00 2001 From: Leopoldadmin Date: Wed, 3 Jun 2026 23:52:09 +0000 Subject: [PATCH] Upload alembic/versions/0001_init.py --- alembic/versions/0001_init.py | 103 ++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 alembic/versions/0001_init.py diff --git a/alembic/versions/0001_init.py b/alembic/versions/0001_init.py new file mode 100644 index 0000000..cc0ef02 --- /dev/null +++ b/alembic/versions/0001_init.py @@ -0,0 +1,103 @@ +"""init_orgs_and_users + +Revision ID: 0001 +Revises: +Create Date: 2026-06-03 + +""" +from __future__ import annotations + +from collections.abc import Sequence +from typing import Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "0001" +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # === orgs === + op.create_table( + "orgs", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("name", sa.String(length=255), nullable=False), + sa.Column("logo_url", sa.String(length=1024), nullable=True), + sa.Column( + "default_currency", + sa.String(length=3), + nullable=False, + server_default="EUR", + ), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.func.now(), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.func.now(), + nullable=False, + ), + ) + op.create_index("ix_orgs_created_at", "orgs", ["created_at"]) + + # === users === + op.create_table( + "users", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("org_id", sa.Integer(), nullable=False), + sa.Column("email", sa.String(length=255), nullable=False), + sa.Column("password_hash", sa.String(length=255), nullable=False), + sa.Column("name", sa.String(length=255), nullable=False), + sa.Column( + "role", + sa.String(length=32), + nullable=False, + server_default="sales_rep", + ), + sa.Column("avatar_url", sa.String(length=1024), nullable=True), + sa.Column( + "email_notifications", + sa.Boolean(), + nullable=False, + server_default=sa.text("1"), + ), + sa.Column( + "created_at", + sa.DateTime(timezone=True), + server_default=sa.func.now(), + nullable=False, + ), + sa.Column( + "updated_at", + sa.DateTime(timezone=True), + server_default=sa.func.now(), + nullable=False, + ), + sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint( + ["org_id"], ["orgs.id"], ondelete="CASCADE", name="fk_users_org_id" + ), + sa.UniqueConstraint("org_id", "email", name="uq_users_org_email"), + ) + op.create_index("ix_users_email", "users", ["email"]) + op.create_index("ix_users_org_id", "users", ["org_id"]) + op.create_index("ix_users_created_at", "users", ["created_at"]) + op.create_index("ix_users_deleted_at", "users", ["deleted_at"]) + + +def downgrade() -> None: + op.drop_index("ix_users_deleted_at", table_name="users") + op.drop_index("ix_users_created_at", table_name="users") + op.drop_index("ix_users_org_id", table_name="users") + op.drop_index("ix_users_email", table_name="users") + op.drop_table("users") + op.drop_index("ix_orgs_created_at", table_name="orgs") + op.drop_table("orgs")