feat: implement home page, business directory, and administrative management features with updated schema and API routes
Some checks failed
Build and Push App / build (push) Failing after 51s

This commit is contained in:
2026-04-23 14:40:50 +02:00
parent 88e4c13b9f
commit e6310f30de
23 changed files with 1124 additions and 222 deletions

View File

@@ -0,0 +1,111 @@
"use server";
import { prisma } from "@/lib/prisma";
import { revalidatePath } from "next/cache";
export async function getCategories() {
try {
return await prisma.businessCategory.findMany({
orderBy: { name: 'asc' }
});
} catch (error) {
console.error("Failed to fetch categories:", error);
return [];
}
}
export async function createCategory(data: { name: string; slug: string; icon?: string; suggestionId?: string }) {
try {
const { suggestionId, ...categoryData } = data;
const category = await prisma.businessCategory.create({
data: categoryData
});
// Si c'est une conversion de suggestion, on lie automatiquement l'entreprise concernée
if (suggestionId) {
await prisma.business.update({
where: { id: suggestionId },
data: {
category: category.name,
categoryId: category.id,
suggestedCategory: null // On nettoie le champ tampon car la suggestion est validée
}
});
}
revalidatePath("/settings");
revalidatePath("/categories");
revalidatePath("/entrepreneurs");
return { success: true, data: category };
} catch (error) {
console.error("Failed to create category:", error);
return { success: false, error: "Erreur lors de la création de la catégorie" };
}
}
export async function updateCategory(id: string, data: { name: string; slug: string; icon?: string; isActive: boolean }) {
try {
// 1. Récupérer l'ancien nom pour la migration
const oldCategory = await prisma.businessCategory.findUnique({
where: { id },
select: { name: true }
});
// 2. Mettre à jour la catégorie
const category = await prisma.businessCategory.update({
where: { id },
data
});
// 3. Si le nom a changé, mettre à jour tous les entrepreneurs qui l'utilisaient
if (oldCategory && oldCategory.name !== data.name) {
await prisma.business.updateMany({
where: { category: oldCategory.name },
data: { category: data.name }
});
}
revalidatePath("/settings");
revalidatePath("/categories");
return { success: true, data: category };
} catch (error) {
console.error("Failed to update category:", error);
return { success: false, error: "Erreur lors de la mise à jour" };
}
}
export async function deleteCategory(id: string) {
try {
await prisma.businessCategory.delete({
where: { id }
});
revalidatePath("/settings");
revalidatePath("/categories");
return { success: true };
} catch (error) {
console.error("Failed to delete category:", error);
return { success: false, error: "Erreur lors de la suppression" };
}
}
export async function getSuggestedCategories() {
try {
return await prisma.business.findMany({
where: {
suggestedCategory: { not: null },
category: 'Autre'
},
select: {
id: true,
name: true,
suggestedCategory: true,
createdAt: true
},
orderBy: { createdAt: 'desc' }
});
} catch (error) {
console.error("Failed to fetch suggested categories:", error);
return [];
}
}

View File

@@ -21,7 +21,9 @@ export async function updatePricingPlanDetail(id: string, data: any) {
data: {
name: data.name,
priceXOF: data.priceXOF,
yearlyPriceXOF: data.yearlyPriceXOF || null,
priceEUR: data.priceEUR,
yearlyPriceEUR: data.yearlyPriceEUR || null,
description: data.description,
features: data.features, // Expected to be string[]
offerLimit: parseInt(data.offerLimit),