Fix Admin - User Menu Keamanan, Submenu Pencegahan Kriminalitas

This commit is contained in:
2025-09-17 17:54:03 +08:00
parent 79ad39fc55
commit 9f72e94557
18 changed files with 782 additions and 847 deletions

View File

@@ -1,81 +1,35 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type ProgramKeamananInput = {
nama: string;
deskripsi: string;
slug: string;
};
type TipsKeamanan = {
judul: string;
konten: string;
slug: string;
};
type VideoKeamanan = {
judul: string;
deskripsi: string;
videoUrl: string;
slug: string;
};
type createdPencegahanKriminalitas = {
programKeamanan: ProgramKeamananInput;
tipsKeamanan: TipsKeamanan;
videoKeamanan: VideoKeamanan;
};
type FormCreate = Prisma.PencegahanKriminalitasGetPayload<{
select: {
judul: true;
deskripsi: true;
deskripsiSingkat: true;
linkVideo: true;
};
}>;
const pencegahanKriminalitasCreate = async (context: Context) => {
const { programKeamanan, tipsKeamanan, videoKeamanan } =
(await context.body) as createdPencegahanKriminalitas;
const body = context.body as FormCreate;
const createdProgram = await prisma.programKeamanan.create({
await prisma.pencegahanKriminalitas.create({
data: {
nama: programKeamanan.nama,
deskripsi: programKeamanan.deskripsi,
slug: programKeamanan.slug,
judul: body.judul,
deskripsi: body.deskripsi,
deskripsiSingkat: body.deskripsiSingkat,
linkVideo: body.linkVideo,
},
});
const createdTips = await prisma.tipsKeamanan.create({
return {
success: true,
message: "Success create pencegahan kriminalitas",
data: {
judul: tipsKeamanan.judul,
konten: tipsKeamanan.konten,
slug: tipsKeamanan.slug,
...body,
},
});
const createdVideo = await prisma.videoKeamanan.create({
data: {
judul: videoKeamanan.judul,
deskripsi: videoKeamanan.deskripsi,
videoUrl: videoKeamanan.videoUrl,
slug: videoKeamanan.slug,
},
});
const createdPencegahanKriminalitas =
await prisma.pencegahanKriminalitas.create({
data: {
programKeamananId: createdProgram.id,
tipsKeamananId: createdTips.id,
videoKeamananId: createdVideo.id,
},
include: {
programKeamanan: true,
tipsKeamanan: true,
videoKeamanan: true,
},
});
return Response.json(
{
success: true,
message: "Success create program keamanan",
data: createdPencegahanKriminalitas,
},
{ status: 200 }
);
status: 200,
};
};
export default pencegahanKriminalitasCreate;

View File

@@ -13,11 +13,6 @@ const pencegahanKriminalitasDelete = async (context: Context) => {
const pencegahanKriminalitas = await prisma.pencegahanKriminalitas.findUnique({
where: { id },
include: {
programKeamanan: true,
tipsKeamanan: true,
videoKeamanan: true,
}
});
if (!pencegahanKriminalitas) {

View File

@@ -0,0 +1,60 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
export default async function pencegahanKriminalitasFindFirst(context: Context) {
// Ambil parameter query
const search = (context.query.search as string) || "";
// Buat where clause
const where: Prisma.PencegahanKriminalitasWhereInput = { isActive: true };
if (search) {
where.OR = [
{
judul: {
contains: search,
mode: "insensitive" as const,
},
},
{
deskripsi: {
contains: search,
mode: "insensitive" as const,
},
},
{
deskripsiSingkat: {
contains: search,
mode: "insensitive" as const,
},
},
];
}
try {
const data = await prisma.pencegahanKriminalitas.findFirst({
where,
orderBy: { createdAt: "desc" }, // ambil yang terbaru
});
if (!data) {
return {
success: false,
message: "Data pencegahan kriminalitas tidak ditemukan",
};
}
return {
success: true,
message: "Success fetch first pencegahan kriminalitas",
data,
};
} catch (error) {
console.error("Find first error:", error);
return {
success: false,
message: "Failed fetch first pencegahan kriminalitas",
};
}
}

View File

@@ -16,18 +16,21 @@ export default async function pencegahanKriminalitasFindMany(context: Context) {
if (search) {
where.OR = [
{
programKeamanan: {
nama: { contains: search, mode: "insensitive" as const },
judul: {
contains: search,
mode: "insensitive" as const,
},
},
{
tipsKeamanan: {
judul: { contains: search, mode: "insensitive" as const },
deskripsi: {
contains: search,
mode: "insensitive" as const,
},
},
{
videoKeamanan: {
judul: { contains: search, mode: "insensitive" as const },
deskripsiSingkat: {
contains: search,
mode: "insensitive" as const,
},
},
];
@@ -36,11 +39,6 @@ export default async function pencegahanKriminalitasFindMany(context: Context) {
const [data, total] = await Promise.all([
prisma.pencegahanKriminalitas.findMany({
where,
include: {
programKeamanan: true,
tipsKeamanan: true,
videoKeamanan: true,
},
skip,
take: limit,
orderBy: { createdAt: "desc" },

View File

@@ -22,11 +22,6 @@ export default async function pencegahanKriminalitasFindUnique(request: Request)
const data = await prisma.pencegahanKriminalitas.findUnique({
where: {id},
include: {
programKeamanan: true,
tipsKeamanan: true,
videoKeamanan: true,
}
})
if (!data) {

View File

@@ -4,6 +4,7 @@ import pencegahanKriminalitasFindUnique from "./findUnique";
import pencegahanKriminalitasFindMany from "./findMany";
import pencegahanKriminalitasDelete from "./del";
import pencegahanKriminalitasUpdate from "./updt";
import pencegahanKriminalitasFindFirst from "./findFirst";
const PencegahanKriminalitas = new Elysia({
prefix: "pencegahankriminalitas",
@@ -11,22 +12,10 @@ const PencegahanKriminalitas = new Elysia({
})
.post("/create", pencegahanKriminalitasCreate, {
body: t.Object({
programKeamanan: t.Object({
nama: t.String(),
deskripsi: t.String(),
slug: t.String(),
}),
tipsKeamanan: t.Object({
judul: t.String(),
konten: t.String(),
slug: t.String(),
}),
videoKeamanan: t.Object({
judul: t.String(),
deskripsi: t.String(),
videoUrl: t.String(),
slug: t.String(),
}),
judul: t.String(),
deskripsi: t.String(),
deskripsiSingkat: t.String(),
linkVideo: t.String(),
}),
})
.get("/find-many", pencegahanKriminalitasFindMany)
@@ -36,31 +25,20 @@ const PencegahanKriminalitas = new Elysia({
);
return response;
})
.get("/find-first", pencegahanKriminalitasFindFirst)
.delete("/del/:id", pencegahanKriminalitasDelete)
.put(
":/id",
"/:id",
async (context) => {
const response = await pencegahanKriminalitasUpdate(context);
return response;
},
{
body: t.Object({
programKeamanan: t.Object({
nama: t.String(),
deskripsi: t.String(),
slug: t.String(),
}),
tipsKeamanan: t.Object({
judul: t.String(),
konten: t.String(),
slug: t.String(),
}),
videoKeamanan: t.Object({
judul: t.String(),
deskripsi: t.String(),
videoUrl: t.String(),
slug: t.String(),
}),
judul: t.String(),
deskripsi: t.String(),
deskripsiSingkat: t.String(),
linkVideo: t.String(),
}),
}
);

View File

@@ -3,110 +3,91 @@ import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormUpdate = Prisma.PencegahanKriminalitasGetPayload<{
select: {
id: true;
programKeamanan: true;
tipsKeamanan: true;
videoKeamanan: true;
}
}>
select: {
id: true;
judul: true;
deskripsi: true;
deskripsiSingkat: true;
linkVideo: true;
};
}>;
export default async function pencegahanKriminalitasUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {programKeamanan, tipsKeamanan, videoKeamanan} = body;
const { judul, deskripsi, deskripsiSingkat, linkVideo } = body;
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak diberikan",
}), {
status: 400,
headers: {
"Content-Type": "application/json",
},
});
if (!id) {
return new Response(
JSON.stringify({
success: false,
message: "ID tidak diberikan",
}),
{
status: 400,
headers: {
"Content-Type": "application/json",
},
}
const existing = await prisma.pencegahanKriminalitas.findUnique({
where: { id },
include: {
programKeamanan: true,
tipsKeamanan: true,
videoKeamanan: true,
}
});
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Pencegahan kriminalitas tidak ditemukan",
}), {
status: 404,
headers: {
"Content-Type": "application/json",
},
});
}
await prisma.programKeamanan.update({
where: {id: existing.programKeamananId},
data: {
nama: programKeamanan.nama,
deskripsi: programKeamanan.deskripsi,
slug: programKeamanan.slug,
}
});
await prisma.tipsKeamanan.update({
where: {id: existing.tipsKeamananId},
data: {
judul: tipsKeamanan.judul,
konten: tipsKeamanan.konten,
slug: tipsKeamanan.slug,
}
});
await prisma.videoKeamanan.update({
where: {id: existing.videoKeamananId},
data: {
judul: videoKeamanan.judul,
deskripsi: videoKeamanan.deskripsi,
videoUrl: videoKeamanan.videoUrl,
slug: videoKeamanan.slug,
}
});
const updated = await prisma.pencegahanKriminalitas.update({
where: { id },
data: {
programKeamananId: programKeamanan.id,
tipsKeamananId: tipsKeamanan.id,
videoKeamananId: videoKeamanan.id,
}
});
return new Response(JSON.stringify({
success: true,
message: "Success update pencegahan kriminalitas",
data: updated,
}), {
status: 200,
headers: {
"Content-Type": "application/json",
},
});
} catch (error) {
console.error("Update error:", error);
return new Response(JSON.stringify({
success: false,
message: "Failed update pencegahan kriminalitas",
}), {
status: 500,
headers: {
"Content-Type": "application/json",
},
});
);
}
const existing = await prisma.pencegahanKriminalitas.findUnique({
where: { id },
});
if (!existing) {
return new Response(
JSON.stringify({
success: false,
message: "Pencegahan kriminalitas tidak ditemukan",
}),
{
status: 404,
headers: {
"Content-Type": "application/json",
},
}
);
}
const updated = await prisma.pencegahanKriminalitas.update({
where: { id },
data: {
judul,
deskripsi,
deskripsiSingkat,
linkVideo,
},
});
return new Response(
JSON.stringify({
success: true,
message: "Success update pencegahan kriminalitas",
data: updated,
}),
{
status: 200,
headers: {
"Content-Type": "application/json",
},
}
);
} catch (error) {
console.error("Update error:", error);
return new Response(
JSON.stringify({
success: false,
message: "Failed update pencegahan kriminalitas",
}),
{
status: 500,
headers: {
"Content-Type": "application/json",
},
}
);
}
}