This commit is contained in:
freedakgmail
2025-11-23 03:07:39 +08:00
parent 626d7dddde
commit e92884ae53
679 changed files with 208175 additions and 1183474 deletions
@@ -0,0 +1,156 @@
-- CreateEnum
CREATE TYPE "Role" AS ENUM ('OWNER', 'EDITOR', 'VIEWER');
-- CreateEnum
CREATE TYPE "Gender" AS ENUM ('MALE', 'FEMALE');
-- CreateEnum
CREATE TYPE "Action" AS ENUM ('CREATE', 'UPDATE', 'DELETE', 'IMPORT', 'EXPORT');
-- CreateEnum
CREATE TYPE "EntityType" AS ENUM ('MEMBER', 'PHOTO', 'STORY', 'SETTINGS');
-- CreateTable
CREATE TABLE "User" (
"id" TEXT NOT NULL,
"email" TEXT NOT NULL,
"name" TEXT,
"password" TEXT NOT NULL,
"avatar" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "FamilyTree" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"rootMemberId" TEXT,
"ownerId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "FamilyTree_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "TreeCollaborator" (
"id" TEXT NOT NULL,
"treeId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"role" "Role" NOT NULL DEFAULT 'VIEWER',
"invitedBy" TEXT NOT NULL,
"invitedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "TreeCollaborator_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "FamilyMember" (
"id" TEXT NOT NULL,
"treeId" TEXT NOT NULL,
"surname" TEXT NOT NULL,
"givenName" TEXT NOT NULL,
"fullName" TEXT NOT NULL,
"gender" "Gender" NOT NULL,
"generation" INTEGER NOT NULL,
"generationName" TEXT,
"courtesyName" TEXT,
"artName" TEXT,
"posthumousName" TEXT,
"rank" INTEGER,
"birthDate" TEXT,
"deathDate" TEXT,
"isLunarDate" BOOLEAN NOT NULL DEFAULT false,
"ancestralHome" TEXT,
"birthPlace" TEXT,
"burialPlace" TEXT,
"phone" TEXT,
"telephone" TEXT,
"email" TEXT,
"address" TEXT,
"fatherId" TEXT,
"motherId" TEXT,
"spouseIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
"childrenIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
"spouseFatherName" TEXT,
"spouseMotherName" TEXT,
"bio" TEXT,
"tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
"avatarUrl" TEXT,
"avatarImageId" TEXT,
"photoIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "FamilyMember_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "ActivityLog" (
"id" TEXT NOT NULL,
"treeId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"action" "Action" NOT NULL,
"entityType" "EntityType" NOT NULL,
"entityId" TEXT,
"entityName" TEXT,
"changes" JSONB,
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "ActivityLog_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-- CreateIndex
CREATE INDEX "FamilyTree_ownerId_idx" ON "FamilyTree"("ownerId");
-- CreateIndex
CREATE INDEX "TreeCollaborator_treeId_idx" ON "TreeCollaborator"("treeId");
-- CreateIndex
CREATE INDEX "TreeCollaborator_userId_idx" ON "TreeCollaborator"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "TreeCollaborator_treeId_userId_key" ON "TreeCollaborator"("treeId", "userId");
-- CreateIndex
CREATE INDEX "FamilyMember_treeId_idx" ON "FamilyMember"("treeId");
-- CreateIndex
CREATE INDEX "FamilyMember_fatherId_idx" ON "FamilyMember"("fatherId");
-- CreateIndex
CREATE INDEX "FamilyMember_motherId_idx" ON "FamilyMember"("motherId");
-- CreateIndex
CREATE INDEX "ActivityLog_treeId_idx" ON "ActivityLog"("treeId");
-- CreateIndex
CREATE INDEX "ActivityLog_userId_idx" ON "ActivityLog"("userId");
-- CreateIndex
CREATE INDEX "ActivityLog_timestamp_idx" ON "ActivityLog"("timestamp");
-- AddForeignKey
ALTER TABLE "FamilyTree" ADD CONSTRAINT "FamilyTree_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "TreeCollaborator" ADD CONSTRAINT "TreeCollaborator_treeId_fkey" FOREIGN KEY ("treeId") REFERENCES "FamilyTree"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "TreeCollaborator" ADD CONSTRAINT "TreeCollaborator_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "FamilyMember" ADD CONSTRAINT "FamilyMember_treeId_fkey" FOREIGN KEY ("treeId") REFERENCES "FamilyTree"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ActivityLog" ADD CONSTRAINT "ActivityLog_treeId_fkey" FOREIGN KEY ("treeId") REFERENCES "FamilyTree"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "ActivityLog" ADD CONSTRAINT "ActivityLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+3
View File
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"
+164 -2
View File
@@ -5,10 +5,172 @@
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client"
output = "../lib/generated/prisma"
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// 用户表
model User {
id String @id @default(cuid())
email String @unique
name String?
password String
avatar String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// 关系
ownedTrees FamilyTree[] @relation("TreeOwner")
collaborations TreeCollaborator[]
activityLogs ActivityLog[]
}
// 家族树表
model FamilyTree {
id String @id @default(cuid())
name String
description String?
rootMemberId String?
ownerId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// 关系
owner User @relation("TreeOwner", fields: [ownerId], references: [id], onDelete: Cascade)
members FamilyMember[]
collaborators TreeCollaborator[]
activityLogs ActivityLog[]
@@index([ownerId])
}
// 协作者表
model TreeCollaborator {
id String @id @default(cuid())
treeId String
userId String
role Role @default(VIEWER)
invitedBy String
invitedAt DateTime @default(now())
// 关系
tree FamilyTree @relation(fields: [treeId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([treeId, userId])
@@index([treeId])
@@index([userId])
}
enum Role {
OWNER
EDITOR
VIEWER
}
// 家族成员表
model FamilyMember {
id String @id @default(cuid())
treeId String
// 基本信息
surname String
givenName String
fullName String
gender Gender
generation Int
generationName String?
courtesyName String?
artName String?
posthumousName String?
rank Int?
// 日期
birthDate String?
deathDate String?
isLunarDate Boolean @default(false)
// 地点
ancestralHome String?
birthPlace String?
burialPlace String?
// 联系方式
phone String?
telephone String?
email String?
address String?
// 关系
fatherId String?
motherId String?
spouseIds String[] @default([])
childrenIds String[] @default([])
// 配偶父母信息
spouseFatherName String?
spouseMotherName String?
// 内容
bio String?
tags String[] @default([])
avatarUrl String?
avatarImageId String?
photoIds String[] @default([])
// 元数据
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// 关系
tree FamilyTree @relation(fields: [treeId], references: [id], onDelete: Cascade)
@@index([treeId])
@@index([fatherId])
@@index([motherId])
}
enum Gender {
MALE
FEMALE
}
// 操作日志表
model ActivityLog {
id String @id @default(cuid())
treeId String
userId String
action Action
entityType EntityType
entityId String?
entityName String?
changes Json?
timestamp DateTime @default(now())
// 关系
tree FamilyTree @relation(fields: [treeId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([treeId])
@@index([userId])
@@index([timestamp])
}
enum Action {
CREATE
UPDATE
DELETE
IMPORT
EXPORT
}
enum EntityType {
MEMBER
PHOTO
STORY
SETTINGS
}
+1450
View File
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true
},
"include": ["seed.ts"]
}