231 lines
4.9 KiB
TypeScript
231 lines
4.9 KiB
TypeScript
"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<User[]> {
|
|
// 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<UserResponse> {
|
|
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<UserResponse> {
|
|
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<UserResponse> {
|
|
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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<UserResponse> {
|
|
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<UserResponse> {
|
|
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<void> {
|
|
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);
|
|
}
|
|
}
|