-- Create profiles table for user data CREATE TABLE public.profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, username TEXT NOT NULL UNIQUE, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); -- Enable RLS ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY; -- Profiles policies CREATE POLICY "Users can view their own profile" ON public.profiles FOR SELECT USING (auth.uid() = id); CREATE POLICY "Users can update their own profile" ON public.profiles FOR UPDATE USING (auth.uid() = id); -- Create global_settings table CREATE TABLE public.global_settings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, discord_webhook_url TEXT, metrics_interval INTEGER DEFAULT 2000, alert_debounce_sec INTEGER DEFAULT 30, default_error_regex TEXT DEFAULT '(?i)(error|err|exception|traceback|crit(ical)?)', theme TEXT DEFAULT 'dark', timezone TEXT DEFAULT 'Europe/Copenhagen', created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); ALTER TABLE public.global_settings ENABLE ROW LEVEL SECURITY; CREATE POLICY "Users can view their own settings" ON public.global_settings FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Users can insert their own settings" ON public.global_settings FOR INSERT WITH CHECK (auth.uid() = user_id); CREATE POLICY "Users can update their own settings" ON public.global_settings FOR UPDATE USING (auth.uid() = user_id); -- Create container_settings table CREATE TABLE public.container_settings ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, container_id TEXT NOT NULL, container_name TEXT NOT NULL, alerts_enabled BOOLEAN DEFAULT true, alert_on_stop BOOLEAN DEFAULT true, error_pattern TEXT DEFAULT '(?i)(error|err|exception|traceback|crit(ical)?)', custom_webhook_url TEXT, debounce_interval INTEGER DEFAULT 30, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now(), UNIQUE(user_id, container_id) ); ALTER TABLE public.container_settings ENABLE ROW LEVEL SECURITY; CREATE POLICY "Users can view their own container settings" ON public.container_settings FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Users can insert their own container settings" ON public.container_settings FOR INSERT WITH CHECK (auth.uid() = user_id); CREATE POLICY "Users can update their own container settings" ON public.container_settings FOR UPDATE USING (auth.uid() = user_id); CREATE POLICY "Users can delete their own container settings" ON public.container_settings FOR DELETE USING (auth.uid() = user_id); -- Create audit_logs table CREATE TABLE public.audit_logs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, action TEXT NOT NULL, container_id TEXT, container_name TEXT, details JSONB, timestamp TIMESTAMPTZ DEFAULT now() ); ALTER TABLE public.audit_logs ENABLE ROW LEVEL SECURITY; CREATE POLICY "Users can view their own audit logs" ON public.audit_logs FOR SELECT USING (auth.uid() = user_id); CREATE POLICY "Users can insert their own audit logs" ON public.audit_logs FOR INSERT WITH CHECK (auth.uid() = user_id); -- Create function to update updated_at timestamp CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Create triggers for updated_at CREATE TRIGGER update_profiles_updated_at BEFORE UPDATE ON public.profiles FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_global_settings_updated_at BEFORE UPDATE ON public.global_settings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_container_settings_updated_at BEFORE UPDATE ON public.container_settings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Create function to auto-create profile on signup CREATE OR REPLACE FUNCTION public.handle_new_user() RETURNS TRIGGER AS $$ BEGIN INSERT INTO public.profiles (id, username) VALUES ( NEW.id, COALESCE(NEW.raw_user_meta_data->>'username', split_part(NEW.email, '@', 1)) ); -- Create default global settings INSERT INTO public.global_settings (user_id) VALUES (NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Trigger to create profile on user signup CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();