61e3d71b72
there are 3 parts, from back to head, url inside the bucket -> url of backend media api -> backend domain, only the last part is spliced by frontend, the other two parts are spliced with sqlalchemy
58 lines
2.6 KiB
Python
58 lines
2.6 KiB
Python
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"<User(id={self.id}, name={self.name}, email={self.email})>" |