import type { InferSelectModel } from 'drizzle-orm'; import { pgTable, varchar, timestamp, json, uuid, text, primaryKey, foreignKey, boolean, } from 'drizzle-orm/pg-core'; export const user = pgTable('User', { id: uuid('id').primaryKey().notNull().defaultRandom(), email: varchar('email', { length: 64 }).notNull(), password: varchar('password', { length: 64 }), }); export type User = InferSelectModel; export const chat = pgTable('Chat', { id: uuid('id').primaryKey().notNull().defaultRandom(), createdAt: timestamp('createdAt').notNull(), title: text('title').notNull(), userId: uuid('userId') .notNull() .references(() => user.id), visibility: varchar('visibility', { enum: ['public', 'private'] }) .notNull() .default('private'), }); export type Chat = InferSelectModel; // DEPRECATED: The following schema is deprecated and will be removed in the future. // Read the migration guide at https://chat-sdk.dev/docs/migration-guides/message-parts export const messageDeprecated = pgTable('Message', { id: uuid('id').primaryKey().notNull().defaultRandom(), chatId: uuid('chatId') .notNull() .references(() => chat.id), role: varchar('role').notNull(), content: json('content').notNull(), createdAt: timestamp('createdAt').notNull(), }); export type MessageDeprecated = InferSelectModel; export const message = pgTable('Message_v2', { id: uuid('id').primaryKey().notNull().defaultRandom(), chatId: uuid('chatId') .notNull() .references(() => chat.id), role: varchar('role').notNull(), parts: json('parts').notNull(), attachments: json('attachments').notNull(), createdAt: timestamp('createdAt').notNull(), }); export type DBMessage = InferSelectModel; // DEPRECATED: The following schema is deprecated and will be removed in the future. // Read the migration guide at https://chat-sdk.dev/docs/migration-guides/message-parts export const voteDeprecated = pgTable( 'Vote', { chatId: uuid('chatId') .notNull() .references(() => chat.id), messageId: uuid('messageId') .notNull() .references(() => messageDeprecated.id), isUpvoted: boolean('isUpvoted').notNull(), }, (table) => { return { pk: primaryKey({ columns: [table.chatId, table.messageId] }), }; }, ); export type VoteDeprecated = InferSelectModel; export const vote = pgTable( 'Vote_v2', { chatId: uuid('chatId') .notNull() .references(() => chat.id), messageId: uuid('messageId') .notNull() .references(() => message.id), isUpvoted: boolean('isUpvoted').notNull(), }, (table) => { return { pk: primaryKey({ columns: [table.chatId, table.messageId] }), }; }, ); export type Vote = InferSelectModel; export const document = pgTable( 'Document', { id: uuid('id').notNull().defaultRandom(), createdAt: timestamp('createdAt').notNull(), title: text('title').notNull(), content: text('content'), kind: varchar('text', { enum: ['text', 'code', 'image', 'sheet'] }) .notNull() .default('text'), userId: uuid('userId') .notNull() .references(() => user.id), }, (table) => { return { pk: primaryKey({ columns: [table.id, table.createdAt] }), }; }, ); export type Document = InferSelectModel; export const suggestion = pgTable( 'Suggestion', { id: uuid('id').notNull().defaultRandom(), documentId: uuid('documentId').notNull(), documentCreatedAt: timestamp('documentCreatedAt').notNull(), originalText: text('originalText').notNull(), suggestedText: text('suggestedText').notNull(), description: text('description'), isResolved: boolean('isResolved').notNull().default(false), userId: uuid('userId') .notNull() .references(() => user.id), createdAt: timestamp('createdAt').notNull(), }, (table) => ({ pk: primaryKey({ columns: [table.id] }), documentRef: foreignKey({ columns: [table.documentId, table.documentCreatedAt], foreignColumns: [document.id, document.createdAt], }), }), ); export type Suggestion = InferSelectModel; export const stream = pgTable( 'Stream', { id: uuid('id').notNull().defaultRandom(), chatId: uuid('chatId').notNull(), createdAt: timestamp('createdAt').notNull(), }, (table) => ({ pk: primaryKey({ columns: [table.id] }), chatRef: foreignKey({ columns: [table.chatId], foreignColumns: [chat.id], }), }), ); export type Stream = InferSelectModel;