feat: implement manageable homepage banner slider with support for businesses and custom slides
This commit is contained in:
112
admin/src/app/actions/slides.ts
Normal file
112
admin/src/app/actions/slides.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { revalidatePath } from "next/cache";
|
||||
|
||||
export async function getSlides() {
|
||||
try {
|
||||
return await prisma.homeSlide.findMany({
|
||||
orderBy: { order: 'asc' },
|
||||
include: { business: true }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Failed to get slides:", error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export async function createSlide(data: any) {
|
||||
try {
|
||||
await prisma.homeSlide.create({
|
||||
data: {
|
||||
type: data.type,
|
||||
businessId: data.businessId || null,
|
||||
title: data.title || null,
|
||||
subtitle: data.subtitle || null,
|
||||
imageUrl: data.imageUrl || null,
|
||||
linkUrl: data.linkUrl || null,
|
||||
order: data.order || 0,
|
||||
isActive: data.isActive ?? true,
|
||||
}
|
||||
});
|
||||
revalidatePath("/slides");
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("Failed to create slide:", error);
|
||||
return { success: false, error: "Erreur lors de la création" };
|
||||
}
|
||||
}
|
||||
|
||||
export async function updateSlide(id: string, data: any) {
|
||||
try {
|
||||
await prisma.homeSlide.update({
|
||||
where: { id },
|
||||
data: {
|
||||
type: data.type,
|
||||
businessId: data.businessId || null,
|
||||
title: data.title || null,
|
||||
subtitle: data.subtitle || null,
|
||||
imageUrl: data.imageUrl || null,
|
||||
linkUrl: data.linkUrl || null,
|
||||
order: data.order || 0,
|
||||
isActive: data.isActive ?? true,
|
||||
}
|
||||
});
|
||||
revalidatePath("/slides");
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("Failed to update slide:", error);
|
||||
return { success: false, error: "Erreur lors de la mise à jour" };
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteSlide(id: string) {
|
||||
try {
|
||||
await prisma.homeSlide.delete({
|
||||
where: { id }
|
||||
});
|
||||
revalidatePath("/slides");
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("Failed to delete slide:", error);
|
||||
return { success: false, error: "Erreur lors de la suppression" };
|
||||
}
|
||||
}
|
||||
|
||||
export async function toggleSlideStatus(id: string, currentStatus: boolean) {
|
||||
try {
|
||||
await prisma.homeSlide.update({
|
||||
where: { id },
|
||||
data: { isActive: !currentStatus }
|
||||
});
|
||||
revalidatePath("/slides");
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error("Failed to toggle slide status:", error);
|
||||
return { success: false, error: "Erreur lors de la mise à jour" };
|
||||
}
|
||||
}
|
||||
|
||||
export async function searchBusinesses(query: string) {
|
||||
try {
|
||||
return await prisma.business.findMany({
|
||||
where: {
|
||||
OR: [
|
||||
{ name: { contains: query, mode: 'insensitive' } },
|
||||
{ location: { contains: query, mode: 'insensitive' } },
|
||||
],
|
||||
isActive: true,
|
||||
},
|
||||
take: 10,
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
logoUrl: true,
|
||||
location: true,
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Failed to search businesses:", error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user