This commit is contained in:
2025-07-01 20:57:32 +08:00
parent 4724b7473d
commit 1c5e4410c4
16 changed files with 360 additions and 174 deletions

View File

@@ -1,18 +1,18 @@
import Elysia from "elysia";
import KeamananLingkungan from "./keamanan-lingkungan";
import PolsekTerdekat from "./polsek-terdekat";
import KontakDarurat from "./kontak-darurat";
import PencegahanKriminalitas from "./pencegahan-kriminalitas";
import MenuTipsKeamanan from "./tips-keamanan";
import LaporanPublik from "./laporan-publik";
import LayananPolsek from "./layanan-polsek";
import KontakDaruratKeamanan from "./kontak-darurat-keamanan";
const Keamanan = new Elysia({ prefix: "/api/keamanan", tags: ["Keamanan"] })
.use(KeamananLingkungan)
.use(PolsekTerdekat)
.use(KontakDarurat)
.use(PencegahanKriminalitas)
.use(MenuTipsKeamanan)
.use(LaporanPublik)
.use(LayananPolsek)
.use(KontakDaruratKeamanan)
export default Keamanan;

View File

@@ -1,22 +1,28 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.KontakDaruratKeamananGetPayload<{
select: {
nama: true,
kontak: true,
icon: true,
}
}>
type FormCreate = {
nama: string,
imageId?: string,
kontakItems: {
nama: string,
nomorTelepon: string,
imageId?: string
}[]
}
export default async function kontakDaruratKeamananCreate(context: Context){
const body = context.body as FormCreate
await prisma.kontakDaruratKeamanan.create({
data: {
nama: body.nama,
kontak: body.kontak,
icon: body.icon,
imageId: body.imageId,
kontakItems: {
create: body.kontakItems,
},
},
include: {
kontakItems: true,
}
})
return {

View File

@@ -11,6 +11,12 @@ export default async function kontakDaruratKeamananDelete(context: Context){
};
}
await prisma.kontakItem.deleteMany({
where: {
kategoriId: id,
},
});
const kontakDaruratKeamanan = await prisma.kontakDaruratKeamanan.findUnique({
where: { id },
});

View File

@@ -3,7 +3,13 @@ import prisma from "@/lib/prisma";
export default async function kontakDaruratKeamananFindMany() {
try {
const data = await prisma.kontakDaruratKeamanan.findMany({
where: { isActive: true },
include: {
kontakItems: true,
image: true,
},
orderBy: {
createdAt: "desc",
}
});
return {

View File

@@ -0,0 +1,69 @@
import prisma from "@/lib/prisma";
export default async function kontakDaruratKeamananFindUnique(
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.kontakDaruratKeamanan.findUnique({
where: { id },
include: {
kontakItems: true,
image: true,
},
});
if (!data) {
return Response.json(
{
success: false,
message: "Kontak darurat keamanan tidak ditemukan",
},
{ status: 404 }
);
}
return Response.json(
{
success: true,
message: "Success fetch kontak darurat keamanan by ID",
data,
},
{ status: 200 }
);
} catch (error) {
console.error("Find by ID error:", error);
return Response.json(
{
success: false,
message:
"Gagal mengambil kontak darurat keamanan: " +
(error instanceof Error ? error.message : "Unknown error"),
},
{ status: 500 }
);
}
}

View File

@@ -0,0 +1,53 @@
import Elysia, { t } from "elysia";
import kontakDaruratKeamananCreate from "./create";
import kontakDaruratKeamananDelete from "./del";
import kontakDaruratKeamananFindMany from "./findMany";
import kontakDaruratKeamananFindUnique from "./findUnique";
import kontakDaruratKeamananUpdate from "./updt";
const KontakDaruratKeamanan = new Elysia({
prefix: "/kontak-darurat-keamanan",
tags: ["Keamanan/Kontak Darurat"],
})
.get("/find-many", kontakDaruratKeamananFindMany)
.get("/:id", async (context) => {
const response = await kontakDaruratKeamananFindUnique(
new Request(context.request)
);
return response;
})
.post("/create", kontakDaruratKeamananCreate, {
body: t.Object({
nama: t.String(),
imageId: t.Optional(t.String()),
kontakItems: t.Array(
t.Object({
nama: t.String(),
nomorTelepon: t.String(),
imageId: t.Optional(t.String()),
})
),
}),
})
.delete("/del/:id", kontakDaruratKeamananDelete)
.put(
"/:id",
async (context) => {
const response = await kontakDaruratKeamananUpdate(context);
return response;
},
{
body: t.Object({
nama: t.String(),
imageId: t.Optional(t.String()),
kontakItems: t.Array(
t.Object({
nama: t.String(),
nomorTelepon: t.String(),
imageId: t.Optional(t.String()),
})
),
}),
}
);
export default KontakDaruratKeamanan;

View File

@@ -0,0 +1,57 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
nama: string;
imageId?: string;
kontakItems: {
nama: string;
nomorTelepon: string;
imageId?: string;
}[];
};
export default async function kontakDaruratKeamananUpdate(context: Context){
try {
const { id } = context.params as { id: string };
const body = context.body as FormUpdate;
// Hapus kontakItems lama
await prisma.kontakItem.deleteMany({
where: {
kategoriId: id,
},
});
// Update utama
const updated = await prisma.kontakDaruratKeamanan.update({
where: { id },
data: {
nama: body.nama,
imageId: body.imageId,
kontakItems: {
create: body.kontakItems,
},
},
include: {
kontakItems: true,
},
});
return {
success: true,
message: "Success update kontak darurat keamanan",
data: updated,
};
} catch (error) {
console.error("Error updating kontak darurat keamanan:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengupdate kontak darurat keamanan",
}, { status: 500 ,
headers: {
"Content-Type": "application/json",
},
});
}
}

View File

@@ -1,46 +0,0 @@
import prisma from "@/lib/prisma";
export default async function kontakDaruratKeamananFindUnique(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.kontakDaruratKeamanan.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Kontak darurat keamanan tidak ditemukan",
}, { status: 404 });
}
return Response.json({
success: true,
message: "Success fetch kontak darurat keamanan by ID",
data,
}, { status: 200 });
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil kontak darurat keamanan: " + (error instanceof Error ? error.message : 'Unknown error'),
}, { status: 500 });
}
}

View File

@@ -1,32 +0,0 @@
import Elysia, { t } from "elysia";
import kontakDaruratKeamananFindMany from "./findMany";
import kontakDaruratKeamananFindUnique from "./findUnique";
import kontakDaruratKeamananCreate from "./create";
import kontakDaruratKeamananDelete from "./del";
const kontakDaruratKeamanan = new Elysia({ prefix: "/kontak-darurat", tags: ["Keamanan/Kontak Darurat"] })
.get("/find-many", kontakDaruratKeamananFindMany)
.get("/:id", async (context) => {
const response = await kontakDaruratKeamananFindUnique(new Request(context.request));
return response;
})
.post("/create", kontakDaruratKeamananCreate, {
body: t.Object({
nama: t.String(),
kontak: t.String(),
icon: t.String(),
}),
})
.delete("/del/:id", kontakDaruratKeamananDelete)
.put("/:id", async (context) => {
const response = await kontakDaruratKeamananCreate(context);
return response;
},
{
body: t.Object({
nama: t.String(),
kontak: t.String(),
icon: t.String(),
}),
})
export default kontakDaruratKeamanan;

View File

@@ -1,61 +0,0 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormUpdate = Prisma.KontakDaruratKeamananGetPayload<{
select: {
nama: true;
kontak: true;
icon: true;
}
}>
export default async function kontakDaruratUpdate(context: Context){
try {
const id = context.params?.id;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {nama, kontak, icon} = body;
if(!id){
return Response.json({
success: false,
message: "ID tidak diberikan",
}, { status: 400 });
}
const existing = await prisma.kontakDaruratKeamanan.findUnique({
where: { id },
});
if (!existing) {
return Response.json({
success: false,
message: "Kontak darurat keamanan tidak ditemukan",
}, { status: 404 });
}
const updated = await prisma.kontakDaruratKeamanan.update({
where: { id },
data: {
nama,
kontak,
icon,
},
});
return Response.json({
success: true,
message: "Success update kontak darurat keamanan",
data: updated,
}, { status: 200 });
} catch (error) {
console.error("Error updating kontak darurat keamanan:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengupdate kontak darurat keamanan",
}, { status: 500 ,
headers: {
"Content-Type": "application/json",
},
});
}
}