@ragrabbit/mcp

by madarco
Verified
import { relations } from "drizzle-orm/relations"; import { pgEnum, pgTable, text, timestamp, integer, primaryKey, uuid, jsonb, varchar } from "drizzle-orm/pg-core"; import { InferSelectModel, InferInsertModel } from "drizzle-orm"; import { organizationsTable } from "./auth"; import { unique } from "drizzle-orm/pg-core"; import { uniqueIndex } from "drizzle-orm/pg-core"; // Enum for message roles export const messageRoleEnum = pgEnum("message_role", ["system", "user", "assistant", "data"]); // Table for storing chats export const chatsTable = pgTable( "chats", { id: uuid("id").defaultRandom().primaryKey(), chatId: varchar("chat_id").notNull(), userId: varchar("user_id").notNull(), organizationId: integer("organization_id") .notNull() .references(() => organizationsTable.id, { onDelete: "cascade" }), title: text("title"), ip: text("ip"), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at"), }, (table) => [uniqueIndex("chat_user_id").on(table.userId, table.chatId)] ); export type Chat = InferSelectModel<typeof chatsTable>; export type NewChat = InferInsertModel<typeof chatsTable>; // Table for storing messages within chats export const messagesTable = pgTable("messages", { id: uuid("id").defaultRandom().primaryKey(), chatId: uuid("chat_id") .notNull() .references(() => chatsTable.id, { onDelete: "cascade" }), role: messageRoleEnum("role").notNull(), content: text("content").notNull(), reasoning: text("reasoning"), data: jsonb("data"), annotations: jsonb("annotations").$type<any[]>(), toolInvocations: jsonb("tool_invocations").$type< { state: "partial-call" | "call" | "result"; id: string; name: string; args?: any; result?: any; }[] >(), experimental_attachments: jsonb("experimental_attachments").$type< { name?: string; contentType?: string; url: string; }[] >(), tokenCount: integer("token_count").notNull().default(0), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at"), }); export type Message = InferSelectModel<typeof messagesTable>; export type NewMessage = InferInsertModel<typeof messagesTable>; // Relations export const chatRelations = relations(chatsTable, ({ many }) => ({ messages: many(messagesTable), })); export const messageRelations = relations(messagesTable, ({ one }) => ({ chat: one(chatsTable, { fields: [messagesTable.chatId], references: [chatsTable.id], }), }));