-- AI Service Database Initialization Script -- Version: 0.2.0 -- Description: Creates all required tables for AI Service with multi-tenant support -- -- Usage: -- psql -U postgres -f scripts/init_db.sql -- Or connect to ai_service database and run this script -- ============================================ -- Chat Sessions Table -- ============================================ CREATE TABLE IF NOT EXISTS chat_sessions ( id UUID NOT NULL PRIMARY KEY, tenant_id VARCHAR NOT NULL, session_id VARCHAR NOT NULL, channel_type VARCHAR, metadata JSON, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- Chat Messages Table -- ============================================ CREATE TABLE IF NOT EXISTS chat_messages ( id UUID NOT NULL PRIMARY KEY, tenant_id VARCHAR NOT NULL, session_id VARCHAR NOT NULL, role VARCHAR NOT NULL, content TEXT NOT NULL, prompt_tokens INTEGER, completion_tokens INTEGER, total_tokens INTEGER, latency_ms INTEGER, first_token_ms INTEGER, is_error BOOLEAN NOT NULL DEFAULT FALSE, error_message VARCHAR, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- Knowledge Bases Table -- ============================================ CREATE TABLE IF NOT EXISTS knowledge_bases ( id UUID NOT NULL PRIMARY KEY, tenant_id VARCHAR NOT NULL, name VARCHAR NOT NULL, description VARCHAR, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- Documents Table -- ============================================ CREATE TABLE IF NOT EXISTS documents ( id UUID NOT NULL PRIMARY KEY, tenant_id VARCHAR NOT NULL, kb_id VARCHAR NOT NULL, file_name VARCHAR NOT NULL, file_path VARCHAR, file_size INTEGER, file_type VARCHAR, status VARCHAR NOT NULL DEFAULT 'pending', error_msg VARCHAR, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- Index Jobs Table -- ============================================ CREATE TABLE IF NOT EXISTS index_jobs ( id UUID NOT NULL PRIMARY KEY, tenant_id VARCHAR NOT NULL, doc_id UUID NOT NULL, status VARCHAR NOT NULL DEFAULT 'pending', progress INTEGER NOT NULL DEFAULT 0, error_msg VARCHAR, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- API Keys Table [AC-AISVC-50] -- ============================================ CREATE TABLE IF NOT EXISTS api_keys ( id UUID NOT NULL PRIMARY KEY, key VARCHAR NOT NULL UNIQUE, name VARCHAR NOT NULL, is_active BOOLEAN NOT NULL DEFAULT TRUE, created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL ); -- ============================================ -- Indexes -- ============================================ -- Chat Sessions Indexes CREATE INDEX IF NOT EXISTS ix_chat_sessions_tenant_id ON chat_sessions (tenant_id); CREATE UNIQUE INDEX IF NOT EXISTS ix_chat_sessions_tenant_session ON chat_sessions (tenant_id, session_id); -- Chat Messages Indexes CREATE INDEX IF NOT EXISTS ix_chat_messages_tenant_id ON chat_messages (tenant_id); CREATE INDEX IF NOT EXISTS ix_chat_messages_tenant_session ON chat_messages (tenant_id, session_id); CREATE INDEX IF NOT EXISTS ix_chat_messages_tenant_session_created ON chat_messages (tenant_id, session_id, created_at); -- Knowledge Bases Indexes CREATE INDEX IF NOT EXISTS ix_knowledge_bases_tenant_id ON knowledge_bases (tenant_id); -- Documents Indexes CREATE INDEX IF NOT EXISTS ix_documents_tenant_id ON documents (tenant_id); CREATE INDEX IF NOT EXISTS ix_documents_tenant_kb ON documents (tenant_id, kb_id); CREATE INDEX IF NOT EXISTS ix_documents_tenant_status ON documents (tenant_id, status); -- Index Jobs Indexes CREATE INDEX IF NOT EXISTS ix_index_jobs_tenant_id ON index_jobs (tenant_id); CREATE INDEX IF NOT EXISTS ix_index_jobs_tenant_doc ON index_jobs (tenant_id, doc_id); CREATE INDEX IF NOT EXISTS ix_index_jobs_tenant_status ON index_jobs (tenant_id, status); -- API Keys Indexes [AC-AISVC-50] CREATE INDEX IF NOT EXISTS ix_api_keys_key ON api_keys (key); CREATE INDEX IF NOT EXISTS ix_api_keys_is_active ON api_keys (is_active); -- ============================================ -- Verification -- ============================================ -- Run this to verify all tables are created: -- SELECT tablename FROM pg_tables WHERE schemaname = 'public' ORDER BY tablename;