File size: 2,974 Bytes
a57a50a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
-- ChatKit Migration: Create threads table and update messages table
--
-- [From]: specs/010-chatkit-migration/data-model.md - Database Schema Migration
-- [Task]: T006
--
-- This migration:
-- 1. Creates the threads table for ChatKit conversation management
-- 2. Adds thread_id column to messages table
-- 3. Migrates existing conversation_id data to thread_id
-- 4. Creates indexes for query optimization
--
-- IMPORTANT: Run this migration after deploying the Thread model
--
-- To run: psql $DATABASE_URL < migrations/migrate_threads.sql

-- BEGIN;

-- 1. Create threads table
CREATE TABLE IF NOT EXISTS threads (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    title VARCHAR(255),
    metadata JSONB,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- 2. Create indexes for threads table
CREATE INDEX IF NOT EXISTS idx_thread_user_id ON threads(user_id);
CREATE INDEX IF NOT EXISTS idx_thread_updated_at ON threads(user_id, updated_at DESC);

-- 3. Add thread_id column to messages table (nullable initially)
ALTER TABLE message ADD COLUMN IF NOT EXISTS thread_id UUID REFERENCES threads(id) ON DELETE CASCADE;

-- 4. Create index for thread_id in messages table
CREATE INDEX IF NOT EXISTS idx_message_thread_id ON message(thread_id, created_at ASC);

-- 5. Migrate existing conversation data to threads
-- This creates a thread for each unique conversation and links messages to it
-- Skip this step if starting fresh (no existing conversations)
INSERT INTO threads (id, user_id, created_at, updated_at)
SELECT DISTINCT
    c.id as id,           -- Use same ID as conversation for easy mapping
    c.user_id,
    c.created_at,
    c.updated_at
FROM conversation c
WHERE NOT EXISTS (SELECT 1 FROM threads t WHERE t.id = c.id);

-- 6. Update messages to point to the new thread_id
-- This maps existing messages to their corresponding threads
UPDATE message m
SET thread_id = m.conversation_id
WHERE m.conversation_id IS NOT NULL
  AND m.thread_id IS NULL;

-- 7. After migration, make thread_id NOT NULL (only after validating data)
-- Uncomment these lines after verifying successful migration:
-- ALTER TABLE message ALTER COLUMN thread_id SET NOT NULL;
-- ALTER TABLE message ADD CONSTRAINT message_thread_id_fkey FOREIGN KEY (thread_id) REFERENCES threads(id) ON DELETE CASCADE;

-- Optional: Drop old conversation_id column after full migration
-- Uncomment ONLY after confirming ChatKit is working correctly:
-- ALTER TABLE message DROP COLUMN IF EXISTS conversation_id;
-- DROP INDEX IF EXISTS idx_message_conversation_created;

-- COMMIT;

-- Rollback commands (if needed):
-- BEGIN;
-- ALTER TABLE message DROP COLUMN IF EXISTS thread_id;
-- DROP INDEX IF EXISTS idx_message_thread_id;
-- DROP INDEX IF EXISTS idx_thread_user_id;
-- DROP INDEX IF EXISTS idx_thread_updated_at;
-- DROP TABLE IF EXISTS threads;
-- COMMIT;