"use server"; import db from "@/lib/db"; import { CreateUserParams, InviteUserParams, UpdateUserParams, User, UserResponse, } from "@/src/models/users/users.model"; import { createClient } from "@/utils/supabase/server"; import { createAdminClient } from "@/utils/supabase/admin"; // Initialize Supabase client with admin key // Fetch all users export async function fetchUsers(): Promise { // const { data, error } = await supabase.auth.admin.listUsers(); // if (error) { // console.error("Error fetching users:", error); // throw new Error(error.message); // } // return data.users.map((user) => ({ // ...user, // })) as User[]; const users = await db.users.findMany({ include: { profile: true, }, }); if (!users) { throw new Error("Users not found"); } return users; } // get current user export async function getCurrentUser(): Promise { const supabase = await createClient(); const { data: { user }, error, } = await supabase.auth.getUser(); if (error) { console.error("Error fetching current user:", error); throw new Error(error.message); } const userDetail = await db.users.findUnique({ where: { id: user?.id, }, include: { profile: true, }, }); if (!userDetail) { throw new Error("User not found"); } return { data: { user: userDetail, }, error: null, }; } // Create a new user export async function createUser( params: CreateUserParams ): Promise { const supabase = createAdminClient(); const { data, error } = await supabase.auth.admin.createUser({ email: params.email, password: params.password, phone: params.phone, email_confirm: params.email_confirm, }); if (error) { console.error("Error creating user:", error); throw new Error(error.message); } return { data: { user: data.user, }, error: null, }; } // Update an existing user export async function updateUser( userId: string, params: UpdateUserParams ): Promise { const supabase = createAdminClient(); const { data, error } = await supabase.auth.admin.updateUserById(userId, { email: params.email, phone: params.phone, password: params.password, }); if (error) { console.error("Error updating user:", error); throw new Error(error.message); } return { data: { user: data.user, }, error: null, }; } // Delete a user export async function deleteUser(userId: string): Promise { const supabase = createAdminClient(); const { error } = await supabase.auth.admin.deleteUser(userId); if (error) { console.error("Error deleting user:", error); throw new Error(error.message); } } // Send password recovery email export async function sendPasswordRecovery(email: string): Promise { const supabase = createAdminClient(); const { error } = await supabase.auth.resetPasswordForEmail(email, { redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/reset-password`, }); if (error) { console.error("Error sending password recovery:", error); throw new Error(error.message); } } // Send magic link export async function sendMagicLink(email: string): Promise { const supabase = createAdminClient(); const { error } = await supabase.auth.signInWithOtp({ email, options: { emailRedirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`, }, }); if (error) { console.error("Error sending magic link:", error); throw new Error(error.message); } } // Ban a user export async function banUser(userId: string): Promise { const supabase = createAdminClient(); // Ban for 100 years (effectively permanent) const banUntil = new Date(); banUntil.setFullYear(banUntil.getFullYear() + 100); const { data, error } = await supabase.auth.admin.updateUserById(userId, { ban_duration: "100h", }); if (error) { console.error("Error banning user:", error); throw new Error(error.message); } return { data: { user: data.user, }, error: null, }; } // Unban a user export async function unbanUser(userId: string): Promise { const supabase = createAdminClient(); const { data, error } = await supabase.auth.admin.updateUserById(userId, { ban_duration: "none", }); if (error) { console.error("Error unbanning user:", error); throw new Error(error.message); } return { data: { user: data.user, }, error: null, }; } // Invite a user export async function inviteUser(params: InviteUserParams): Promise { const supabase = createAdminClient(); const { error } = await supabase.auth.admin.inviteUserByEmail(params.email, { redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`, }); if (error) { console.error("Error inviting user:", error); throw new Error(error.message); } }