Compare commits

...

2 Commits

Author SHA1 Message Date
Zayden-Jung 7a401fa904 rename project node -> project item 2026-05-18 22:54:37 +08:00
Zayden-Jung 8ea64de612 auto id length in bi ref: interaction 2026-05-18 22:53:02 +08:00
3 changed files with 48 additions and 14 deletions
+2 -2
View File
@@ -3,7 +3,7 @@ from .user import User
from .message import Message from .message import Message
from .follow import Follow from .follow import Follow
from .workspace import Workspace, WorkspaceMember from .workspace import Workspace, WorkspaceMember
from .project import ProjectNode from .project import ProjectItem
from .library import LibraryItem from .library import LibraryItem
from .interaction import ProjectLike, ProjectFavorite, ProjectShare from .interaction import ProjectLike, ProjectFavorite, ProjectShare
@@ -14,7 +14,7 @@ __all__ = [
"Follow", "Follow",
"Workspace", "Workspace",
"WorkspaceMember", "WorkspaceMember",
"ProjectNode", "ProjectItem",
"LibraryItem", "LibraryItem",
"ProjectLike", "ProjectLike",
"ProjectFavorite", "ProjectFavorite",
+43 -9
View File
@@ -1,44 +1,78 @@
from typing import TYPE_CHECKING
from sqlalchemy import Column, DateTime, String, ForeignKey, UniqueConstraint from sqlalchemy import Column, DateTime, String, ForeignKey, UniqueConstraint
from sqlalchemy.sql import func from sqlalchemy.sql import func
from .base import AutoID, Base from .base import AutoID, Base
if TYPE_CHECKING:
from .user import User
from .project import ProjectItem
from .workspace import Workspace
class ProjectLike(Base, AutoID): class ProjectLike(Base, AutoID):
"""项目点赞表""" """项目点赞表"""
__tablename__ = "project_likes" __tablename__ = "project_likes"
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True) user_id = Column(
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True) String(User.id_length()),
ForeignKey("users.id", ondelete="CASCADE"),
index=True
)
project_item_id = Column(
String(ProjectItem.id_length()),
ForeignKey("project_items.id", ondelete="CASCADE"),
index=True
)
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
# 联合唯一约束,防止同一用户重复点赞 # 联合唯一约束,防止同一用户重复点赞
__table_args__ = (UniqueConstraint("user_id", "project_node_id", name="uq_user_project_like"),) __table_args__ = (UniqueConstraint("user_id", "project_item_id", name="uq_user_project_like"),)
class ProjectFavorite(Base, AutoID): class ProjectFavorite(Base, AutoID):
"""项目收藏表""" """项目收藏表"""
__tablename__ = "project_favorites" __tablename__ = "project_favorites"
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True) user_id = Column(
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True) String(User.id_length()),
ForeignKey("users.id", ondelete="CASCADE"),
index=True
)
project_item_id = Column(
String(ProjectItem.id_length()),
ForeignKey("project_items.id", ondelete="CASCADE"),
index=True
)
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
# 联合唯一约束,防止重复收藏 # 联合唯一约束,防止重复收藏
__table_args__ = (UniqueConstraint("user_id", "project_node_id", name="uq_user_project_favorite"),) __table_args__ = (UniqueConstraint("user_id", "project_item_id", name="uq_user_project_favorite"),)
class ProjectShare(Base, AutoID): class ProjectShare(Base, AutoID):
"""项目转发/分享记录表""" """项目转发/分享记录表"""
__tablename__ = "project_shares" __tablename__ = "project_shares"
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True) user_id = Column(
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True) String(User.id_length()),
ForeignKey("users.id", ondelete="CASCADE"),
index=True
)
project_item_id = Column(
String(ProjectItem.id_length()),
ForeignKey("project_items.id", ondelete="CASCADE"),
index=True
)
# 转发去向或渠道,例如 'internal' (转发到其他工作区), 'twitter', 'link' (复制链接) # 转发去向或渠道,例如 'internal' (转发到其他工作区), 'twitter', 'link' (复制链接)
share_target = Column(String, default="internal", nullable=False) share_target = Column(String, default="internal", nullable=False)
# 如果是转发到特定工作区,可以记录目标工作区 ID # 如果是转发到特定工作区,可以记录目标工作区 ID
target_workspace_id = Column(String(32), ForeignKey("workspaces.id", ondelete="SET NULL"), nullable=True) target_workspace_id = Column(
String(Workspace.id_length()),
ForeignKey("workspaces.id", ondelete="SET NULL"),
nullable=True
)
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
+3 -3
View File
@@ -2,13 +2,13 @@ from sqlalchemy import Column, DateTime, String, ForeignKey, Integer
from sqlalchemy.sql import func from sqlalchemy.sql import func
from .base import AutoID, Base from .base import AutoID, Base
class ProjectNode(Base, AutoID): class ProjectItem(Base, AutoID):
"""项目与文件夹的树状虚拟文件系统""" """项目与文件夹的树状虚拟文件系统"""
__tablename__ = "project_nodes" __tablename__ = "project_items"
workspace_id = Column(String(32), ForeignKey("workspaces.id", ondelete="CASCADE"), index=True) workspace_id = Column(String(32), ForeignKey("workspaces.id", ondelete="CASCADE"), index=True)
# 自引用外键:如果是根目录下的顶级节点,则 parent_id 为 Null # 自引用外键:如果是根目录下的顶级节点,则 parent_id 为 Null
parent_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), nullable=True, index=True) parent_id = Column(String(32), ForeignKey("project_items.id", ondelete="CASCADE"), nullable=True, index=True)
name = Column(String, nullable=False) name = Column(String, nullable=False)
# 节点类型:'folder' (文件夹) 或 'project' (代表具体文件的项目实体) # 节点类型:'folder' (文件夹) 或 'project' (代表具体文件的项目实体)