I am using supabase authentication for sign up, and when a user successfully signs up, I am inserting a row in a "profiles" table that consists of other user details.
I want to handle the case where a user successfully signs up with supabase auth, but fails to get inserted in profiles
table. If that happens, I want to delete the account created in auth
. How do I do this? Is there a better approach for this?
"use server";
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { createClient } from "@/utils/supabase/server";
export async function register(data: {
name: string;
email: string;
password: string;
}) {
const supabase = createClient();
// Auth Sign Up
const { data: authData, error: authError } = await supabase.auth.signUp({
email: data.email,
password: data.password,
options: {
data: { displayName: data.name },
},
});
if (authError) return { error: authError.message };
// Create new User Profile
const { error } = await supabase.from("profiles").insert({
id: authData.user?.id,
email: data.email,
username: data.name,
display_name: data.name,
});
if (error) {
// Remove user created in auth
// How do I do this?
return { error: error.message };
}
revalidatePath("/", "layout");
redirect("/messages");
}
So I found two solutions.
Firstly, I may not need to create a profiles
table since I can store everything in user's metadata in auth: https://supabase.com/docs/guides/auth/managing-user-data#accessing-user-metadata
Secondly, if I still want to have a profiles
table, I can use supabase triggers which will automatically insert a row in profiles table upon user creation via auth. Link: https://supabase.com/docs/guides/auth/managing-user-data#using-triggers
If I am using triggers, I don't need to manually write this code either. In my supabase project, I go to SQL Editor > Quickstarts > User Management Starters
. This will write the query for me with Profile Creations, Policies and Triggers. I just have to run the query and it's all done!