Files
afrov2/admin/src/app/actions/user.ts
2026-05-12 20:32:00 +02:00

136 lines
3.7 KiB
TypeScript

"use server";
import { prisma } from "@/lib/prisma";
export async function getClients() {
try {
const clients = await prisma.user.findMany({
where: {
role: { not: "ADMIN" },
OR: [
{ businesses: null },
{ businesses: { isActive: false } }
]
},
include: {
businesses: true
},
orderBy: {
createdAt: "desc"
}
});
return { success: true, data: clients };
} catch (error) {
console.error("Failed to fetch clients:", error);
return { success: false, error: "Erreur lors de la récupération des clients" };
}
}
export async function verifyUserEmail(userId: string) {
try {
await prisma.user.update({
where: { id: userId },
data: {
emailVerified: true,
verificationToken: null
}
});
return { success: true };
} catch (error) {
console.error("Failed to verify user email:", error);
return { success: false, error: "Erreur lors de la vérification de l'email" };
}
}
export async function scheduleUserDeletion(userId: string, reason: string, delayDays: number) {
try {
const user = await prisma.user.findUnique({
where: { id: userId }
});
if (!user) return { success: false, error: "Utilisateur non trouvé" };
const settings = await prisma.siteSetting.findUnique({
where: { id: "singleton" }
});
const deletionDate = new Date();
deletionDate.setDate(deletionDate.getDate() + delayDays);
if (delayDays === 0) {
// Immediate deletion
await prisma.user.delete({
where: { id: userId }
});
return { success: true, message: "Supprimé immédiatement" };
}
await prisma.user.update({
where: { id: userId },
data: {
deletedAt: new Date(),
deletionScheduledAt: deletionDate,
deletionReason: reason
}
});
// Send notification email
if (settings?.deleteAccountTemplate) {
const { sendEmail } = await import("@/lib/mail");
const html = settings.deleteAccountTemplate
.replace(/{name}/g, user.name)
.replace(/{siteName}/g, settings.siteName)
.replace(/{deletionDate}/g, delayDays === 0 ? "immédiatement" : deletionDate.toLocaleDateString("fr-FR"))
.replace(/{reason}/g, reason)
.replace(/{reactivateUrl}/g, `${process.env.NEXT_PUBLIC_APP_URL}/auth/reactivate?id=${user.id}`);
await sendEmail({
to: user.email,
subject: settings.deleteAccountSubject,
html
});
}
return { success: true };
} catch (error) {
console.error("Failed to schedule user deletion:", error);
return { success: false, error: "Erreur lors de la programmation de la suppression" };
}
}
export async function reactivateUser(userId: string, reason: string) {
try {
const user = await prisma.user.update({
where: { id: userId },
data: {
deletedAt: null,
deletionScheduledAt: null,
reactivationReason: reason
}
});
const settings = await prisma.siteSetting.findUnique({
where: { id: "singleton" }
});
// Send confirmation email
if (settings?.reactivateAccountTemplate) {
const { sendEmail } = await import("@/lib/mail");
const html = settings.reactivateAccountTemplate
.replace(/{name}/g, user.name)
.replace(/{siteName}/g, settings.siteName)
.replace(/{reason}/g, reason);
await sendEmail({
to: user.email,
subject: settings.reactivateAccountSubject,
html
});
}
return { success: true };
} catch (error) {
console.error("Failed to reactivate user:", error);
return { success: false, error: "Erreur lors de la réactivation de l'utilisateur" };
}
}