Files
character-roleplay-backend/app/models/user.py
T
Zayden-Jung 61e3d71b72 make a media api, encapsulate the original S3 bucket address
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
2026-05-20 17:31:49 +08:00

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})>"