from sqlalchemy import Column, DateTime, String, ForeignKey, BigInteger, UniqueConstraint, Integer from sqlalchemy.sql import func from .base import AutoID, Base class Workspace(Base, AutoID): """工作区表""" __tablename__ = "workspaces" # --- 基础与个性化 --- name = Column(String, nullable=False) slug = Column(String, unique=True, index=True, nullable=False) logo = Column(String, nullable=True) description = Column(String, nullable=True) total_project_count = Column(Integer, default=0, nullable=False, server_default="0") total_like_count = Column(Integer, default=0, nullable=False, server_default="0") total_favorite_count = Column(Integer, default=0, nullable=False, server_default="0") total_share_count = Column(Integer, default=0, nullable=False, server_default="0") # 存储容量上限(单位:字节 Bytes),默认 5GB storage_limit = Column(BigInteger, default=5 * 1024 * 1024 * 1024) storage_used = Column(BigInteger, default=0, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) class WorkspaceMember(Base, AutoID): """工作区成员及权限表""" __tablename__ = "workspace_members" workspace_id = Column( String(AutoID.id_length()), ForeignKey("workspaces.id", ondelete="CASCADE"), index=True, ) # 允许 user_id 为空,因为被邀请的人可能还没注册系统,我们先记录他的邮箱 user_id = Column( String(AutoID.id_length()), ForeignKey("users.id", ondelete="CASCADE"), nullable=True, index=True, ) invite_email = Column(String, nullable=True) # 收到邀请的邮箱 # 状态:'pending' (等待加入), 'active' (已加入), 'disabled' (已禁用) status = Column(String, default="pending", nullable=False) # 角色权限:'owner' (所有者), 'admin' (管理员), 'user' (普通用户) role = Column(String, default="user", nullable=False) likes_received_count = Column(Integer, default=0, nullable=False, server_default="0") favorites_received_count = Column(Integer, default=0, nullable=False, server_default="0") shares_received_count = Column(Integer, default=0, nullable=False, server_default="0") # invite_token 用于生成邀请链接,token_expires_at 用于设置链接过期时间 invite_token = Column(String, nullable=True, unique=True) token_expires_at = Column(DateTime(timezone=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) # 一个用户在一个工作区只能有一条记录 __table_args__ = ( UniqueConstraint("workspace_id", "user_id", name="uq_workspace_user"), )