-- Create a public users table that mirrors relevant auth.users data -- This avoids the need for SECURITY DEFINER functions -- Create the public users table CREATE TABLE public.users ( id UUID REFERENCES auth.users NOT NULL PRIMARY KEY, email TEXT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL ); -- Create indexes for performance CREATE INDEX idx_users_email ON public.users(email); -- Create RLS policies for the users table ALTER TABLE public.users ENABLE ROW LEVEL SECURITY; -- Users can only read their own data CREATE POLICY "Users can view own profile" ON public.users FOR SELECT USING (auth.uid() = id); -- Create a function to handle new user creation CREATE OR REPLACE FUNCTION public.handle_new_user_add_public_users() RETURNS trigger AS $$ BEGIN INSERT INTO public.users (id, email, created_at) VALUES (new.id, new.email, new.created_at); RETURN new; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Create trigger to automatically create public.users record when auth.users is created -- Drop existing trigger if it exists DROP TRIGGER IF EXISTS on_auth_user_created_add_public_users ON auth.users; CREATE TRIGGER on_auth_user_created_add_public_users AFTER INSERT ON auth.users FOR EACH ROW EXECUTE PROCEDURE public.handle_new_user_add_public_users(); -- Grant necessary permissions GRANT SELECT ON public.users TO authenticated; GRANT SELECT ON public.users TO anon;