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
Some checks failed
Build and Push App / build (push) Failing after 51s
This commit is contained in:
111
admin/src/app/actions/categories.ts
Normal file
111
admin/src/app/actions/categories.ts
Normal 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 [];
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user