Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7a401fa904 | |||
| 8ea64de612 |
@@ -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",
|
||||||
|
|||||||
@@ -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())
|
||||||
@@ -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' (代表具体文件的项目实体)
|
||||||
|
|||||||
Reference in New Issue
Block a user