Files
moreminimore-vibe/src/db/schema.ts
2025-05-12 21:51:08 -07:00

121 lines
3.6 KiB
TypeScript

import { sql } from "drizzle-orm";
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
import { relations } from "drizzle-orm";
export const apps = sqliteTable("apps", {
id: integer("id").primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
path: text("path").notNull(),
createdAt: integer("created_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
updatedAt: integer("updated_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
githubOrg: text("github_org"),
githubRepo: text("github_repo"),
supabaseProjectId: text("supabase_project_id"),
});
export const chats = sqliteTable("chats", {
id: integer("id").primaryKey({ autoIncrement: true }),
appId: integer("app_id")
.notNull()
.references(() => apps.id, { onDelete: "cascade" }),
title: text("title"),
initialCommitHash: text("initial_commit_hash"),
createdAt: integer("created_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
});
export const messages = sqliteTable("messages", {
id: integer("id").primaryKey({ autoIncrement: true }),
chatId: integer("chat_id")
.notNull()
.references(() => chats.id, { onDelete: "cascade" }),
role: text("role", { enum: ["user", "assistant"] }).notNull(),
content: text("content").notNull(),
approvalState: text("approval_state", {
enum: ["approved", "rejected"],
}),
commitHash: text("commit_hash"),
createdAt: integer("created_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
});
// Define relations
export const appsRelations = relations(apps, ({ many }) => ({
chats: many(chats),
}));
export const chatsRelations = relations(chats, ({ many, one }) => ({
messages: many(messages),
app: one(apps, {
fields: [chats.appId],
references: [apps.id],
}),
}));
export const messagesRelations = relations(messages, ({ one }) => ({
chat: one(chats, {
fields: [messages.chatId],
references: [chats.id],
}),
}));
export const language_model_providers = sqliteTable(
"language_model_providers",
{
id: text("id").primaryKey(),
name: text("name").notNull(),
api_base_url: text("api_base_url").notNull(),
env_var_name: text("env_var_name"),
createdAt: integer("created_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
updatedAt: integer("updated_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
},
);
export const language_models = sqliteTable("language_models", {
id: integer("id").primaryKey({ autoIncrement: true }),
displayName: text("display_name").notNull(),
apiName: text("api_name").notNull(),
builtinProviderId: text("builtin_provider_id"),
customProviderId: text("custom_provider_id").references(
() => language_model_providers.id,
{ onDelete: "cascade" },
),
description: text("description"),
max_output_tokens: integer("max_output_tokens"),
context_window: integer("context_window"),
createdAt: integer("created_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
updatedAt: integer("updated_at", { mode: "timestamp" })
.notNull()
.default(sql`(unixepoch())`),
});
// Define relations for new tables
export const languageModelProvidersRelations = relations(
language_model_providers,
({ many }) => ({
languageModels: many(language_models),
}),
);
export const languageModelsRelations = relations(
language_models,
({ one }) => ({
provider: one(language_model_providers, {
fields: [language_models.customProviderId],
references: [language_model_providers.id],
}),
}),
);