Files
docker-watch-desk/supabase/migrations/20251020214011_4e6b4b88-fb3e-4195-a832-a4d45168c5d9.sql
gpt-engineer-app[bot] 6b0627054e Add backend infrastructure
2025-10-20 21:40:29 +00:00

147 lines
4.5 KiB
PL/PgSQL

-- 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();