Files
aycanurmimarl-k/app/admin/projects/actions.ts
2026-04-17 11:16:00 +03:00

123 lines
3.5 KiB
TypeScript

"use server";
import { prisma } from "@/lib/prisma";
import { uploadBuffer } from "@/lib/cloudinary";
import { revalidatePath } from "next/cache";
export async function getProjects() {
return await prisma.project.findMany({
orderBy: { createdAt: 'desc' }
});
}
export async function createProject(formData: FormData) {
const title = formData.get("title") as string;
const year = formData.get("year") as string;
const location = formData.get("location") as string;
const category = formData.get("category") as string;
const description = formData.get("description") as string;
const mainImageFile = formData.get("image") as File;
const galleryFiles = formData.getAll("gallery") as File[];
const slug = title.toLowerCase().replace(/ /g, "-").replace(/[^\w-]+/g, "");
let imageUrl = "";
let galleryUrls: string[] = [];
if (mainImageFile && mainImageFile.size > 0) {
const buffer = Buffer.from(await mainImageFile.arrayBuffer());
imageUrl = await uploadBuffer(buffer, slug);
}
for (const file of galleryFiles) {
if (file && file.size > 0) {
const buffer = Buffer.from(await file.arrayBuffer());
const url = await uploadBuffer(buffer, slug);
galleryUrls.push(url);
}
}
await prisma.project.create({
data: {
title,
year,
location,
category,
description,
slug,
image: imageUrl,
gallery: galleryUrls
}
});
revalidatePath("/admin/projects");
revalidatePath("/projects");
revalidatePath("/");
}
export async function updateProject(id: number, formData: FormData) {
const title = formData.get("title") as string;
const year = formData.get("year") as string;
const location = formData.get("location") as string;
const category = formData.get("category") as string;
const description = formData.get("description") as string;
const keepGalleryJson = formData.get("keepGallery") as string;
const mainImageFile = formData.get("image") as File;
const galleryFiles = formData.getAll("gallery") as File[];
const existingProject = await prisma.project.findUnique({ where: { id } });
if (!existingProject) throw new Error("Project not found");
const slug = title.toLowerCase().replace(/ /g, "-").replace(/[^\w-]+/g, "");
const existingCover = formData.get("existingCover") as string;
let imageUrl = existingCover || ""; // Use existing if provided, else empty
// Parse existing gallery images we want to keep
let galleryUrls: string[] = keepGalleryJson ? JSON.parse(keepGalleryJson) : [...existingProject.gallery];
// Update Main Image if new file uploaded
if (mainImageFile && mainImageFile.size > 0) {
const buffer = Buffer.from(await mainImageFile.arrayBuffer());
imageUrl = await uploadBuffer(buffer, slug);
}
// Add New Gallery Images if any
for (const file of galleryFiles) {
if (file && file.size > 0) {
const buffer = Buffer.from(await file.arrayBuffer());
const url = await uploadBuffer(buffer, slug);
galleryUrls.push(url);
}
}
await prisma.project.update({
where: { id },
data: {
title,
year,
location,
category,
description,
slug,
image: imageUrl,
gallery: galleryUrls
}
});
revalidatePath("/admin/projects");
revalidatePath("/projects");
revalidatePath("/");
}
export async function deleteProject(id: number) {
await prisma.project.delete({
where: { id }
});
revalidatePath("/admin/projects");
revalidatePath("/projects");
revalidatePath("/");
}