from sqlalchemy import Column, DateTime, String, Integer from sqlalchemy.sql import func from .base import AutoID, Base class User(Base, AutoID): __tablename__ = "users" # 自定义配置 # _id_prefix_len = 4 # _id_payload_len = 16 google_id = Column(String, unique=True, index=True) email = Column(String, unique=True, index=True) name = Column(String) # 类似 Twitter 的 @code 唯一标识 handle = Column(String, unique=True, index=True, nullable=True) avatar = Column(String) @property def avatar_url(self) -> str | None: if not self.avatar: return None # 如果是第三方(如未迁移成功时降级的 Google 原始链接),直接返回 if self.avatar.startswith(("http://", "https://")): return self.avatar path = self.avatar.lstrip("/") return f"/v1/media/{path}" # ---- 互动统计字段 ---- following_count = Column(Integer, default=0, nullable=False, server_default="0") # 关注了多少人 follower_count = Column(Integer, default=0, nullable=False, server_default="0") # 粉丝数 # 作为 Owner (所有者) 身份在各个空间获得的累计总数 owner_project_count = Column(Integer, default=0, nullable=False, server_default="0") owner_likes_count = Column(Integer, default=0, nullable=False, server_default="0") owner_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") owner_shares_count = Column(Integer, default=0, nullable=False, server_default="0") # 作为 Admin (管理员) 身份在各个空间获得的累计总数 admin_project_count = Column(Integer, default=0, nullable=False, server_default="0") admin_likes_count = Column(Integer, default=0, nullable=False, server_default="0") admin_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") admin_shares_count = Column(Integer, default=0, nullable=False, server_default="0") # 作为 User (普通用户) 身份在各个空间获得的累计总数 user_project_count = Column(Integer, default=0, nullable=False, server_default="0") user_likes_count = Column(Integer, default=0, nullable=False, server_default="0") user_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") user_shares_count = Column(Integer, default=0, nullable=False, server_default="0") created_at = Column(DateTime(timezone=True), server_default=func.now()) def __repr__(self): return f""