From c5cfd855ba7a025f2dd63792b41421e53a8c5c35 Mon Sep 17 00:00:00 2001 From: BOHA Date: Mon, 8 Jun 2026 19:14:01 +0200 Subject: [PATCH] feat(odin): ai_conversations table + conversation_id on messages --- .../migration.sql | 32 +++++++++++++++++++ prisma/schema.prisma | 25 +++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 prisma/migrations/20260608140000_add_ai_conversations/migration.sql diff --git a/prisma/migrations/20260608140000_add_ai_conversations/migration.sql b/prisma/migrations/20260608140000_add_ai_conversations/migration.sql new file mode 100644 index 0000000..4092487 --- /dev/null +++ b/prisma/migrations/20260608140000_add_ai_conversations/migration.sql @@ -0,0 +1,32 @@ +-- Multi-conversation Odin: conversations table + conversation_id on messages. + +CREATE TABLE `ai_conversations` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `user_id` INTEGER NOT NULL, + `title` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + `updated_at` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + PRIMARY KEY (`id`), + INDEX `idx_ai_conv_user` (`user_id`, `id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +ALTER TABLE `ai_chat_messages` + ADD COLUMN `conversation_id` INTEGER NULL AFTER `user_id`; + +-- Backfill: one conversation per user who has messages ("keep as first conversation"). +INSERT INTO `ai_conversations` (`user_id`, `title`, `created_at`, `updated_at`) +SELECT `user_id`, 'Konverzace', NOW(), NOW() +FROM `ai_chat_messages` +GROUP BY `user_id`; + +UPDATE `ai_chat_messages` m +JOIN `ai_conversations` c ON c.`user_id` = m.`user_id` +SET m.`conversation_id` = c.`id`; + +-- Enforce: drop old per-user index, NOT NULL, FK (cascade), per-conversation index. +ALTER TABLE `ai_chat_messages` + DROP INDEX `idx_ai_chat_user`, + MODIFY `conversation_id` INTEGER NOT NULL, + ADD CONSTRAINT `fk_ai_chat_conv` FOREIGN KEY (`conversation_id`) + REFERENCES `ai_conversations`(`id`) ON DELETE CASCADE, + ADD INDEX `idx_ai_chat_conv` (`conversation_id`, `id`); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 38f10f7..7128579 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -89,14 +89,27 @@ model ai_usage { @@index([created_at], map: "idx_ai_usage_created") } -model ai_chat_messages { - id Int @id @default(autoincrement()) +model ai_conversations { + id Int @id @default(autoincrement()) user_id Int - role String @db.VarChar(20) - content String @db.Text - created_at DateTime @default(now()) @db.Timestamp(0) + title String @db.VarChar(255) + created_at DateTime @default(now()) @db.Timestamp(0) + updated_at DateTime @default(now()) @updatedAt @db.Timestamp(0) + messages ai_chat_messages[] - @@index([user_id, id], map: "idx_ai_chat_user") + @@index([user_id, id], map: "idx_ai_conv_user") +} + +model ai_chat_messages { + id Int @id @default(autoincrement()) + user_id Int + conversation_id Int + role String @db.VarChar(20) + content String @db.Text + created_at DateTime @default(now()) @db.Timestamp(0) + conversation ai_conversations @relation(fields: [conversation_id], references: [id], onDelete: Cascade) + + @@index([conversation_id, id], map: "idx_ai_chat_conv") } model bank_accounts {