-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschema.zmodel
132 lines (111 loc) · 3.95 KB
/
schema.zmodel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
// NOTE: When using mysql or sqlserver, uncomment the @db.Text annotations in model Account below
// Further reading:
// https://next-auth.js.org/adapters/prisma#create-the-prisma-schema
// https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#string
url = env("DATABASE_URL")
}
// Necessary for tanstack-query
plugin hooks {
provider = '@zenstackhq/tanstack-query'
target = 'react'
version = 'v5'
output = "./src/lib/hooks"
}
// Necessary for trpc
plugin trpc {
provider = '@zenstackhq/trpc'
output = './src/server/api/routers/generated'
}
// Necessary for Next auth
model Account {
id String @id @default(cuid())
userId String
type String
provider String
providerAccountId String
refresh_token String? // @db.Text
access_token String? // @db.Text
expires_at Int?
token_type String?
scope String?
id_token String? // @db.Text
session_state String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
refresh_token_expires_in Int?
@@unique([provider, providerAccountId])
}
model Session {
id String @id @default(cuid())
sessionToken String @unique
userId String
expires DateTime
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
emailVerified DateTime?
password String? @password @omit
image String?
accounts Account[]
sessions Session[]
chats Chat[]
// everyone can signup, and user profile is also publicly readable
@@allow("create,read", true)
// only the user can update or delete their own profile
@@allow("update,delete", auth() == this)
}
model VerificationToken {
identifier String
token String @unique
expires DateTime
@@unique([identifier, token])
}
// Visibility is a enum that can be either public or private.
// related to the Chat model.
enum Visibility {
PUBLIC @map("public") // 映射到数据库中的public
PRIVATE @map("private") // 映射到数据库中的private
}
// A chat is a collection of messages
model Chat {
id String @id @default(cuid())
title String
visibility Visibility @default(PRIVATE)
userId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
messages Message[]
@@allow('create', auth() != null) // Only authenticated users can create a chat
@@allow('update,delete', auth() == user)
@@allow('read', auth() == user || (visibility == 'public' && auth() != null))
}
// Role is a enum that can be either user, assistant, or tool.
// related to the Message model.
enum Role {
USER @map("user")
ASSISTANT @map("assistant")
TOOL @map("tool")
}
// A message is a single message in a chat
model Message {
id String @id @default(cuid())
chatId String
role Role
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
@@allow('create', auth() == chat.user) // The chat author can create messages
@@allow('update,delete', auth() == chat.user) // The chat author can update or delete their own messages
@@allow('read', auth() == chat.user || (chat.visibility == 'public' && auth() != null)) // The chat author or public chats can be read
}