-- Conversations table for chat persistence CREATE TABLE IF NOT EXISTS conversations ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), project_id TEXT NOT NULL, title TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), last_message_at TIMESTAMPTZ ); -- Messages table for conversation history CREATE TABLE IF NOT EXISTS messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), conversation_id UUID NOT NULL REFERENCES conversations(id) ON DELETE CASCADE, role VARCHAR(20) NOT NULL, -- 'user', 'assistant', 'system' content TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Indexes for efficient querying CREATE INDEX IF NOT EXISTS idx_conversations_project ON conversations(project_id, last_message_at DESC NULLS LAST); CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id, created_at ASC); -- Update trigger for conversations.updated_at CREATE OR REPLACE FUNCTION update_conversations_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER conversations_updated_at BEFORE UPDATE ON conversations FOR EACH ROW EXECUTE FUNCTION update_conversations_updated_at(); -- Trigger to update last_message_at when a message is added CREATE OR REPLACE FUNCTION update_conversation_last_message() RETURNS TRIGGER AS $$ BEGIN UPDATE conversations SET last_message_at = NEW.created_at WHERE id = NEW.conversation_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER message_updates_conversation AFTER INSERT ON messages FOR EACH ROW EXECUTE FUNCTION update_conversation_last_message(); COMMENT ON TABLE conversations IS 'Chat conversations for project architect service'; COMMENT ON TABLE messages IS 'Messages within conversations';