// Example model schema from the Drizzle docs // https://orm.drizzle.team/docs/sql-schema-declaration import { relations, sql } from "drizzle-orm"; import { index, pgEnum, pgSchema, pgTableCreator, uniqueIndex } from "drizzle-orm/pg-core"; /** * This is an example of how to use the multi-project schema feature of Drizzle ORM. Use the same * database instance for multiple projects. * * @see https://orm.drizzle.team/docs/goodies#multi-project-schema */ export const createTable = pgTableCreator((name) => `gregorlohaus.com_${name}`); export const layoutPositionEnum = pgEnum('layout_position',['sidebar','header','col1','col2']) export const cvCategory = createTable( "cv_category", (d) => ({ id: d.uuid().primaryKey(), name: d.varchar({length: 50}), layoutPosition: layoutPositionEnum() }), (t) => [index("name_idx").on(t.name)], ) export const cvCategoryRelations = relations(cvCategory,({many}) => ({ cvEntry: many(cvEntry) })) export const cvEntry = createTable( "cv_entry", (d) => ({ id: d.uuid().primaryKey().notNull(), categoryId: d.uuid('category_id'), fromTime: d.timestamp().notNull().$type(), toTime: d.timestamp().notNull().$type(), title: d.varchar({length:50}).notNull(), description: d.text(), hideDates: d.boolean(), createdAt: d .timestamp({ withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull().$type(), updatedAt: d.timestamp({ withTimezone: true }).$onUpdate(() => new Date()).$type(), }) ) export const cvEntryRelations = relations(cvEntry, ({one}) => ({ category: one(cvCategory, { fields: [cvEntry.categoryId], references: [cvCategory.id] }), })); export const sourceTypeEnum = pgEnum('source_type',['open','closed']) export const releaseStatus = pgEnum('release_status',['released','unreleased']) export const stackItemEnum = pgEnum('stack_item',['drizzle','postgres','nextjs','react','servercomponents','php','laravel','reactnative','expo','mysql','nginx','protobuf','grpc','java','graalvm','spring','aws','s3','react-native','linux','debian','htmx','neon']) export const project = createTable( "project", (d) => ({ id: d.uuid().primaryKey().notNull(), title: d.varchar({length: 50}).notNull(), description: d.text(), sourceType: sourceTypeEnum(), sourceLink: d.varchar({length: 200}), releaseStatus: releaseStatus(), releaseLink: d.varchar({length: 200}), stackId: d.uuid(), }) ) export const projectRelations = relations(project, ({one}) => ({ techStack: one(techStack, { fields: [project.stackId], references: [techStack.id], }) })) export const techStack = createTable( "tech_stack", (d) => ({ id: d.uuid().primaryKey().notNull(), stackItems: stackItemEnum().array() }) ) export const music = createTable( "music", (d) => ({ id: d.uuid().primaryKey().notNull(), title: d.varchar({ length: 100 }).notNull(), description: d.text(), fileUrl: d.varchar("file_url", { length: 500 }).notNull(), fileKey: d.varchar("file_key", { length: 200 }).notNull(), fileName: d.varchar("file_name", { length: 200 }).notNull(), createdAt: d .timestamp({ withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull() .$type(), updatedAt: d.timestamp({ withTimezone: true }).$onUpdate(() => new Date()).$type(), }) ) export const blogPost = createTable( "blog_post", (d) => ({ id: d.uuid().primaryKey().defaultRandom(), slug: d.varchar({ length: 200 }).notNull(), title: d.varchar({ length: 200 }).notNull(), date: d.varchar({ length: 20 }), description: d.text(), tags: d.text().array(), fileKey: d.varchar("file_key", { length: 200 }).notNull(), fileUrl: d.varchar("file_url", { length: 500 }).notNull(), fileName: d.varchar("file_name", { length: 255 }).notNull(), customId: d.varchar("custom_id", { length: 255 }).notNull(), createdAt: d .timestamp({ withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull() .$type(), updatedAt: d.timestamp({ withTimezone: true }).$onUpdate(() => new Date()).$type(), }), (t) => [ uniqueIndex("blog_post_slug_idx").on(t.slug), uniqueIndex("blog_post_file_key_idx").on(t.fileKey), uniqueIndex("blog_post_custom_id_idx").on(t.customId), ], ) export const messageRoleEnum = pgEnum('message_role', ['user', 'assistant']) export const chatSession = createTable( "chat_session", (d) => ({ id: d.uuid().primaryKey().defaultRandom(), userId: d.varchar({ length: 255 }).notNull(), createdAt: d.timestamp({ withTimezone: true }).default(sql`CURRENT_TIMESTAMP`).notNull().$type(), updatedAt: d.timestamp({ withTimezone: true }).$onUpdate(() => new Date()).$type(), }) ) export const chatSessionRelations = relations(chatSession, ({ many }) => ({ messages: many(chatMessage), })) export const chatMessage = createTable( "chat_message", (d) => ({ id: d.uuid().primaryKey().defaultRandom(), sessionId: d.uuid('session_id').notNull(), role: messageRoleEnum().notNull(), content: d.text().notNull(), createdAt: d.timestamp({ withTimezone: true }).default(sql`CURRENT_TIMESTAMP`).notNull().$type(), }) ) export const chatMessageRelations = relations(chatMessage, ({ one }) => ({ session: one(chatSession, { fields: [chatMessage.sessionId], references: [chatSession.id], }), })) export const systemSettings = createTable( "systemSetting", (d) => ({ systemPropmt: d.text() }) )