CREATE SCHEMA IF NOT EXISTS auth; CREATE TABLE IF NOT EXISTS auth.users ( id uuid PRIMARY KEY, email text NOT NULL UNIQUE, encrypted_password text NOT NULL, raw_user_meta_data jsonb NOT NULL DEFAULT '{}'::jsonb, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now() ); CREATE TABLE IF NOT EXISTS public.users ( id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, email text NOT NULL UNIQUE, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), display_name text NOT NULL ); CREATE TABLE IF NOT EXISTS auth.sessions ( id uuid PRIMARY KEY, session_token text NOT NULL UNIQUE, user_id uuid NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), expires_at timestamptz NOT NULL ); CREATE INDEX IF NOT EXISTS auth_sessions_user_id_idx ON auth.sessions(user_id); CREATE TABLE IF NOT EXISTS public.tablos ( id uuid PRIMARY KEY, owner_id uuid NOT NULL REFERENCES public.users(id) ON DELETE CASCADE, name text NOT NULL, status text NOT NULL, created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), deleted_at timestamptz NULL ); CREATE INDEX IF NOT EXISTS tablos_owner_created_idx ON public.tablos (owner_id, created_at DESC) WHERE deleted_at IS NULL; CREATE OR REPLACE FUNCTION public.handle_new_user() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER AS $$ BEGIN INSERT INTO public.users (id, email, created_at, updated_at, display_name) VALUES ( NEW.id, NEW.email, NEW.created_at, NEW.updated_at, COALESCE(NEW.raw_user_meta_data ->> 'display_name', split_part(NEW.email, '@', 1)) ); RETURN NEW; END; $$; DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users; CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE FUNCTION public.handle_new_user();