0.0.1.0
This commit is contained in:
@@ -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;
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["seed.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user