"""用户表模型"""
import datetime
from typing import Optional
import sqlalchemy as sa
from sqlalchemy import func
from sqlalchemy.orm import Mapped, mapped_column
from backend.core.database import Base
USER_TYPE_VALUES = ("member", "group_account", "notifier")
GROUP_CAPABLE_TYPES = ("group_account", "notifier")
class User(Base):
"""用户表
三种用户类型:
- member:个人成员(如 zhangsan, lisi)
- group_account:组账号(如 arkui_image, arkui_components)
- notifier:通知账号(用于发送评论等系统通知,也可拥有成员)
"""
__tablename__ = "users"
id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)
user_name: Mapped[str] = mapped_column(sa.String(128), nullable=False, unique=True)
display_name: Mapped[Optional[str]] = mapped_column(sa.String(128), nullable=True)
description: Mapped[Optional[str]] = mapped_column(sa.Text, nullable=True)
type: Mapped[str] = mapped_column(sa.String(16), nullable=False)
is_active: Mapped[bool] = mapped_column(sa.Boolean, default=True)
access_token: Mapped[Optional[str]] = mapped_column(sa.String(256), nullable=True)
created_at: Mapped[datetime.datetime] = mapped_column(sa.DateTime, nullable=False, server_default=func.now())
updated_at: Mapped[datetime.datetime] = mapped_column(
sa.DateTime, nullable=False, server_default=func.now(), onupdate=func.now(),
)
__table_args__ = (
sa.Index("idx_user_type", "type"),
sa.Index("idx_user_active", "is_active"),
)
def __repr__(self) -> str:
return f"<User(id={self.id}, user_name={self.user_name}, type={self.type})>"