import type { InferSelectModel } from 'drizzle-orm'; import { pgTable, varchar, timestamp, json, uuid, text, primaryKey, foreignKey, boolean, } from 'drizzle-orm/pg-core'; import { blockKinds } from '../blocks/server'; 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; export const message = 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 Message = InferSelectModel; export const vote = pgTable( 'Vote', { 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: blockKinds }).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;