from datetime import datetime from typing import Optional from sqlalchemy import UniqueConstraint from sqlmodel import Field, SQLModel class SysRole(SQLModel, table=True): __tablename__ = "sys_role" __table_args__ = ( UniqueConstraint("role_key", name="uq_sys_role_role_key"), ) id: Optional[int] = Field(default=None, primary_key=True) role_key: str = Field(index=True, max_length=64) name: str = Field(default="", max_length=120) description: str = Field(default="") is_active: bool = Field(default=True, index=True) sort_order: int = Field(default=100, index=True) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow, index=True) class SysUser(SQLModel, table=True): __tablename__ = "sys_user" __table_args__ = ( UniqueConstraint("username", name="uq_sys_user_username"), ) id: Optional[int] = Field(default=None, primary_key=True) username: str = Field(index=True, max_length=64) display_name: str = Field(default="", max_length=120) password_hash: str = Field(default="", max_length=255) password_salt: str = Field(default="", max_length=64) role_id: Optional[int] = Field(default=None, foreign_key="sys_role.id", index=True) is_active: bool = Field(default=True, index=True) last_login_at: Optional[datetime] = Field(default=None, index=True) current_token_hash: Optional[str] = Field(default=None, index=True, max_length=255) current_token_expires_at: Optional[datetime] = Field(default=None, index=True) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow, index=True) class SysMenu(SQLModel, table=True): __tablename__ = "sys_menu" __table_args__ = ( UniqueConstraint("menu_key", name="uq_sys_menu_menu_key"), ) id: Optional[int] = Field(default=None, primary_key=True) menu_key: str = Field(index=True, max_length=64) parent_key: str = Field(default="", index=True, max_length=64) title: str = Field(default="", max_length=120) title_en: str = Field(default="", max_length=120) menu_type: str = Field(default="item", max_length=32, index=True) route_path: str = Field(default="", max_length=255) icon: str = Field(default="", max_length=64) permission_key: str = Field(default="", max_length=120) visible: bool = Field(default=True, index=True) sort_order: int = Field(default=100, index=True) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow, index=True) class SysPermission(SQLModel, table=True): __tablename__ = "sys_permission" __table_args__ = ( UniqueConstraint("permission_key", name="uq_sys_permission_permission_key"), ) id: Optional[int] = Field(default=None, primary_key=True) permission_key: str = Field(index=True, max_length=120) name: str = Field(default="", max_length=120) menu_key: str = Field(default="", index=True, max_length=64) action: str = Field(default="view", max_length=32, index=True) description: str = Field(default="") sort_order: int = Field(default=100, index=True) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow, index=True) class SysRoleMenu(SQLModel, table=True): __tablename__ = "sys_role_menu" __table_args__ = ( UniqueConstraint("role_id", "menu_id", name="uq_sys_role_menu_role_menu"), ) id: Optional[int] = Field(default=None, primary_key=True) role_id: int = Field(foreign_key="sys_role.id", index=True) menu_id: int = Field(foreign_key="sys_menu.id", index=True) created_at: datetime = Field(default_factory=datetime.utcnow) class SysRolePermission(SQLModel, table=True): __tablename__ = "sys_role_permission" __table_args__ = ( UniqueConstraint("role_id", "permission_id", name="uq_sys_role_permission_role_permission"), ) id: Optional[int] = Field(default=None, primary_key=True) role_id: int = Field(foreign_key="sys_role.id", index=True) permission_id: int = Field(foreign_key="sys_permission.id", index=True) created_at: datetime = Field(default_factory=datetime.utcnow) class SysUserBot(SQLModel, table=True): __tablename__ = "sys_user_bot" __table_args__ = ( UniqueConstraint("user_id", "bot_id", name="uq_sys_user_bot_user_bot"), ) id: Optional[int] = Field(default=None, primary_key=True) user_id: int = Field(foreign_key="sys_user.id", index=True) bot_id: str = Field(foreign_key="bot_instance.id", index=True, max_length=120) created_at: datetime = Field(default_factory=datetime.utcnow)