-- Supabase SQL Schema for Provider Session Management -- This stores cookies/sessions for all browser-based providers -- Enable RLS (Row Level Security) for security alter table if exists provider_sessions enable row level security; -- Provider Sessions Table -- Stores session cookies and metadata for browser-based providers create table if not exists provider_sessions ( id uuid default gen_random_uuid() primary key, provider text not null, -- 'huggingchat', 'zai', 'gemini', etc. session_data jsonb not null, -- cookies, tokens, etc. conversation_count integer default 0, -- number of conversations used max_conversations integer default 50, -- max before requiring re-login expires_at timestamp with time zone, -- session expiration last_used_at timestamp with time zone default now(), created_at timestamp with time zone default now(), updated_at timestamp with time zone default now(), -- Ensure unique provider sessions constraint unique_provider unique (provider) ); -- Indexes for performance create index if not exists idx_provider_sessions_provider on provider_sessions(provider); create index if not exists idx_provider_sessions_expires on provider_sessions(expires_at); -- Function to automatically update updated_at create or replace function update_updated_at_column() returns trigger as $$ begin new.updated_at = now(); return new; end; $$ language plpgsql; -- Trigger to auto-update updated_at drop trigger if exists update_provider_sessions_updated_at on provider_sessions; create trigger update_provider_sessions_updated_at before update on provider_sessions for each row execute function update_updated_at_column(); -- RLS Policy: Allow all operations (since this is for backend use) -- In production, you might want to restrict this to specific service roles create policy "Allow all operations on provider_sessions" on provider_sessions for all to anon, authenticated using (true) with check (true); -- Comments for documentation comment on table provider_sessions is 'Stores authentication sessions for browser-based AI providers'; comment on column provider_sessions.provider is 'Provider name: huggingchat, zai, gemini, etc.'; comment on column provider_sessions.session_data is 'JSON containing cookies, tokens, and other session info'; comment on column provider_sessions.conversation_count is 'Number of API calls made with this session'; comment on column provider_sessions.max_conversations is 'Maximum allowed conversations before re-login required'; comment on column provider_sessions.expires_at is 'When this session expires and requires re-login'; -- Insert/Update function for upserting sessions create or replace function upsert_provider_session( p_provider text, p_session_data jsonb, p_conversation_count integer default 0, p_max_conversations integer default 50, p_expires_at timestamp with time zone default null ) returns uuid as $$ declare v_id uuid; begin insert into provider_sessions (provider, session_data, conversation_count, max_conversations, expires_at) values (p_provider, p_session_data, p_conversation_count, p_max_conversations, p_expires_at) on conflict (provider) do update set session_data = excluded.session_data, conversation_count = excluded.conversation_count, max_conversations = excluded.max_conversations, expires_at = excluded.expires_at, last_used_at = now() returning id into v_id; return v_id; end; $$ language plpgsql; -- Function to increment conversation count create or replace function increment_conversation_count(p_provider text) returns void as $$ begin update provider_sessions set conversation_count = conversation_count + 1, last_used_at = now() where provider = p_provider; end; $$ language plpgsql; -- Grant permissions grant all on provider_sessions to anon, authenticated; grant execute on function upsert_provider_session to anon, authenticated; grant execute on function increment_conversation_count to anon, authenticated; -- Sample query to check current sessions: -- select provider, conversation_count, max_conversations, expires_at, last_used_at from provider_sessions; -- Sample query to clean up expired sessions: -- delete from provider_sessions where expires_at < now();