API Profile Desa Menu Desa

Fix Eror gallery bagian tabs video
Next UI Profile Desa
This commit is contained in:
2025-06-17 17:30:47 +08:00
parent f7437708c0
commit f4888b53ab
51 changed files with 2421 additions and 659 deletions

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
export default async function profilePerbekelFindById(request: Request) {
const url = new URL(request.url);
const pathSegments = url.pathname.split('/');
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json({
success: false,
message: "ID tidak boleh kosong",
}, { status: 400 });
}
try {
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, { status: 400 });
}
const data = await prisma.profilPerbekel.findUnique({
where: { id },
include: {
image: true,
}
});
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, { status: 404 });
}
return Response.json({
success: true,
message: "Data berhasil ditemukan",
data,
}, { status: 200 });
} catch (error) {
console.error("Error fetching profile Perbekel:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengambil data profile Perbekel",
}, { status: 500 });
}
}

View File

@@ -0,0 +1,32 @@
import Elysia, { t } from "elysia";
import profilePerbekelFindById from "./find-by-id";
import profilePerbekelUpdate from "./update";
const ProfilPerbekel = new Elysia({
prefix: "/profileperbekel",
tags: ["Desa/Profile"],
})
.get("/:id", async (context) => {
const response = await profilePerbekelFindById(
new Request(context.request)
);
return response;
})
.put(
"/:id",
async (context) => {
const response = await profilePerbekelUpdate(context);
return response;
},
{
body: t.Object({
biodata: t.String(),
pengalaman: t.String(),
pengalamanOrganisasi: t.String(),
programUnggulan: t.String(),
imageId: t.String(),
}),
}
);
export default ProfilPerbekel;

View File

@@ -1,33 +1,118 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormCreate = Prisma.ProfilPerbekelGetPayload<{
select: {
id: true;
biodata: true;
pengalaman: true;
pengalamanOrganisasi: true;
programUnggulan: true;
}
}>
type FormUpdate = Prisma.ProfilPerbekelGetPayload<{
select: {
id: true;
biodata: true;
pengalaman: true;
pengalamanOrganisasi: true;
programUnggulan: true;
imageId: true;
};
}>;
export default async function profilePerbekelUpdate(context: Context) {
const body = context.body as FormCreate;
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
await prisma.profilPerbekel.update({
where: {
id: body.id
},
const { biodata, pengalaman, pengalamanOrganisasi, programUnggulan, imageId } = body;
if (!id) {
return new Response(
JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}),
{
status: 400,
headers: {
"Content-Type": "application/json",
},
}
);
}
const exisitng = await prisma.profilPerbekel.findUnique({
where: {
id,
},
include: {
image: true,
},
});
if (!exisitng) {
return new Response(
JSON.stringify({
success: false,
message: "Data tidak ditemukan",
}),
{
status: 404,
headers: {
"Content-Type": "application/json",
},
}
);
}
if (exisitng.imageId !== imageId) {
const oldImage = exisitng.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 (error) {
console.error("Gagal hapus gambar lama:", error);
}
}
}
const updated = await prisma.profilPerbekel.update({
where: {id},
data: {
biodata: body.biodata,
pengalaman: body.pengalaman,
pengalamanOrganisasi: body.pengalamanOrganisasi,
programUnggulan: body.programUnggulan,
biodata,
pengalaman,
pengalamanOrganisasi,
programUnggulan,
imageId,
}
})
return {
success: true,
message: "Profile Perbekel Berhasil Diupdate",
}
}
return new Response(
JSON.stringify({
success: true,
message: "Data berhasil diperbarui",
data: updated,
}),
{
status: 200,
headers: {
"Content-Type": "application/json",
},
}
);
} catch (error) {
console.error("Error updating profile Perbekel:", error);
return new Response(
JSON.stringify({
success: false,
message: "Terjadi kesalahan saat mengupdate profile Perbekel",
}),
{
status: 500,
headers: {
"Content-Type": "application/json",
},
}
);
}
}

View File

@@ -1,33 +0,0 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function profileDesaFindById(context: Context) {
try {
const id = context?.params?.slugs?.[0];
// If no ID provided, get the first profile
if (!id) {
const data = await prisma.profileDesa.findFirst();
return {
success: true,
data,
};
}
const data = await prisma.profileDesa.findUniqueOrThrow({
where: { id },
});
return {
success: true,
data,
};
} catch (error) {
console.error("Error fetching profileDesa:", error);
return {
success: false,
message: error instanceof Error ? error.message : "Unknown error",
};
}
}

View File

@@ -1,51 +1,16 @@
import Elysia, { t } from "elysia";
import lambangDesaUpdate from "./lambangDesa/update";
import maskotDesaUpdate from "./maskotDesa/update";
import profilePerbekelUpdate from "../profilePerbekel/update";
import sejarahDesaUpdate from "./sejarah/update";
import visimisiDesaUpdate from "./visimisiDesa/update";
import profileDesaFindById from "./find-by-id";
import SejarahDesa from "./sejarah";
import VisiMisiDesa from "./visi-misi";
import LambangDesa from "./lambang-desa";
import MaskotDesa from "./maskot-desa";
import Elysia from "elysia";
const ProfileDesa = new Elysia({
prefix: "/profile",
tags: ["Desa/Profile"]
})
.get("/find-by-id", profileDesaFindById)
.post("/profilePerbekel/update", profilePerbekelUpdate, {
body: t.Object({
id: t.String(),
biodata: t.String(),
pengalaman: t.String(),
pengalamanOrganisasi: t.String(),
programUnggulan: t.String(),
})
})
.post("/visimisiDesa/update", visimisiDesaUpdate, {
body: t.Object({
id: t.String(),
visi: t.String(),
misi: t.String(),
})
})
.post("/sejarah/update", sejarahDesaUpdate, {
body: t.Object({
id: t.String(),
sejarah: t.String(),
})
})
.post("/lambangDesa/update", lambangDesaUpdate, {
body: t.Object({
id: t.String(),
lambang: t.String(),
})
})
.post("/maskotDesa/update", maskotDesaUpdate, {
body: t.Object({
id: t.String(),
maskot: t.String(),
})
prefix: "/profile",
tags: ["Desa/Profile"],
})
.use(SejarahDesa)
.use(VisiMisiDesa)
.use(LambangDesa)
.use(MaskotDesa);
export default ProfileDesa
export default ProfileDesa;

View File

@@ -0,0 +1,60 @@
import prisma from "@/lib/prisma";
export default async function lambangDesaFindById(request: Request) {
const url = new URL(request.url);
const pathSegments = url.pathname.split("/");
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json(
{
success: false,
message: "ID tidak boleh kosong",
},
{ status: 400 }
);
}
try {
if (typeof id !== "string") {
return Response.json(
{
success: false,
message: "ID tidak valid",
},
{ status: 400 }
);
}
const data = await prisma.lambangDesa.findUnique({
where: { id },
});
if (!data) {
return Response.json(
{
success: false,
message: "Data tidak ditemukan",
},
{ status: 404 }
);
}
return Response.json(
{
success: true,
data,
},
{ status: 200 }
);
} catch (error) {
console.error("Gagal mengambil data lambang desa:", error);
return Response.json(
{
success: false,
message: "Terjadi kesalahan saat mengambil data",
},
{ status: 500 }
);
}
}

View File

@@ -0,0 +1,28 @@
import Elysia, { t } from "elysia";
import lambangDesaFindById from "./find-by-id";
import lambangDesaUpdate from "./update";
const LambangDesa = new Elysia({
prefix: "/lambang",
tags: ["Desa/Profile"],
})
.get("/:id", async (context) => {
const response = await lambangDesaFindById(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await lambangDesaUpdate(context);
return response;
},
{
body: t.Object({
judul: t.String(),
deskripsi: t.String(),
}),
}
);
export default LambangDesa;

View File

@@ -0,0 +1,50 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function lambangDesaUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = await context.body as {
judul: string;
deskripsi: string;
};
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), { status: 400 });
}
const existing = await prisma.lambangDesa.findUnique({
where: { id },
});
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Data tidak ditemukan",
}), { status: 404 });
}
const updated = await prisma.lambangDesa.update({
where: { id },
data: {
judul: body.judul,
deskripsi: body.deskripsi,
},
});
return new Response(JSON.stringify({
success: true,
message: "Berhasil memperbarui data",
data: updated,
}), { status: 200 });
} catch (error) {
console.error("Update error:", error);
return new Response(JSON.stringify({
success: false,
message: "Gagal memperbarui data: " + (error instanceof Error ? error.message : 'Unknown error'),
}), { status: 500 });
}
}

View File

@@ -1,28 +0,0 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.ProfileDesaGetPayload<{
select: {
id: true;
lambang: true;
}
}>
export default async function lambangDesaUpdate(context: Context) {
const body = context.body as FormCreate;
await prisma.profileDesa.update({
where: {
id: body.id
},
data: {
lambang: body.lambang,
}
})
return {
success: true,
message: "Profile Desa Berhasil Diupdate",
}
}

View File

@@ -0,0 +1,53 @@
import prisma from "@/lib/prisma";
export default async function maskotDesaFindById(request: Request){
const url = new URL(request.url);
const pathSegments = url.pathname.split('/');
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json({
success: false,
message: "ID tidak boleh kosong",
}, {status: 400})
}
try {
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, {status: 400})
}
const data = await prisma.maskotDesa.findUnique({
where: { id },
include: {
images: {
include: {
image: true,
}
}
}
})
if(!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, {status: 404})
}
return Response.json({
success: true,
message: "Berhasil mengambil data berdasarkan ID",
data,
}, {status: 200})
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'),
}, {status: 500})
}
}

View File

@@ -0,0 +1,31 @@
import maskotDesaUpdate from "./update";
import maskotDesaFindById from "./find-by-id";
import Elysia, { t } from "elysia";
const MaskotDesa = new Elysia({
prefix: "/maskot",
tags: ["Desa/Profile"],
})
.get("/:id", async (context) => {
const response = await maskotDesaFindById(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await maskotDesaUpdate(context);
return response;
},
{
body: t.Object({
maskot: t.String(),
images: t.Array(
t.Object({
imageId: t.String(),
label: t.String(),
})
),
}),
}
)
export default MaskotDesa;

View File

@@ -0,0 +1,78 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function maskotDesaUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = await context.body as {
judul: string;
deskripsi: string;
images: { label: string; imageId: string }[];
};
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), { status: 400 });
}
const existing = await prisma.maskotDesa.findUnique({
where: { id },
include: { images: { include: { image: true } } }
});
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Data tidak ditemukan",
}), { status: 404 });
}
// Hapus semua gambar lama (dan file-nya jika perlu)
for (const old of existing.images) {
try {
await prisma.fileStorage.delete({ where: { id: old.imageId } });
// opsional: hapus file dari disk juga kalau kamu simpan file fisik
// await fs.unlink(path.join(old.image.path, old.image.name));
} catch (error) {
console.warn("Gagal hapus gambar lama:", error);
}
}
// Update profile & re-create images
const updated = await prisma.maskotDesa.update({
where: { id },
data: {
judul: body.judul,
deskripsi: body.deskripsi,
images: {
deleteMany: {},
create: body.images.map((img) => ({
label: img.label,
imageId: img.imageId
}))
}
},
include: {
images: {
include: {
image: true
}
}
}
});
return new Response(JSON.stringify({
success: true,
message: "Data berhasil diperbarui",
data: updated,
}), { status: 200 });
} catch (error) {
console.error("Gagal update MaskotDesa:", error);
return new Response(JSON.stringify({
success: false,
message: "Terjadi kesalahan saat update",
}), { status: 500 });
}
}

View File

@@ -1,29 +0,0 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.ProfileDesaGetPayload<{
select: {
id: true;
maskot: true;
}
}>
export default async function maskotDesaUpdate(context: Context) {
const body = context.body as FormCreate;
await prisma.profileDesa.update({
where: {
id: body.id
},
data: {
maskot: body.maskot,
}
})
return {
success: true,
message: "Profile Desa Berhasil Diupdate",
}
}

View File

@@ -0,0 +1,45 @@
import prisma from "@/lib/prisma";
export default async function sejarahDesaFindById(request: Request) {
const url = new URL(request.url);
const pathSegments = url.pathname.split('/');
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json({
success: false,
message: "ID tidak boleh kosong",
}, {status: 400})
}
try {
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, {status: 400})
}
const data = await prisma.sejarahDesa.findUnique({
where: { id },
})
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, {status: 404})
}
return Response.json({
success: true,
data,
}, {status: 200})
} catch (error) {
console.error("Gagal mengambil data sejarah desa:", error)
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengambil data",
}, {status: 500})
}
}

View File

@@ -0,0 +1,27 @@
import Elysia, { t } from "elysia";
import sejarahDesaFindById from "./find-by-id";
import sejarahDesaUpdate from "./update";
const SejarahDesa = new Elysia({
prefix: "/sejarah",
tags: ["Desa/Profile"],
})
.get("/:id", async (context) => {
const response = await sejarahDesaFindById(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await sejarahDesaUpdate(context);
return response;
},
{
body: t.Object({
judul: t.String(),
deskripsi: t.String(),
}),
}
);
export default SejarahDesa;

View File

@@ -1,29 +1,50 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.ProfileDesaGetPayload<{
select: {
id: true;
sejarah: true;
}
}>
export default async function sejarahDesaUpdate(context: Context) {
const body = context.body as FormCreate;
try {
const id = context.params?.id as string;
const body = await context.body as {
judul: string;
deskripsi: string;
};
await prisma.profileDesa.update({
where: {
id: body.id
},
data: {
sejarah: body.sejarah,
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), { status: 400 });
}
})
return {
success: true,
message: "Profile Desa Berhasil Diupdate",
const existing = await prisma.sejarahDesa.findUnique({
where: { id },
});
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Data tidak ditemukan",
}), { status: 404 });
}
const updated = await prisma.sejarahDesa.update({
where: { id },
data: {
judul: body.judul,
deskripsi: body.deskripsi,
},
});
return new Response(JSON.stringify({
success: true,
message: "Berhasil memperbarui data",
data: updated,
}), { status: 200 });
} catch (error) {
console.error("Update error:", error);
return new Response(JSON.stringify({
success: false,
message: "Gagal memperbarui data: " + (error instanceof Error ? error.message : 'Unknown error'),
}), { status: 500 });
}
}
}

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function visiMisiDesaFindById(request: Request) {
const url = new URL(request.url);
const pathSegments = url.pathname.split('/');
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return Response.json({
success: false,
message: "ID tidak boleh kosong",
}, {status: 400})
}
try {
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, {status: 400})
}
const data = await prisma.visiMisiDesa.findUnique({
where: { id },
})
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, {status: 404})
}
return Response.json({
success: true,
message: "Data ditemukan",
data: data,
}, {status: 200})
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal menemukan data: " + (error instanceof Error ? error.message : 'Unknown error'),
}, {status: 500})
}
}

View File

@@ -0,0 +1,27 @@
import Elysia, { t } from "elysia";
import visiMisiDesaUpdate from "./update";
import visiMisiDesaFindById from "./find-by-id";
const VisiMisiDesa = new Elysia({
prefix: "/visi-misi",
tags: ["Desa/Profile"],
})
.get("/:id", async (context) => {
const response = await visiMisiDesaFindById(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await visiMisiDesaUpdate(context);
return response;
},
{
body: t.Object({
visi: t.String(),
misi: t.String(),
}),
}
);
export default VisiMisiDesa;

View File

@@ -0,0 +1,50 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function visiMisiDesaUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = await context.body as {
visi: string;
misi: string;
};
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), { status: 400 });
}
const existing = await prisma.visiMisiDesa.findUnique({
where: { id },
});
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Data tidak ditemukan",
}), { status: 404 });
}
const updated = await prisma.visiMisiDesa.update({
where: { id },
data: {
visi: body.visi,
misi: body.misi,
},
});
return new Response(JSON.stringify({
success: true,
message: "Berhasil memperbarui data",
data: updated,
}), { status: 200 });
} catch (error) {
console.error("Update error:", error);
return new Response(JSON.stringify({
success: false,
message: "Gagal memperbarui data: " + (error instanceof Error ? error.message : 'Unknown error'),
}), { status: 500 });
}
}

View File

@@ -1,29 +0,0 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.ProfileDesaGetPayload<{
select: {
id: true;
visi: true;
misi: true;
}
}>
export default async function visimisiDesaUpdate(context: Context) {
const body = context.body as FormCreate;
await prisma.profileDesa.update({
where: {
id: body.id
},
data: {
visi: body.visi,
misi: body.misi,
}
})
return {
success: true,
message: "Profile Desa Berhasil Diupdate",
}
}