import enum from sqlalchemy import Column, DateTime, Enum as SQLAEnum, ForeignKey, Index, JSON, String, Table from sqlalchemy.sql import func from orm import metadata from orm.sql_types import UnsignedInt class AccountRole(enum.StrEnum): OWNER = "OWNER" ADMIN = "ADMIN" EDITOR = "EDITOR" VIEWER = "VIEWER" class AccountStatus(enum.StrEnum): ACTIVE = "ACTIVE" DISABLED = "DISABLED" BLOCKED = "BLOCKED" DELETED = "DELETED" account_table = Table( "account", metadata, Column("id", UnsignedInt, primary_key=True, autoincrement=True), Column("name", String(100), nullable=False), Column("login", String(100), nullable=False), Column("email", String(100), nullable=True), Column("bind_tenant_id", String(40), nullable=True), Column("role", SQLAEnum(AccountRole), nullable=False), Column("meta", JSON, default={}), Column("creator_id", UnsignedInt, ForeignKey("account.id"), nullable=True), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("status", SQLAEnum(AccountStatus), nullable=False), Index("idx_login", "login"), Index("idx_name", "name"), ) class KeyType(enum.StrEnum): PASSWORD = "PASSWORD" ACCESS_TOKEN = "ACCESS_TOKEN" REFRESH_TOKEN = "REFRESH_TOKEN" API_KEY = "API_KEY" class KeyStatus(enum.StrEnum): ACTIVE = "ACTIVE" EXPIRED = "EXPIRED" DELETED = "DELETED" account_keyring_table = Table( "account_keyring", metadata, Column("owner_id", UnsignedInt, ForeignKey("account.id"), primary_key=True, nullable=False), Column("key_type", SQLAEnum(KeyType), primary_key=True, nullable=False), Column("key_id", String(40), primary_key=True, default=None), Column("key_value", String(512), nullable=False), Column("created_at", DateTime(timezone=True), server_default=func.now()), Column("expiry", DateTime(timezone=True), nullable=True), Column("status", SQLAEnum(KeyStatus), nullable=False), )