Save
This commit is contained in:
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- You are about to drop the column `deletedAt` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `deskripsi` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `imageId` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `isActive` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `name` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- Added the required column `nama` to the `KontakDarurat` table without a default value. This is not possible if the table is not empty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "KontakDarurat" DROP CONSTRAINT "KontakDarurat_imageId_fkey";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "KontakDarurat" DROP COLUMN "deletedAt",
|
||||||
|
DROP COLUMN "deskripsi",
|
||||||
|
DROP COLUMN "imageId",
|
||||||
|
DROP COLUMN "isActive",
|
||||||
|
DROP COLUMN "name",
|
||||||
|
ADD COLUMN "icon" TEXT,
|
||||||
|
ADD COLUMN "nama" TEXT NOT NULL,
|
||||||
|
ADD COLUMN "urutan" INTEGER;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "KontakItem" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"nama" TEXT NOT NULL,
|
||||||
|
"nomorTelepon" TEXT NOT NULL,
|
||||||
|
"icon" TEXT,
|
||||||
|
"kategoriId" TEXT NOT NULL,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "KontakItem_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "PasarDesa" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"nama" TEXT NOT NULL,
|
||||||
|
"harga" INTEGER NOT NULL,
|
||||||
|
"satuan" TEXT NOT NULL,
|
||||||
|
"alamat" TEXT NOT NULL,
|
||||||
|
"imageId" TEXT NOT NULL,
|
||||||
|
"rating" DOUBLE PRECISION NOT NULL,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
"deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
"kategoriId" TEXT NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "PasarDesa_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "KategoriMakanan" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"nama" TEXT NOT NULL,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
"deletedAt" TIMESTAMP(3),
|
||||||
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
|
||||||
|
CONSTRAINT "KategoriMakanan_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "KontakItem" ADD CONSTRAINT "KontakItem_kategoriId_fkey" FOREIGN KEY ("kategoriId") REFERENCES "KontakDarurat"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "PasarDesa" ADD CONSTRAINT "PasarDesa_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "PasarDesa" ADD CONSTRAINT "PasarDesa_kategoriId_fkey" FOREIGN KEY ("kategoriId") REFERENCES "KategoriMakanan"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- You are about to drop the column `icon` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `nama` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `urutan` on the `KontakDarurat` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `deletedAt` on the `KontakDaruratKeamanan` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `isActive` on the `KontakDaruratKeamanan` table. All the data in the column will be lost.
|
||||||
|
- You are about to drop the column `kontak` on the `KontakDaruratKeamanan` table. All the data in the column will be lost.
|
||||||
|
- Added the required column `deskripsi` to the `KontakDarurat` table without a default value. This is not possible if the table is not empty.
|
||||||
|
- Added the required column `imageId` to the `KontakDarurat` table without a default value. This is not possible if the table is not empty.
|
||||||
|
- Added the required column `name` to the `KontakDarurat` table without a default value. This is not possible if the table is not empty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- DropForeignKey
|
||||||
|
ALTER TABLE "KontakItem" DROP CONSTRAINT "KontakItem_kategoriId_fkey";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "KontakDarurat" DROP COLUMN "icon",
|
||||||
|
DROP COLUMN "nama",
|
||||||
|
DROP COLUMN "urutan",
|
||||||
|
ADD COLUMN "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
ADD COLUMN "deskripsi" TEXT NOT NULL,
|
||||||
|
ADD COLUMN "imageId" TEXT NOT NULL,
|
||||||
|
ADD COLUMN "isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
ADD COLUMN "name" TEXT NOT NULL;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "KontakDaruratKeamanan" DROP COLUMN "deletedAt",
|
||||||
|
DROP COLUMN "isActive",
|
||||||
|
DROP COLUMN "kontak",
|
||||||
|
ADD COLUMN "urutan" INTEGER;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "KontakDarurat" ADD CONSTRAINT "KontakDarurat_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "KontakItem" ADD CONSTRAINT "KontakItem_kategoriId_fkey" FOREIGN KEY ("kategoriId") REFERENCES "KontakDaruratKeamanan"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
@@ -84,6 +84,10 @@ model FileStorage {
|
|||||||
Pelapor Pelapor[]
|
Pelapor Pelapor[]
|
||||||
|
|
||||||
PasarDesa PasarDesa[]
|
PasarDesa PasarDesa[]
|
||||||
|
|
||||||
|
KontakDaruratKeamanan KontakDaruratKeamanan[]
|
||||||
|
|
||||||
|
KontakItem KontakItem[]
|
||||||
}
|
}
|
||||||
|
|
||||||
//========================================= MENU PPID ========================================= //
|
//========================================= MENU PPID ========================================= //
|
||||||
@@ -928,14 +932,25 @@ model LayananPolsek {
|
|||||||
|
|
||||||
// ========================================= KONTAK DARURAT ========================================= //
|
// ========================================= KONTAK DARURAT ========================================= //
|
||||||
model KontakDaruratKeamanan {
|
model KontakDaruratKeamanan {
|
||||||
id String @id @default(cuid())
|
id String @id @default(uuid())
|
||||||
nama String // contoh: "Polisi", "Ambulans", "Pemadam Kebakaran"
|
nama String // contoh: "Layanan Darurat", "Fasilitas Kesehatan"
|
||||||
kontak String // contoh: "081xxxxxxxxxx"
|
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||||
icon String? // opsional, untuk simpan nama icon-nya jika mau
|
imageId String?
|
||||||
|
kontakItems KontakItem[]
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
model KontakItem {
|
||||||
|
id String @id @default(uuid())
|
||||||
|
nama String // contoh: "Polisi", "Ambulans", "Puskesmas Darmasaba"
|
||||||
|
nomorTelepon String
|
||||||
|
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||||
|
imageId String?
|
||||||
|
kategori KontakDaruratKeamanan @relation(fields: [kategoriId], references: [id])
|
||||||
|
kategoriId String
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
deletedAt DateTime @default(now())
|
|
||||||
isActive Boolean @default(true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================= PENCEGAHAN KRIMINALITAS ========================================= //
|
// ========================================= PENCEGAHAN KRIMINALITAS ========================================= //
|
||||||
|
|||||||
@@ -5,16 +5,16 @@ import { proxy } from "valtio";
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
const templateForm = z.object({
|
const templateForm = z.object({
|
||||||
nama: z.string().min(3, "Nama minimal 3 karakter"),
|
nama: z.string().min(1, "Nama minimal 1 karakter"),
|
||||||
jarakKeDesa: z.string().min(3, "Jarak minimal 3 karakter"),
|
jarakKeDesa: z.string().min(1, "Jarak minimal 1 karakter"),
|
||||||
alamat: z.string().min(3, "Alamat minimal 3 karakter"),
|
alamat: z.string().min(1, "Alamat minimal 1 karakter"),
|
||||||
nomorTelepon: z.string().min(3, "Nomor Telepon minimal 3 karakter"),
|
nomorTelepon: z.string().min(1, "Nomor Telepon minimal 1 karakter"),
|
||||||
jamOperasional: z.string().min(3, "Jam Operasional minimal 3 karakter"),
|
jamOperasional: z.string().min(1, "Jam Operasional minimal 1 karakter"),
|
||||||
embedMapUrl: z.string().min(3, "Embed Map Url minimal 3 karakter"),
|
embedMapUrl: z.string().min(1, "Embed Map Url minimal 1 karakter"),
|
||||||
namaTempatMaps: z.string().min(3, "Nama Tempat Maps minimal 3 karakter"),
|
namaTempatMaps: z.string().min(1, "Nama Tempat Maps minimal 1 karakter"),
|
||||||
alamatMaps: z.string().min(3, "Alamat Maps minimal 3 karakter"),
|
alamatMaps: z.string().min(1, "Alamat Maps minimal 1 karakter"),
|
||||||
linkPetunjukArah: z.string().min(3, "Link Petunjuk Arah minimal 3 karakter"),
|
linkPetunjukArah: z.string().min(1, "Link Petunjuk Arah minimal 1 karakter"),
|
||||||
layananPolsekId: z.string().min(3, "Layanan Polsek Id minimal 3 karakter"),
|
layananPolsekId: z.string().min(1, "Layanan Polsek Id minimal 1 karakter"),
|
||||||
});
|
});
|
||||||
|
|
||||||
const defaultForm = {
|
const defaultForm = {
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
import Elysia from "elysia";
|
import Elysia from "elysia";
|
||||||
import KeamananLingkungan from "./keamanan-lingkungan";
|
import KeamananLingkungan from "./keamanan-lingkungan";
|
||||||
import PolsekTerdekat from "./polsek-terdekat";
|
import PolsekTerdekat from "./polsek-terdekat";
|
||||||
import KontakDarurat from "./kontak-darurat";
|
|
||||||
import PencegahanKriminalitas from "./pencegahan-kriminalitas";
|
import PencegahanKriminalitas from "./pencegahan-kriminalitas";
|
||||||
import MenuTipsKeamanan from "./tips-keamanan";
|
import MenuTipsKeamanan from "./tips-keamanan";
|
||||||
import LaporanPublik from "./laporan-publik";
|
import LaporanPublik from "./laporan-publik";
|
||||||
import LayananPolsek from "./layanan-polsek";
|
import LayananPolsek from "./layanan-polsek";
|
||||||
|
import KontakDaruratKeamanan from "./kontak-darurat-keamanan";
|
||||||
|
|
||||||
const Keamanan = new Elysia({ prefix: "/api/keamanan", tags: ["Keamanan"] })
|
const Keamanan = new Elysia({ prefix: "/api/keamanan", tags: ["Keamanan"] })
|
||||||
.use(KeamananLingkungan)
|
.use(KeamananLingkungan)
|
||||||
.use(PolsekTerdekat)
|
.use(PolsekTerdekat)
|
||||||
.use(KontakDarurat)
|
|
||||||
.use(PencegahanKriminalitas)
|
.use(PencegahanKriminalitas)
|
||||||
.use(MenuTipsKeamanan)
|
.use(MenuTipsKeamanan)
|
||||||
.use(LaporanPublik)
|
.use(LaporanPublik)
|
||||||
.use(LayananPolsek)
|
.use(LayananPolsek)
|
||||||
|
.use(KontakDaruratKeamanan)
|
||||||
export default Keamanan;
|
export default Keamanan;
|
||||||
|
|||||||
@@ -1,22 +1,28 @@
|
|||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import { Prisma } from "@prisma/client";
|
|
||||||
import { Context } from "elysia";
|
import { Context } from "elysia";
|
||||||
|
|
||||||
type FormCreate = Prisma.KontakDaruratKeamananGetPayload<{
|
type FormCreate = {
|
||||||
select: {
|
nama: string,
|
||||||
nama: true,
|
imageId?: string,
|
||||||
kontak: true,
|
kontakItems: {
|
||||||
icon: true,
|
nama: string,
|
||||||
}
|
nomorTelepon: string,
|
||||||
}>
|
imageId?: string
|
||||||
|
}[]
|
||||||
|
}
|
||||||
export default async function kontakDaruratKeamananCreate(context: Context){
|
export default async function kontakDaruratKeamananCreate(context: Context){
|
||||||
const body = context.body as FormCreate
|
const body = context.body as FormCreate
|
||||||
|
|
||||||
await prisma.kontakDaruratKeamanan.create({
|
await prisma.kontakDaruratKeamanan.create({
|
||||||
data: {
|
data: {
|
||||||
nama: body.nama,
|
nama: body.nama,
|
||||||
kontak: body.kontak,
|
imageId: body.imageId,
|
||||||
icon: body.icon,
|
kontakItems: {
|
||||||
|
create: body.kontakItems,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
kontakItems: true,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return {
|
return {
|
||||||
@@ -11,6 +11,12 @@ export default async function kontakDaruratKeamananDelete(context: Context){
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await prisma.kontakItem.deleteMany({
|
||||||
|
where: {
|
||||||
|
kategoriId: id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const kontakDaruratKeamanan = await prisma.kontakDaruratKeamanan.findUnique({
|
const kontakDaruratKeamanan = await prisma.kontakDaruratKeamanan.findUnique({
|
||||||
where: { id },
|
where: { id },
|
||||||
});
|
});
|
||||||
@@ -3,7 +3,13 @@ import prisma from "@/lib/prisma";
|
|||||||
export default async function kontakDaruratKeamananFindMany() {
|
export default async function kontakDaruratKeamananFindMany() {
|
||||||
try {
|
try {
|
||||||
const data = await prisma.kontakDaruratKeamanan.findMany({
|
const data = await prisma.kontakDaruratKeamanan.findMany({
|
||||||
where: { isActive: true },
|
include: {
|
||||||
|
kontakItems: true,
|
||||||
|
image: true,
|
||||||
|
},
|
||||||
|
orderBy: {
|
||||||
|
createdAt: "desc",
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -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 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
@@ -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",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
@@ -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",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,7 +9,7 @@ import BackButton from '../../desa/layanan/_com/BackButto';
|
|||||||
function Page() {
|
function Page() {
|
||||||
const allList = useProxy(stateProfilePPID)
|
const allList = useProxy(stateProfilePPID)
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
allList.profile.load("1") // Assuming "1" is your default ID, adjust as needed
|
allList.profile.load("edit") // Assuming "1" is your default ID, adjust as needed
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
if (!allList.profile.data) return <Stack bg={colors.Bg} py={"xl"} gap={"22"}>
|
if (!allList.profile.data) return <Stack bg={colors.Bg} py={"xl"} gap={"22"}>
|
||||||
@@ -47,7 +47,7 @@ function Page() {
|
|||||||
<Paper p={"xl"} bg={colors['white-trans-1']}>
|
<Paper p={"xl"} bg={colors['white-trans-1']}>
|
||||||
<Box px={{ base: "md", md: 100 }}>
|
<Box px={{ base: "md", md: 100 }}>
|
||||||
<Flex align={"center"} gap={50}>
|
<Flex align={"center"} gap={50}>
|
||||||
<Image src={"/api/img/darmasaba-icon.png"} h={{ base: 80, md: 150 }} alt='' />
|
<Image src={"/darmasaba-icon.png"} h={{ base: 80, md: 150 }} alt='' />
|
||||||
<Text fz={{ base: "1.4rem", md: "2rem", lg: "2.5rem", xl: "3rem" }} fw={'bold'}>PROFIL PIMPINAN BADAN PUBLIK DESA DARMASABA </Text>
|
<Text fz={{ base: "1.4rem", md: "2rem", lg: "2.5rem", xl: "3rem" }} fw={'bold'}>PROFIL PIMPINAN BADAN PUBLIK DESA DARMASABA </Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
</Box>
|
</Box>
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ function LandingPage() {
|
|||||||
p={"sm"}
|
p={"sm"}
|
||||||
>
|
>
|
||||||
<Image
|
<Image
|
||||||
src={"/assets/images/darmasaba-icon.png"}
|
src={"/darmasaba-icon.png"}
|
||||||
alt="icon"
|
alt="icon"
|
||||||
sizes="100%"
|
sizes="100%"
|
||||||
/>
|
/>
|
||||||
@@ -163,7 +163,7 @@ function LandingPage() {
|
|||||||
bg={"white"}
|
bg={"white"}
|
||||||
>
|
>
|
||||||
<Image
|
<Image
|
||||||
src={"/api/img/pudak-icon.png"}
|
src={"/pudak-icon.png"}
|
||||||
alt="icon"
|
alt="icon"
|
||||||
sizes={"100%"}
|
sizes={"100%"}
|
||||||
fit="contain"
|
fit="contain"
|
||||||
|
|||||||
Reference in New Issue
Block a user