-- Create table for caching index calculations CREATE TABLE IF NOT EXISTS index_cache ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, cache_key VARCHAR(32) UNIQUE NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, locale VARCHAR(50) NOT NULL, market_type VARCHAR(50) NOT NULL, index_data JSONB NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create index for faster lookups CREATE INDEX IF NOT EXISTS idx_cache_key ON index_cache(cache_key); CREATE INDEX IF NOT EXISTS idx_cache_dates ON index_cache(start_date, end_date); -- Create table for user-specific weights CREATE TABLE IF NOT EXISTS user_weights ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, session_id VARCHAR(255) NOT NULL, locale VARCHAR(50) NOT NULL, market_type VARCHAR(50) NOT NULL, weights_data JSONB NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Create indexes for user weights CREATE INDEX IF NOT EXISTS idx_user_session ON user_weights(session_id); CREATE INDEX IF NOT EXISTS idx_user_params ON user_weights(session_id, locale, market_type); -- Optional: Create table for user sessions (if you want persistent user management) CREATE TABLE IF NOT EXISTS user_sessions ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, session_id VARCHAR(255) UNIQUE NOT NULL, user_email VARCHAR(255), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), last_active TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Enable Row Level Security (RLS) for better data isolation ALTER TABLE index_cache ENABLE ROW LEVEL SECURITY; ALTER TABLE user_weights ENABLE ROW LEVEL SECURITY; ALTER TABLE user_sessions ENABLE ROW LEVEL SECURITY; -- Create policies for public access (adjust based on your auth strategy) -- For now, allowing all authenticated users to read cached data CREATE POLICY "Public read access for index cache" ON index_cache FOR SELECT USING (true); CREATE POLICY "Public insert access for index cache" ON index_cache FOR INSERT WITH CHECK (true); CREATE POLICY "Public update access for index cache" ON index_cache FOR UPDATE USING (true); -- User weights should be session-specific CREATE POLICY "Session-specific access for user weights" ON user_weights FOR ALL USING (true); -- Function to clean up old cache entries (optional) CREATE OR REPLACE FUNCTION cleanup_old_cache() RETURNS void AS $$ BEGIN DELETE FROM index_cache WHERE created_at < NOW() - INTERVAL '30 days'; DELETE FROM user_weights WHERE created_at < NOW() - INTERVAL '7 days'; END; $$ LANGUAGE plpgsql; -- Optional: Create a scheduled job to run cleanup (requires pg_cron extension) -- SELECT cron.schedule('cleanup-old-cache', '0 0 * * *', 'SELECT cleanup_old_cache();');