You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
6.6 KiB
Python

"""phase9 mail+notifications: 10 tables + person.email/role
Revision ID: p9c3d4e5f6a7
Revises: p8b2c3d4e5f6
Create Date: 2026-06-14 02:00:00.000000
"""
from typing import Sequence, Union
import sqlalchemy as sa
import sqlmodel
from alembic import op
revision: str = "p9c3d4e5f6a7"
down_revision: Union[str, Sequence[str], None] = "p8b2c3d4e5f6"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
S = sqlmodel.sql.sqltypes.AutoString
def upgrade() -> None:
# person 확장
with op.batch_alter_table("person") as b:
b.add_column(sa.Column("email", S(), nullable=False, server_default=""))
b.add_column(sa.Column("role", S(), nullable=False, server_default=""))
op.create_table(
"mail_account",
sa.Column("id", S(), nullable=False),
sa.Column("name", S(), nullable=False),
sa.Column("email", S(), nullable=False),
sa.Column("tone", S(), nullable=False),
sa.Column("kind", S(), nullable=False),
sa.Column("unread", sa.Integer(), nullable=False),
sa.Column("connector", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"mail_folder",
sa.Column("id", S(), nullable=False),
sa.Column("name", S(), nullable=False),
sa.Column("icon", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"email",
sa.Column("id", S(), nullable=False),
sa.Column("account", S(), nullable=False),
sa.Column("from_key", S(), nullable=False),
sa.Column("to", S(), nullable=False),
sa.Column("subject", S(), nullable=False),
sa.Column("time", S(), nullable=False),
sa.Column("date", S(), nullable=False),
sa.Column("read", sa.Boolean(), nullable=False),
sa.Column("starred", sa.Boolean(), nullable=False),
sa.Column("archived", sa.Boolean(), nullable=False),
sa.Column("has_attach", sa.Boolean(), nullable=False),
sa.Column("labels", sa.JSON(), nullable=True),
sa.Column("preview", S(), nullable=False),
sa.Column("body", sa.JSON(), nullable=True),
sa.Column("attachments", sa.JSON(), nullable=True),
sa.Column("ai_json", sa.JSON(), nullable=True),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["account"], ["mail_account.id"]),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"sent",
sa.Column("id", S(), nullable=False),
sa.Column("account", S(), nullable=False),
sa.Column("to", S(), nullable=False),
sa.Column("to_key", S(), nullable=False),
sa.Column("subject", S(), nullable=False),
sa.Column("time", S(), nullable=False),
sa.Column("date", S(), nullable=False),
sa.Column("preview", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["account"], ["mail_account.id"]),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"draft",
sa.Column("id", S(), nullable=False),
sa.Column("account", S(), nullable=False),
sa.Column("to", S(), nullable=False),
sa.Column("subject", S(), nullable=False),
sa.Column("time", S(), nullable=False),
sa.Column("preview", S(), nullable=False),
sa.Column("body", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.ForeignKeyConstraint(["account"], ["mail_account.id"]),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"notification",
sa.Column("id", S(), nullable=False),
sa.Column("bucket", S(), nullable=False),
sa.Column("src", S(), nullable=False),
sa.Column("app", S(), nullable=False),
sa.Column("title", S(), nullable=False),
sa.Column("sum", S(), nullable=False),
sa.Column("time", S(), nullable=False),
sa.Column("why", S(), nullable=False),
sa.Column("tone", S(), nullable=False),
sa.Column("act", S(), nullable=False),
sa.Column("held_by_rule", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"notification_guard",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("on", sa.Boolean(), nullable=False),
sa.Column("until", S(), nullable=False),
sa.Column("held", sa.Integer(), nullable=False),
sa.Column("quiet", S(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"digest",
sa.Column("id", S(), nullable=False),
sa.Column("time", S(), nullable=False),
sa.Column("name", S(), nullable=False),
sa.Column("desc", S(), nullable=False),
sa.Column("count", sa.Integer(), nullable=False),
sa.Column("done", sa.Boolean(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"sender_rule",
sa.Column("id", S(), nullable=False),
sa.Column("who", S(), nullable=False),
sa.Column("from_label", S(), nullable=False),
sa.Column("rule", S(), nullable=False),
sa.Column("bucket", S(), nullable=False),
sa.Column("tone", S(), nullable=False),
sa.Column("sort_order", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"notify_stats",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("total", sa.Integer(), nullable=False),
sa.Column("seen", sa.Integer(), nullable=False),
sa.Column("filtered", S(), nullable=False),
sa.Column("later_more", sa.Integer(), nullable=False),
sa.Column("held_more", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint("id"),
)
def downgrade() -> None:
for t in (
"notify_stats", "sender_rule", "digest", "notification_guard", "notification",
"draft", "sent", "email", "mail_folder", "mail_account",
):
op.drop_table(t)
with op.batch_alter_table("person") as b:
b.drop_column("role")
b.drop_column("email")