@@ -128,6 +128,10 @@ model ow_users {
128128 uploaded_assets ow_assets [] @relation (" AssetUploader " )
129129 banned_assets ow_assets [] @relation (" AssetBannedBy " )
130130 push_subscriptions ow_push_subscriptions [] @relation (" UserPushSubscriptions " )
131+ posts ow_posts [] @relation (" PostAuthor " )
132+ likes ow_posts_like [] @relation (" LikeAuthor " )
133+ bookmarks ow_posts_bookmark [] @relation (" BookmarkAuthor " )
134+ mentioned_in_posts ow_posts_mention [] @relation (" UserMentions " )
131135
132136 @@index ([email ] )
133137 @@index ([status ] )
@@ -775,6 +779,7 @@ model ow_assets {
775779 uploader ow_users ? @relation (" AssetUploader " , fields : [uploader_id ] , references : [id ] , onDelete : SetNull , onUpdate : SetNull )
776780 banned_by_user ow_users ? @relation (" AssetBannedBy " , fields : [banned_by ] , references : [id ] , onDelete : SetNull , onUpdate : SetNull )
777781 projects ow_projects_assets [] @relation (" AssetProjects " )
782+ post_media ow_posts_media []
778783
779784 @@index ([md5 ] )
780785 @@index ([uploader_id ] )
@@ -809,3 +814,132 @@ model ow_push_subscriptions {
809814 @@index ([last_used_at ] )
810815 @@map (" ow_push_subscriptions " )
811816}
817+
818+ // 推文类型枚举
819+ enum ow_post_type {
820+ normal
821+ reply
822+ retweet
823+ quote
824+ }
825+
826+ // 推文表 - Twitter-like posts (包含转推/引用/回复)
827+ model ow_posts {
828+ id Int @id @default (autoincrement () )
829+ author_id Int
830+ post_type ow_post_type @default (normal )
831+ content String ? @db.Text
832+ character_count Int @default (0 ) // 字符数(用于280字符限制检查)
833+ in_reply_to_id Int ? // 回复指向
834+ thread_root_id Int ? // 线程根推文
835+ quoted_post_id Int ? // 引用推文指向
836+ retweet_post_id Int ? // 转推指向
837+ reply_count Int @default (0 )
838+ retweet_count Int @default (0 )
839+ like_count Int @default (0 )
840+ bookmark_count Int @default (0 )
841+ is_deleted Boolean @default (false )
842+ embed Json ? // 嵌入资源 { type: 'project'|'list'|'user', id, ...其他参数 }
843+ created_at DateTime @default (now () ) @db.Timestamp (6 )
844+ updated_at DateTime @updatedAt @db.Timestamp (6 )
845+ metadata Json ? // 存储额外的元数据
846+
847+ // 关联
848+ author ow_users ? @relation (" PostAuthor " , fields : [author_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
849+ in_reply_to ow_posts ? @relation (" PostReplies " , fields : [in_reply_to_id ] , references : [id ] , onDelete : Restrict , onUpdate : Restrict )
850+ replies ow_posts [] @relation (" PostReplies " )
851+ thread_root ow_posts ? @relation (" PostThreads " , fields : [thread_root_id ] , references : [id ] , onDelete : Restrict , onUpdate : Restrict )
852+ thread_posts ow_posts [] @relation (" PostThreads " )
853+ quoted_post ow_posts ? @relation (" PostQuotes " , fields : [quoted_post_id ] , references : [id ] , onDelete : Restrict , onUpdate : Restrict )
854+ quoted_by ow_posts [] @relation (" PostQuotes " )
855+ retweet_post ow_posts ? @relation (" PostRetweets " , fields : [retweet_post_id ] , references : [id ] , onDelete : Restrict , onUpdate : Restrict )
856+ retweeted_by ow_posts [] @relation (" PostRetweets " )
857+ likes ow_posts_like []
858+ bookmarks ow_posts_bookmark []
859+ post_media ow_posts_media []
860+ mentions ow_posts_mention []
861+
862+ @@index ([author_id , created_at (sort : Desc ) ] )
863+ @@index ([created_at (sort : Desc ) ] )
864+ @@index ([in_reply_to_id ] )
865+ @@index ([thread_root_id ] )
866+ @@index ([quoted_post_id ] )
867+ @@index ([retweet_post_id ] )
868+ @@index ([post_type ] )
869+ @@index ([is_deleted ] )
870+ @@index ([is_deleted , created_at (sort : Desc ) ] )
871+ @@index ([thread_root_id , created_at (sort : Asc ) ] )
872+ @@map (" ow_posts " )
873+ }
874+
875+ // 提及用户关联表 - Mentions
876+ model ow_posts_mention {
877+ id Int @id @default (autoincrement () )
878+ post_id Int
879+ user_id Int
880+ created_at DateTime @default (now () ) @db.Timestamp (6 )
881+ notified Boolean @default (false )
882+
883+ // 关联
884+ post ow_posts @relation (fields : [post_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
885+ user ow_users @relation (" UserMentions " , fields : [user_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
886+
887+ @@unique ([post_id , user_id ] )
888+ @@index ([user_id , created_at (sort : Desc ) ] )
889+ @@index ([post_id ] )
890+ @@map (" ow_posts_mention " )
891+ }
892+
893+ // 点赞表 - Likes
894+ model ow_posts_like {
895+ id Int @id @default (autoincrement () )
896+ user_id Int
897+ post_id Int
898+ created_at DateTime @default (now () ) @db.Timestamp (6 )
899+
900+ // 关联
901+ user ow_users ? @relation (" LikeAuthor " , fields : [user_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
902+ post ow_posts @relation (fields : [post_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
903+
904+ @@unique ([user_id , post_id ] )
905+ @@index ([user_id , created_at (sort : Desc ) ] )
906+ @@index ([post_id ] )
907+ @@map (" ow_posts_like " )
908+ }
909+
910+ // 收藏表 - Bookmarks
911+ model ow_posts_bookmark {
912+ id Int @id @default (autoincrement () )
913+ user_id Int
914+ post_id Int
915+ created_at DateTime @default (now () ) @db.Timestamp (6 )
916+
917+ // 关联
918+ user ow_users ? @relation (" BookmarkAuthor " , fields : [user_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
919+ post ow_posts @relation (fields : [post_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
920+
921+ @@unique ([user_id , post_id ] )
922+ @@index ([user_id , created_at (sort : Desc ) ] )
923+ @@index ([post_id ] )
924+ @@map (" ow_posts_bookmark " )
925+ }
926+
927+ // 推文媒体关联表 - Post media
928+ model ow_posts_media {
929+ id Int @id @default (autoincrement () )
930+ post_id Int
931+ asset_id Int ?
932+ order Int @default (0 ) // 媒体顺序
933+ created_at DateTime @default (now () ) @db.Timestamp (6 )
934+
935+ // 关联
936+ post ow_posts @relation (fields : [post_id ] , references : [id ] , onDelete : Cascade , onUpdate : Cascade )
937+ asset ow_assets ? @relation (fields : [asset_id ] , references : [id ] , onDelete : SetNull , onUpdate : SetNull )
938+
939+ @@unique ([post_id , asset_id ] )
940+ @@unique ([post_id , order ] )
941+ @@index ([post_id ] )
942+ @@index ([asset_id ] )
943+ @@map (" ow_posts_media " )
944+ }
945+
0 commit comments