"""组成员关系表模型"""
import datetime
import sqlalchemy as sa
from sqlalchemy import func
from sqlalchemy.orm import Mapped, mapped_column
from backend.core.database import Base
GROUP_ROLE_VALUES = ("member", "admin", "owner")
class GroupMember(Base):
"""组成员关系表
维护组账号和成员的多对多关系。
应用层保证:group_id 指向 GROUP_CAPABLE_TYPES 中的用户类型,member_id 指向 users 表中任意用户。
"""
__tablename__ = "group_members"
id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)
group_id: Mapped[int] = mapped_column(
sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False,
)
member_id: Mapped[int] = mapped_column(
sa.Integer, sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False,
)
role: Mapped[str] = mapped_column(sa.String(16), default="member")
joined_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.UniqueConstraint("group_id", "member_id", name="uk_group_member"),
sa.Index("idx_gm_member_id", "member_id"),
)
def __repr__(self) -> str:
return (
f"<GroupMember(id={self.id}, group_id={self.group_id}, "
f"member_id={self.member_id}, role={self.role})>"
)