"""Phase 5: Einladungen, Eigentümerwechsel, Ersteller je Eintrag Revision ID: 0004 Revises: 0003 Create Date: 2026-08-08 """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op revision: str = "0004" down_revision: str | None = "0003" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.add_column( "list_item", sa.Column("created_by", sa.String(36), nullable=True), ) op.create_foreign_key( "fk_list_item_created_by", "list_item", "user", ["created_by"], ["id"], ondelete="SET NULL", ) op.create_table( "list_invite", sa.Column("id", sa.String(36), primary_key=True), sa.Column("list_id", sa.String(36), nullable=False), sa.Column("email", sa.String(255), nullable=False), sa.Column("role", sa.String(16), nullable=False, server_default="editor"), sa.Column("token_hash", sa.String(64), nullable=False), sa.Column("invited_by", sa.String(36), nullable=True), sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.now()), sa.Column("last_sent_at", sa.DateTime(), nullable=False, server_default=sa.func.now()), sa.Column("send_count", sa.Integer(), nullable=False, server_default=sa.text("1")), sa.Column("expires_at", sa.DateTime(), nullable=False), sa.Column("accepted_at", sa.DateTime(), nullable=True), sa.Column("accepted_by", sa.String(36), nullable=True), sa.Column("revoked_at", sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(["list_id"], ["shopping_list.id"], ondelete="CASCADE"), sa.ForeignKeyConstraint(["invited_by"], ["user.id"], ondelete="SET NULL"), sa.ForeignKeyConstraint(["accepted_by"], ["user.id"], ondelete="SET NULL"), sa.UniqueConstraint("token_hash", name="uq_list_invite_token"), mysql_engine="InnoDB", mysql_charset="utf8mb4", mysql_collate="utf8mb4_unicode_ci", ) op.create_index("ix_list_invite_list", "list_invite", ["list_id"]) op.create_index("ix_list_invite_email", "list_invite", ["email"]) def downgrade() -> None: op.drop_index("ix_list_invite_email", table_name="list_invite") op.drop_index("ix_list_invite_list", table_name="list_invite") op.drop_table("list_invite") op.drop_constraint("fk_list_item_created_by", "list_item", type_="foreignkey") op.drop_column("list_item", "created_by")