kai-api-gateway / supabase_setup.sql
KiWA001's picture
fix: use lowercase table names for PostgreSQL compatibility
ba9d716
-- ============================================
-- K-AI API Gateway - Complete Supabase SQL Setup
-- ============================================
-- This script handles both creating tables with kaiapi_ prefix
-- and migrating data from old tables (if they exist)
-- ============================================
-- STEP 1: Rename existing tables to add kaiapi_ prefix
-- ============================================
-- Rename api_keys table if it exists
DO $$
BEGIN
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'api_keys') THEN
ALTER TABLE api_keys RENAME TO kaiapi_api_keys;
RAISE NOTICE 'Renamed api_keys to kaiapi_api_keys';
END IF;
END $$;
-- Rename model_stats table if it exists
DO $$
BEGIN
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'model_stats') THEN
ALTER TABLE model_stats RENAME TO kaiapi_model_stats;
RAISE NOTICE 'Renamed model_stats to kaiapi_model_stats';
END IF;
END $$;
-- Rename provider_sessions table if it exists
DO $$
BEGIN
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'provider_sessions') THEN
ALTER TABLE provider_sessions RENAME TO kaiapi_provider_sessions;
RAISE NOTICE 'Renamed provider_sessions to kaiapi_provider_sessions';
END IF;
END $$;
-- Rename provider_states table if it exists (for consistency)
DO $$
BEGIN
IF EXISTS (SELECT FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name = 'provider_states') THEN
ALTER TABLE provider_states RENAME TO kaiapi_provider_states;
RAISE NOTICE 'Renamed provider_states to kaiapi_provider_states';
END IF;
END $$;
-- ============================================
-- STEP 2: Create kaiapi_api_keys table (if not exists)
-- ============================================
CREATE TABLE IF NOT EXISTS kaiapi_api_keys (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
token VARCHAR(255) UNIQUE NOT NULL,
usage_tokens INTEGER NOT NULL DEFAULT 0,
limit_tokens INTEGER NOT NULL DEFAULT 1000000,
is_active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_kaiapi_api_keys_token ON kaiapi_api_keys(token);
CREATE INDEX IF NOT EXISTS idx_kaiapi_api_keys_is_active ON kaiapi_api_keys(is_active);
-- ============================================
-- STEP 3: Create kaiapi_model_stats table (if not exists)
-- ============================================
CREATE TABLE IF NOT EXISTS kaiapi_model_stats (
id VARCHAR(255) PRIMARY KEY,
success INTEGER NOT NULL DEFAULT 0,
failure INTEGER NOT NULL DEFAULT 0,
consecutive_failures INTEGER NOT NULL DEFAULT 0,
avg_time_ms FLOAT NOT NULL DEFAULT 0,
total_time_ms FLOAT NOT NULL DEFAULT 0,
count_samples INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_kaiapi_model_stats_id ON kaiapi_model_stats(id);
-- ============================================
-- STEP 4: Create kaiapi_provider_sessions table (if not exists)
-- ============================================
CREATE TABLE IF NOT EXISTS kaiapi_provider_sessions (
id SERIAL PRIMARY KEY,
provider VARCHAR(50) UNIQUE NOT NULL,
cookies JSONB,
session_data JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_sessions_provider ON kaiapi_provider_sessions(provider);
-- ============================================
-- STEP 5: Create kaiapi_provider_states table (NEW - for toggle management)
-- ============================================
CREATE TABLE IF NOT EXISTS kaiapi_provider_states (
id SERIAL PRIMARY KEY,
provider_id VARCHAR(50) UNIQUE NOT NULL,
name VARCHAR(100) NOT NULL,
type VARCHAR(20) NOT NULL DEFAULT 'api',
enabled BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_states_provider_id ON kaiapi_provider_states(provider_id);
CREATE INDEX IF NOT EXISTS idx_kaiapi_provider_states_enabled ON kaiapi_provider_states(enabled);
-- Insert default providers (if table is empty)
INSERT INTO kaiapi_provider_states (provider_id, name, type, enabled) VALUES
('g4f', 'G4F (Free GPT-4)', 'api', true),
('zai', 'Z.ai (GLM-5)', 'api', true),
('gemini', 'Google Gemini', 'api', true),
('pollinations', 'Pollinations', 'api', true),
('huggingchat', 'HuggingChat', 'browser', true),
('copilot', 'Microsoft Copilot', 'browser', false),
('chatgpt', 'ChatGPT', 'browser', false)
ON CONFLICT (provider_id) DO NOTHING;
-- ============================================
-- STEP 6: Create helper functions and triggers
-- ============================================
-- Create updated_at trigger function
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ language 'plpgsql';
-- Create triggers for all tables
DROP TRIGGER IF EXISTS update_kaiapi_api_keys_updated_at ON kaiapi_api_keys;
CREATE TRIGGER update_kaiapi_api_keys_updated_at
BEFORE UPDATE ON kaiapi_api_keys
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_kaiapi_model_stats_updated_at ON kaiapi_model_stats;
CREATE TRIGGER update_kaiapi_model_stats_updated_at
BEFORE UPDATE ON kaiapi_model_stats
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_kaiapi_provider_sessions_updated_at ON kaiapi_provider_sessions;
CREATE TRIGGER update_kaiapi_provider_sessions_updated_at
BEFORE UPDATE ON kaiapi_provider_sessions
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
DROP TRIGGER IF EXISTS update_kaiapi_provider_states_updated_at ON kaiapi_provider_states;
CREATE TRIGGER update_kaiapi_provider_states_updated_at
BEFORE UPDATE ON kaiapi_provider_states
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- ============================================
-- STEP 7: Enable Row Level Security (Optional)
-- ============================================
-- Uncomment the following lines if you want to enable RLS
-- ALTER TABLE kaiapi_api_keys ENABLE ROW LEVEL SECURITY;
-- ALTER TABLE kaiapi_model_stats ENABLE ROW LEVEL SECURITY;
-- ALTER TABLE kaiapi_provider_sessions ENABLE ROW LEVEL SECURITY;
-- ALTER TABLE kaiapi_provider_states ENABLE ROW LEVEL SECURITY;
-- Create policy to allow all operations (adjust as needed)
-- CREATE POLICY "Allow all operations on kaiapi_api_keys"
-- ON kaiapi_api_keys
-- FOR ALL
-- TO anon, authenticated
-- USING (true)
-- WITH CHECK (true);
-- CREATE POLICY "Allow all operations on kaiapi_model_stats"
-- ON kaiapi_model_stats
-- FOR ALL
-- TO anon, authenticated
-- USING (true)
-- WITH CHECK (true);
-- CREATE POLICY "Allow all operations on kaiapi_provider_sessions"
-- ON kaiapi_provider_sessions
-- FOR ALL
-- TO anon, authenticated
-- USING (true)
-- WITH CHECK (true);
-- CREATE POLICY "Allow all operations on kaiapi_provider_states"
-- ON kaiapi_provider_states
-- FOR ALL
-- TO anon, authenticated
-- USING (true)
-- WITH CHECK (true);
-- ============================================
-- VERIFICATION: Check all created tables
-- ============================================
SELECT 'Tables created successfully:' as message;
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name LIKE 'kaiapi_%'
ORDER BY table_name;