Perbaikan UI & API Menu Ekonomi Pasar Desa

This commit is contained in:
2025-07-04 11:09:06 +08:00
parent 0fd47e3e94
commit 4f97c01501
11 changed files with 343 additions and 274 deletions

View File

@@ -1,98 +1,68 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
import fs from "fs/promises";
import path from "path";
type FormUpdate = {
nama: string;
harga: number;
alamatUsaha: string;
imageId: string;
rating: number;
kategoriId: string[]; // Array of KategoriMakanan IDs
id: string;
nama: string;
harga: number;
alamatUsaha: string;
imageId: string;
rating: number;
kategoriId: string[]; // Array of KategoriProduk IDs
};
export default async function pasarDesaUpdate(context: Context) {
const body = context.body as FormUpdate;
if (!body.id) {
throw new Error("ID pasar desa tidak boleh kosong");
}
if (!body.kategoriId || body.kategoriId.length === 0) {
throw new Error("Minimal 1 kategori harus dipilih");
}
// 1. Update data utama pasar desa
await prisma.pasarDesa.update({
where: { id: body.id },
data: {
nama: body.nama,
harga: Number(body.harga),
alamatUsaha: body.alamatUsaha,
imageId: body.imageId,
rating: Number(body.rating),
},
});
// 2. Hapus semua relasi kategori lama
await prisma.kategoriToPasar.deleteMany({
where: { pasarDesaId: body.id },
});
// 3. Tambah relasi kategori yang baru
await prisma.kategoriToPasar.createMany({
data: body.kategoriId.map((kategoriProdukId) => ({
pasarDesaId: body.id,
kategoriId: kategoriProdukId,
})),
});
// 4. Ambil data lengkap setelah update
const updated = await prisma.pasarDesa.findUnique({
where: { id: body.id },
include: {
image: true,
KategoriToPasar: {
include: {
kategori: true,
},
},
},
});
return {
success: true,
message: "Success update pasar desa",
data: updated,
};
export default async function pasarDesaUpdate(context: Context){
try {
const id = context.params?.id;
const body = context.body as FormUpdate;
const { nama, harga, alamatUsaha, imageId, rating, kategoriId } = body;
if (!id) {
return Response.json({
success: false,
message: "ID tidak boleh kosong",
}, { status: 400 });
}
const existing = await prisma.pasarDesa.findUnique({
where: { id },
include: {
image: true,
kategori: true,
},
})
if (!existing) {
return Response.json({
success: false,
message: "Pasar desa tidak ditemukan",
}, { status: 404 });
}
if (existing.imageId && existing.imageId !== imageId) {
const oldImage = existing.image;
if (oldImage) {
try {
const filePath = path.join(oldImage.path, oldImage.name);
await fs.unlink(filePath);
await prisma.fileStorage.delete({
where: { id: oldImage.id },
});
} catch (err) {
console.error("Gagal hapus gambar lama:", err);
}
}
}
// First, update the main PasarDesa record
await prisma.pasarDesa.update({
where: { id },
data: {
nama,
harga,
alamatUsaha,
imageId,
rating,
kategori: {
connect: kategoriId.map((id) => ({ id })),
},
},
});
// Fetch the updated record with all relations
const updated = await prisma.pasarDesa.findUnique({
where: { id },
include: {
image: true,
kategori: true,
}
});
return Response.json({
success: true,
message: "Success update pasar desa",
data: updated,
}, {
status: 200,
});
} catch (e) {
console.error("Update error:", e);
return Response.json({
success: false,
message: "Gagal mengupdate pasar desa: " + (e instanceof Error ? e.message : 'Unknown error'),
}, {
status: 500,
});
}
}
}