API All Kesehatan

This commit is contained in:
2025-06-19 14:12:57 +08:00
parent 58f538425c
commit 10ecc13ad7
33 changed files with 1920 additions and 3 deletions

View File

@@ -70,6 +70,12 @@ model FileStorage {
ProfileDesaImage ProfileDesaImage[] ProfileDesaImage ProfileDesaImage[]
ProfilePPID ProfilePPID[] ProfilePPID ProfilePPID[]
ProfilPerbekel ProfilPerbekel[] ProfilPerbekel ProfilPerbekel[]
Puskesmas Puskesmas[]
ProgramKesehatan ProgramKesehatan[]
PenangananDarurat PenangananDarurat[]
KontakDarurat KontakDarurat[]
InfoWabahPenyakit InfoWabahPenyakit[]
} }
//========================================= MENU PPID ========================================= // //========================================= MENU PPID ========================================= //
@@ -723,3 +729,98 @@ model Posyandu {
deletedAt DateTime @default(now()) deletedAt DateTime @default(now())
isActive Boolean @default(true) isActive Boolean @default(true)
} }
// ========================================= PUSKESMAS ========================================= //
model Puskesmas {
id String @id @default(cuid())
name String
alamat String
jam JamOperasional @relation(fields: [jamId], references: [id])
jamId String
image FileStorage @relation(fields: [imageId], references: [id])
imageId String
kontak KontakPuskesmas @relation(fields: [kontakId], references: [id])
kontakId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
}
model JamOperasional {
id String @id @default(cuid())
workDays String
weekDays String
holiday String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
Puskesmas Puskesmas[]
}
model KontakPuskesmas {
id String @id @default(cuid())
kontakPuskesmas String
email String
facebook String
kontakUGD String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
Puskesmas Puskesmas[]
}
// ========================================= PROGRAM KESSEHATAN ========================================= //
model ProgramKesehatan {
id String @id @default(cuid())
name String
deskripsiSingkat String
deskripsi String
image FileStorage @relation(fields: [imageId], references: [id])
imageId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
}
// ========================================= PENANGANAN DARURAT ========================================= //
model PenangananDarurat {
id String @id @default(cuid())
name String
deskripsi String
image FileStorage @relation(fields: [imageId], references: [id])
imageId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
}
// ========================================= KONTAK DARURAT ========================================= //
model KontakDarurat {
id String @id @default(cuid())
name String
deskripsi String
image FileStorage @relation(fields: [imageId], references: [id])
imageId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
}
// ========================================= INFO WABAH PENYAKIT ========================================= //
model InfoWabahPenyakit {
id String @id @default(cuid())
name String
deskripsiSingkat String
deskripsiLengkap String
image FileStorage @relation(fields: [imageId], references: [id])
imageId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime @default(now())
isActive Boolean @default(true)
}

View File

@@ -1,5 +1,217 @@
// import { z } from "zod"; import ApiFetch from "@/lib/api-fetch";
import { Prisma } from "@prisma/client";
import { toast } from "react-toastify";
import { proxy } from "valtio";
import { z } from "zod";
// const templateForm = z.object({ // Schema validasi
const templateForm = z.object({
name: z.string().min(1),
alamat: z.string().min(1),
imageId: z.string().min(1),
jam: z.object({
workDays: z.string().min(1),
weekDays: z.string().min(1),
holiday: z.string().min(1),
}),
kontak: z.object({
kontakPuskesmas: z.string().min(1),
email: z.string().min(1),
facebook: z.string().min(1),
kontakUGD: z.string().min(1),
}),
});
// }) // Default form
const defaultForm = {
name: "",
alamat: "",
imageId: "",
jam: {
workDays: "",
weekDays: "",
holiday: "",
},
kontak: {
kontakPuskesmas: "",
email: "",
facebook: "",
kontakUGD: "",
}
};
const puskesmasState = proxy({
create: {
form: { ...defaultForm },
loading: false,
async submit() {
const cek = templateForm.safeParse(puskesmasState.create.form);
if (!cek.success) {
const err = `[${cek.error.issues.map((v) => v.path.join(".")).join(", ")}] required`;
return toast.error(err);
}
try {
puskesmasState.create.loading = true;
const formData = {
...puskesmasState.create.form,
kontak: {
...puskesmasState.create.form.kontak,
jam: puskesmasState.create.form.jam
}
};
const res = await ApiFetch.api.kesehatan.puskesmas.create.post(formData);
if (res.status === 200) {
puskesmasState.findMany.load();
toast.success("Berhasil menambahkan puskesmas");
} else {
toast.error("Gagal tambah puskesmas");
}
} catch (err) {
toast.error("Terjadi kesalahan saat tambah");
console.error(err);
} finally {
puskesmasState.create.loading = false;
}
},
resetForm() {
puskesmasState.create.form = { ...defaultForm };
}
},
findMany: {
data: null as
| Prisma.PuskesmasGetPayload<{
include: { image: true; jam: true; kontak: true };
}>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.puskesmas["find-many"].get();
if (res.status === 200) {
puskesmasState.findMany.data = res.data?.data ?? [];
}
},
},
findUnique: {
data: null as
| Prisma.PuskesmasGetPayload<{
include: { image: true; jam: true; kontak: true };
}>
| null,
async load(id: string) {
const res = await fetch(`/api/kesehatan/puskesmas/${id}`);
if (res.ok) {
const data = await res.json();
puskesmasState.findUnique.data = data.data ?? null;
} else {
toast.error("Gagal load data puskesmas");
}
},
},
edit: {
id: "",
form: { ...defaultForm },
loading: false,
async load(id: string) {
const res = await fetch(`/api/kesehatan/puskesmas/${id}`);
if (!res.ok) {
toast.error("Gagal memuat data");
return;
}
const result = await res.json();
const data = result.data;
puskesmasState.edit.id = data.id;
puskesmasState.edit.form = {
name: data.name,
alamat: data.alamat,
imageId: data.imageId,
jam: {
workDays: data.jam.workDays,
weekDays: data.jam.weekDays,
holiday: data.jam.holiday,
},
kontak: {
kontakPuskesmas: data.kontak.kontakPuskesmas,
email: data.kontak.email,
facebook: data.kontak.facebook,
kontakUGD: data.kontak.kontakUGD,
}
};
},
async submit() {
const cek = templateForm.safeParse(puskesmasState.edit.form);
if (!cek.success) {
const err = `[${cek.error.issues.map((v) => v.path.join(".")).join(", ")}] required`;
toast.error(err);
return false;
}
try {
puskesmasState.edit.loading = true;
const formData = {
...puskesmasState.edit.form,
kontak: {
...puskesmasState.edit.form.kontak,
jam: puskesmasState.edit.form.jam
}
};
const res = await fetch(`/api/kesehatan/puskesmas/${puskesmasState.edit.id}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(formData),
});
if (!res.ok) {
const error = await res.json();
throw new Error(error.message || "Update gagal");
}
toast.success("Berhasil update puskesmas");
await puskesmasState.findMany.load();
return true;
} catch (err) {
toast.error(err instanceof Error ? err.message : "Terjadi kesalahan saat update");
return false;
} finally {
puskesmasState.edit.loading = false;
}
},
reset() {
puskesmasState.edit.id = "";
puskesmasState.edit.form = { ...defaultForm };
}
},
delete: {
loading: false,
async byId(id: string) {
try {
puskesmasState.delete.loading = true;
const res = await fetch(`/api/kesehatan/puskesmas/del/${id}`, {
method: "DELETE",
});
const result = await res.json();
if (res.ok && result.success) {
toast.success("Puskesmas berhasil dihapus");
await puskesmasState.findMany.load();
} else {
toast.error(result.message || "Gagal menghapus");
}
} catch {
toast.error("Terjadi kesalahan saat menghapus");
} finally {
puskesmasState.delete.loading = false;
}
}
}
});
export default puskesmasState;

View File

@@ -20,6 +20,11 @@ import FirstAid from "./data_kesehatan_warga/artikel_kesehatan/first_aid";
import MythVsFact from "./data_kesehatan_warga/artikel_kesehatan/myth_vs_fact"; import MythVsFact from "./data_kesehatan_warga/artikel_kesehatan/myth_vs_fact";
import DoctorSign from "./data_kesehatan_warga/artikel_kesehatan/doctor_sign"; import DoctorSign from "./data_kesehatan_warga/artikel_kesehatan/doctor_sign";
import Posyandu from "./posyandu"; import Posyandu from "./posyandu";
import Puskesmas from "./puskesmas";
import ProgramKesehatan from "./program-kesehatan";
import PenangananDarurat from "./penanganan-darurat";
import KontakDarurat from "./kontak-darurat";
import InfoWabahPenyakit from "./info-wabah-penyakit";
const Kesehatan = new Elysia({ const Kesehatan = new Elysia({
@@ -47,4 +52,9 @@ const Kesehatan = new Elysia({
.use(MythVsFact) .use(MythVsFact)
.use(DoctorSign) .use(DoctorSign)
.use(Posyandu) .use(Posyandu)
.use(Puskesmas)
.use(ProgramKesehatan)
.use(PenangananDarurat)
.use(KontakDarurat)
.use(InfoWabahPenyakit)
export default Kesehatan; export default Kesehatan;

View File

@@ -0,0 +1,32 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.InfoWabahPenyakitGetPayload<{
select: {
name: true;
deskripsiSingkat: true;
deskripsiLengkap: true;
imageId: true;
};
}>
export default async function infoWabahPenyakitCreate(context: Context) {
const body = context.body as FormCreate;
await prisma.infoWabahPenyakit.create({
data: {
name: body.name,
deskripsiSingkat: body.deskripsiSingkat,
deskripsiLengkap: body.deskripsiLengkap,
imageId: body.imageId,
}
})
return {
success: true,
message: "Success create info wabah penyakit",
data: {
...body,
},
};
}

View File

@@ -0,0 +1,47 @@
import prisma from "@/lib/prisma";
import fs from "fs/promises";
import { Context } from "elysia";
import path from "path";
const infoWabahPenyakitDelete = async (context: Context) => {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const infoWabahPenyakit = await prisma.infoWabahPenyakit.findUnique({
where: { id },
include: { image: true },
});
if (!infoWabahPenyakit) {
return {
status: 404,
body: "Info wabah penyakit tidak ditemukan",
};
}
// Hapus file gambar dari filesystem jika ada
if (infoWabahPenyakit.image) {
try {
const filePath = path.join(infoWabahPenyakit.image.path, infoWabahPenyakit.image.name);
await fs.unlink(filePath);
} catch (err) {
console.error("Gagal hapus gambar:", err);
}
}
await prisma.infoWabahPenyakit.delete({
where: { id },
});
return {
status: 200,
body: "Info wabah penyakit berhasil dihapus",
};
};
export default infoWabahPenyakitDelete;

View File

@@ -0,0 +1,25 @@
import prisma from "@/lib/prisma";
export default async function infoWabahPenyakitFindMany() {
try {
const data = await prisma.infoWabahPenyakit.findMany({
where: {
isActive: true,
},
include: {
image: true,
}
})
return {
success: true,
message: "Success fetch info wabah penyakit",
data,
}
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch info wabah penyakit",
}
}
}

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
export default async function infoWabahPenyakitFindUnique(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.infoWabahPenyakit.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: "Success fetch info wabah penyakit by ID",
data,
}, { status: 200 })
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil info wabah penyakit: " + (error instanceof Error ? error.message : 'Unknown error'),
}, { status: 500 })
}
}

View File

@@ -0,0 +1,40 @@
import Elysia, { t } from "elysia";
import infoWabahPenyakitCreate from "./create";
import infoWabahPenyakitFindMany from "./find-many";
import infoWabahPenyakitDelete from "./del";
import infoWabahPenyakitFindUnique from "./findUnique";
import infoWabahPenyakitUpdate from "./updt";
const InfoWabahPenyakit = new Elysia({
prefix: "/infowabahpenyakit",
tags: ["Kesehatan/Info Wabah Penyakit"]
})
.post("/create", infoWabahPenyakitCreate, {
body: t.Object({
name: t.String(),
deskripsiSingkat: t.String(),
deskripsiLengkap: t.String(),
imageId: t.String(),
})
})
.get("/find-many", infoWabahPenyakitFindMany)
.delete("/del/:id", infoWabahPenyakitDelete)
.get("/:id", async (context) => {
const response = await infoWabahPenyakitFindUnique(new Request(context.request));
return response;
})
.put("/:id", async (context) => {
const response = await infoWabahPenyakitUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
deskripsiSingkat: t.String(),
deskripsiLengkap: t.String(),
imageId: t.String(),
})
}
)
export default InfoWabahPenyakit;

View File

@@ -0,0 +1,105 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormUpdate = Prisma.InfoWabahPenyakitGetPayload<{
select: {
id: true;
name: true;
deskripsiSingkat: true;
deskripsiLengkap: true;
imageId: true;
}
}>
export default async function infoWabahPenyakitUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
name,
deskripsiSingkat,
deskripsiLengkap,
imageId,
} = body;
if(!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), {
status: 400,
headers: {
'Content-Type': 'application/json'
}
})
}
const existing = await prisma.infoWabahPenyakit.findUnique({
where: { id },
include: {
image: true,
}
})
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Info wabah penyakit tidak ditemukan",
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
})
}
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);
}
}
}
const updated = await prisma.infoWabahPenyakit.update({
where: { id },
data: {
name,
deskripsiSingkat,
deskripsiLengkap,
imageId,
}
})
return new Response(JSON.stringify({
success: true,
message: "Info wabah penyakit berhasil diupdate",
data: updated,
}), {
status: 200,
headers: {
'Content-Type': 'application/json'
}
})
} catch (error) {
console.error("Error updating info wabah penyakit:", error);
return new Response(
JSON.stringify({
success: false,
message: "Terjadi kesalahan saat mengupdate info wabah penyakit",
}),
{ status: 500, headers: { 'Content-Type': 'application/json' } }
);
}
}

View File

@@ -0,0 +1,29 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.KontakDaruratGetPayload<{
select: {
name: true;
deskripsi: true;
imageId: true;
};
}>;
export default async function kontakDaruratCreate(context: Context) {
const body = context.body as FormCreate;
await prisma.kontakDarurat.create({
data: {
name: body.name,
deskripsi: body.deskripsi,
imageId: body.imageId,
}
})
return {
success: true,
message: "Success create kontak darurat",
data: {
...body,
},
};
}

View File

@@ -0,0 +1,47 @@
import prisma from "@/lib/prisma";
import fs from "fs/promises";
import { Context } from "elysia";
import path from "path";
const kontakDaruratDelete = async (context: Context) => {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const kontakDarurat = await prisma.kontakDarurat.findUnique({
where: { id },
include: { image: true },
});
if (!kontakDarurat) {
return {
status: 404,
body: "Kontak darurat tidak ditemukan",
};
}
// Hapus file gambar dari filesystem jika ada
if (kontakDarurat.image) {
try {
const filePath = path.join(kontakDarurat.image.path, kontakDarurat.image.name);
await fs.unlink(filePath);
} catch (error) {
console.error("Error deleting image file:", error);
}
}
await prisma.kontakDarurat.delete({
where: { id },
});
return {
status: 200,
body: "Kontak darurat berhasil dihapus",
};
};
export default kontakDaruratDelete;

View File

@@ -0,0 +1,25 @@
import prisma from "@/lib/prisma";
export default async function kontakDaruratFindMany() {
try {
const data = await prisma.kontakDarurat.findMany({
where: {
isActive: true,
},
include: {
image: true,
}
})
return {
success: true,
message: "Success fetch kontak darurat",
data,
}
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch kontak darurat",
}
}
}

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
export default async function kontakDaruratFindUnique(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.kontakDarurat.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: "Success fetch kontak darurat",
data,
}, { status: 200 })
} catch (error) {
console.error("Find unique error:", error);
return Response.json({
success: false,
message: "Failed fetch kontak darurat",
}, { status: 500 })
}
}

View File

@@ -0,0 +1,42 @@
import Elysia, { t } from "elysia";
import kontakDaruratCreate from "./create";
import kontakDaruratFindMany from "./find-many";
import kontakDaruratDelete from "./del";
import kontakDaruratUpdate from "./updt";
import kontakDaruratFindUnique from "./findUnique";
const KontakDarurat = new Elysia({
prefix: "/kontakdarurat",
tags: ["Kesehatan/Kontak Darurat"]
})
.post("/create", kontakDaruratCreate, {
body: t.Object({
name: t.String(),
nomor: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
})
.get("/find-many", kontakDaruratFindMany)
.delete("/del/:id", kontakDaruratDelete)
.get("/:id", async (context) => {
const response = await kontakDaruratFindUnique(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await kontakDaruratUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
nomor: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
}
)
export default KontakDarurat;

View File

@@ -0,0 +1,102 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormUpdate = Prisma.KontakDaruratGetPayload<{
select: {
id: true;
name: true;
deskripsi: true;
imageId: true;
}
}>
export default async function kontakDaruratUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
name,
deskripsi,
imageId,
} = body;
if(!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), {
status: 400,
headers: {
'Content-Type': 'application/json'
}
})
}
const existing = await prisma.kontakDarurat.findUnique({
where: { id },
include: {
image: true,
}
})
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Kontak Darurat tidak ditemukan",
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
})
}
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);
}
}
}
const updated = await prisma.kontakDarurat.update({
where: { id },
data: {
name,
deskripsi,
imageId,
}
})
return new Response(JSON.stringify({
success: true,
message: "Kontak Darurat berhasil diupdate",
data: updated,
}), {
status: 200,
headers: {
'Content-Type': 'application/json'
}
})
} catch (error) {
console.error("Error updating kontak darurat:", error);
return new Response(
JSON.stringify({
success: false,
message: "Terjadi kesalahan saat mengupdate kontak darurat",
}),
{ status: 500, headers: { 'Content-Type': 'application/json' } }
);
}
}

View File

@@ -0,0 +1,29 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.PenangananDaruratGetPayload<{
select: {
name: true;
deskripsi: true;
imageId: true;
};
}>;
export default async function penangananDaruratCreate(context: Context) {
const body = context.body as FormCreate;
await prisma.penangananDarurat.create({
data: {
name: body.name,
deskripsi: body.deskripsi,
imageId: body.imageId,
}
})
return {
success: true,
message: "Success create penanganan darurat",
data: {
...body,
},
};
}

View File

@@ -0,0 +1,47 @@
import prisma from "@/lib/prisma";
import fs from "fs/promises";
import { Context } from "elysia";
import path from "path";
const penangananDaruratDelete = async (context: Context) => {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const penangananDarurat = await prisma.penangananDarurat.findUnique({
where: { id },
include: { image: true },
});
if (!penangananDarurat) {
return {
status: 404,
body: "Penanganan darurat tidak ditemukan",
};
}
// Hapus file gambar dari filesystem jika ada
if (penangananDarurat.image) {
try {
const filePath = path.join(penangananDarurat.image.path, penangananDarurat.image.name);
await fs.unlink(filePath);
} catch (error) {
console.error("Error deleting image file:", error);
}
}
// Hapus data dari database
await prisma.penangananDarurat.delete({
where: { id },
});
return {
status: 200,
body: "Penanganan darurat berhasil dihapus",
};
};
export default penangananDaruratDelete;

View File

@@ -0,0 +1,25 @@
import prisma from "@/lib/prisma";
export default async function penangananDaruratFindMany() {
try {
const data = await prisma.penangananDarurat.findMany({
where: {
isActive: true,
},
include: {
image: true,
}
})
return {
success: true,
message: "Success fetch penanganan darurat",
data,
}
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch penanganan darurat",
}
}
}

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
export default async function penangananDaruratFindUnique(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.penangananDarurat.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: "Success fetch penanganan darurat by ID",
data,
}, { status: 200 })
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil penanganan darurat: " + (error instanceof Error ? error.message : 'Unknown error'),
}, { status: 500 })
}
}

View File

@@ -0,0 +1,39 @@
import Elysia, { t } from "elysia";
import penangananDaruratCreate from "./create";
import penangananDaruratDelete from "./del";
import penangananDaruratFindMany from "./find-many";
import penangananDaruratFindUnique from "./findUnique";
import penangananDaruratUpdate from "./updt";
const PenangananDarurat = new Elysia({
prefix: "/penanganan-darurat",
tags: ["Kesehatan/Penanganan Darurat"]
})
.post("/create", penangananDaruratCreate, {
body: t.Object({
name: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
})
.get("/find-many", penangananDaruratFindMany)
.delete("/del/:id", penangananDaruratDelete)
.get(":id", async (context) => {
const response = await penangananDaruratFindUnique(new Request(context.request));
return response;
})
.put(
":id",
async (context) => {
const response = await penangananDaruratUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
}
)
export default PenangananDarurat;

View File

@@ -0,0 +1,103 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormUpdate = Prisma.PenangananDaruratGetPayload<{
select: {
id: true;
name: true;
deskripsi: true;
imageId: true;
}
}>
export default async function penangananDaruratUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
name,
deskripsi,
imageId,
} = body;
if (!id) {
return new Response(JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}), {
status: 400,
headers: {
'Content-Type': 'application/json'
}
})
}
const existing = await prisma.penangananDarurat.findUnique({
where: { id },
include: {
image: true,
}
})
if (!existing) {
return new Response(JSON.stringify({
success: false,
message: "Penanganan darurat tidak ditemukan",
}), {
status: 404,
headers: {
'Content-Type': 'application/json'
}
})
}
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);
}
}
}
const updated = await prisma.penangananDarurat.update({
where: { id },
data: {
name,
deskripsi,
imageId,
}
})
return new Response(JSON.stringify({
success: true,
message: "Penanganan darurat berhasil diupdate",
data: updated,
}), {
status: 200,
headers: {
'Content-Type': 'application/json'
}
})
} catch (error) {
console.error("Error updating penanganan darurat:", error);
return new Response(JSON.stringify({
success: false,
message: "Gagal mengupdate penanganan darurat: " + (error instanceof Error ? error.message : 'Unknown error'),
}), {
status: 500,
headers: {
'Content-Type': 'application/json'
}
})
}
}

View File

@@ -0,0 +1,31 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.ProgramKesehatanGetPayload<{
select: {
name: true;
deskripsiSingkat: true;
deskripsi: true;
imageId: true;
}
}>
export default async function programKesehatanCreate(context: Context) {
const body = context.body as FormCreate;
await prisma.programKesehatan.create({
data: {
name: body.name,
deskripsiSingkat: body.deskripsiSingkat,
deskripsi: body.deskripsi,
imageId: body.imageId,
}
})
return {
success: true,
message: "Success create program kesehatan",
data: {
...body,
},
};
}

View File

@@ -0,0 +1,52 @@
import prisma from "@/lib/prisma";
import fs from "fs/promises";
import { Context } from "elysia";
import path from "path";
const programKesehatanDelete = async (context: Context) => {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const programKesehatan = await prisma.programKesehatan.findUnique({
where: { id },
include: { image: true },
});
if (!programKesehatan) {
return {
status: 404,
body: "Program kesehatan tidak ditemukan",
};
}
// Hapus file gambar dari filesystem jika ada
if (programKesehatan.image) {
try {
const filePath = path.join(programKesehatan.image.path, programKesehatan.image.name);
await fs.unlink(filePath);
await prisma.fileStorage.delete({
where: { id: programKesehatan.image.id },
});
} catch (error) {
console.error("Gagal hapus file image:", error);
}
}
// Hapus berita dari DB
await prisma.programKesehatan.delete({
where: { id },
});
return {
success: true,
message: "Program kesehatan dan file terkait berhasil dihapus",
};
};
export default programKesehatanDelete;

View File

@@ -0,0 +1,25 @@
import prisma from "@/lib/prisma";
export default async function programKesehatanFindMany() {
try {
const data = await prisma.programKesehatan.findMany({
where: {
isActive: true,
},
include: {
image: true,
}
})
return {
success: true,
message: "Success fetch program kesehatan",
data,
}
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch program kesehatan",
}
}
}

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
export default async function programKesehatanFindUnique(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.programKesehatan.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: "Success fetch program kesehatan by ID",
data,
}, { status: 200 })
} catch (error) {
console.error("Find by ID error:", error);
return Response.json({
success: false,
message: "Gagal mengambil program kesehatan: " + (error instanceof Error ? error.message : 'Unknown error'),
}, { status: 500 })
}
}

View File

@@ -0,0 +1,41 @@
import Elysia, { t } from "elysia";
import programKesehatanCreate from "./create";
import programKesehatanFindMany from "./find-many";
import programKesehatanDelete from "./del";
import programKesehatanFindUnique from "./findUnique";
import programKesehatanUpdate from "./updt";
const ProgramKesehatan = new Elysia({
prefix: "/programkesehatan",
tags: ["Kesehatan/Program Kesehatan"],
})
.post("/create", programKesehatanCreate, {
body: t.Object({
name: t.String(),
deskripsiSingkat: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
})
.get("/find-many", programKesehatanFindMany)
.delete("/del/:id", programKesehatanDelete)
.get("/:id", async (context) => {
const response = await programKesehatanFindUnique(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await programKesehatanUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
deskripsiSingkat: t.String(),
deskripsi: t.String(),
imageId: t.String(),
})
}
)
export default ProgramKesehatan;

View File

@@ -0,0 +1,115 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormUpdate = Prisma.ProgramKesehatanGetPayload<{
select: {
id: true;
name: true;
deskripsiSingkat: true;
deskripsi: true;
imageId: true;
};
}>;
export default async function programKesehatanUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const { name, deskripsiSingkat, deskripsi, imageId } = body;
if (!id) {
return new Response(
JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}),
{
status: 400,
headers: {
"Content-Type": "application/json",
},
}
);
}
const existing = await prisma.programKesehatan.findUnique({
where: { id },
include: {
image: true,
},
});
if (!existing) {
return new Response(
JSON.stringify({
success: false,
message: "Program kesehatan tidak ditemukan",
}),
{
status: 404,
headers: {
"Content-Type": "application/json",
},
}
);
}
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);
}
}
}
const updated = await prisma.programKesehatan.update({
where: { id },
data: {
name,
deskripsiSingkat,
deskripsi,
imageId,
},
});
return new Response(
JSON.stringify({
success: true,
message: "Success update program kesehatan",
data: updated,
}),
{
status: 200,
headers: {
"Content-Type": "application/json",
},
}
);
} catch (error) {
console.error("Update error:", error);
return new Response(
JSON.stringify({
success: false,
message:
"Gagal mengupdate program kesehatan: " +
(error instanceof Error ? error.message : "Unknown error"),
}),
{
status: 500,
headers: {
"Content-Type": "application/json",
},
}
);
}
}

View File

@@ -0,0 +1,69 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type JamOperasionalInput = {
workDays: string;
weekDays: string;
holiday: string;
};
type KontakPuskesmasInput = {
kontakPuskesmas: string;
email: string;
facebook: string;
kontakUGD: string;
};
type CreatePuskesmasInput = {
name: string;
alamat: string;
imageId: string;
jam: JamOperasionalInput;
kontak: KontakPuskesmasInput;
};
const puskesmasCreate = async (context: Context) => {
const { name, alamat, imageId, jam, kontak } = await context.body as CreatePuskesmasInput;
// 1. Buat jam operasional
const createdJam = await prisma.jamOperasional.create({
data: {
workDays: jam.workDays,
weekDays: jam.weekDays,
holiday: jam.holiday
}
});
// 2. Buat kontak puskesmas
const createdKontak = await prisma.kontakPuskesmas.create({
data: {
kontakPuskesmas: kontak.kontakPuskesmas,
email: kontak.email,
facebook: kontak.facebook,
kontakUGD: kontak.kontakUGD
}
});
// 3. Buat puskesmas
const createdPuskesmas = await prisma.puskesmas.create({
data: {
name,
alamat,
imageId,
jamId: createdJam.id,
kontakId: createdKontak.id
},
include: {
image: true,
jam: true,
kontak: true
}
});
return {
success: true,
data: createdPuskesmas
};
};
export default puskesmasCreate;

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
const puskesmasDelete = async (context: Context) => {
const id = context.params?.id as string;
if (!id) {
return {
status: 400,
body: "ID tidak diberikan",
};
}
const puskesmas = await prisma.puskesmas.findUnique({
where: { id },
include: { image: true, kontak: true, jam: true },
});
if (!puskesmas) {
return {
status: 404,
body: "Puskesmas tidak ditemukan",
};
}
if (puskesmas.image) {
try {
const filePath = path.join(puskesmas.image.path, puskesmas.image.name);
await fs.unlink(filePath);
await prisma.fileStorage.delete({
where: { id: puskesmas.image.id },
});
} catch (error) {
console.error("Gagal hapus file image:", error);
}
}
await prisma.puskesmas.delete({
where: { id },
})
return {
success: true,
message: "Puskesmas dan file terkait berhasil dihapus",
}
};
export default puskesmasDelete;

View File

@@ -0,0 +1,27 @@
import prisma from "@/lib/prisma";
export default async function puskesmasFindMany() {
try {
const data = await prisma.puskesmas.findMany({
where: {
isActive: true,
},
include: {
image: true,
jam: true,
kontak: true,
}
})
return {
success: true,
message: "Success fetch puskesmas",
data,
}
} catch (error) {
console.error("Find many error:", error);
return {
success: false,
message: "Failed fetch puskesmas",
}
}
}

View File

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

View File

@@ -0,0 +1,62 @@
import Elysia, { t } from "elysia";
import puskesmasCreate from "./create";
import puskesmasDelete from "./del";
import puskesmasFindMany from "./find-many";
import findUniquePuskesmas from "./findUnique";
import puskesmasUpdate from "./updt";
const Puskesmas = new Elysia({
prefix: "puskesmas",
tags: ["Kesehatan/Puskesmas"],
})
.post("/create", puskesmasCreate, {
body: t.Object({
name: t.String(),
alamat: t.String(),
imageId: t.String(),
kontak: t.Object({
jam: t.Object({
workDays: t.String(),
weekDays: t.String(),
holiday: t.String(),
}),
kontakPuskesmas: t.String(),
email: t.String(),
facebook: t.String(),
kontakUGD: t.String(),
}),
}),
})
.get("/find-many", puskesmasFindMany)
.delete("/del/:id", puskesmasDelete)
.get("/:id", async (context) => {
const response = await findUniquePuskesmas(new Request(context.request));
return response;
})
.put(
"/:id",
async (context) => {
const response = await puskesmasUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
alamat: t.String(),
imageId: t.String(),
jam: t.Object({
workDays: t.String(),
weekDays: t.String(),
holiday: t.String(),
}),
kontak: t.Object({
kontakPuskesmas: t.String(),
email: t.String(),
facebook: t.String(),
kontakUGD: t.String(),
}),
}),
}
);
export default Puskesmas;

View File

@@ -0,0 +1,139 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
import path from "path";
import fs from "fs/promises";
type FormUpdate = Prisma.PuskesmasGetPayload<{
select: {
id: true;
name: true;
alamat: true;
jam: true;
imageId: true;
kontak: true;
};
}>;
export default async function puskesmasUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const { name, alamat, jam, imageId, kontak } = body;
if (!id) {
return new Response(
JSON.stringify({
success: false,
message: "ID tidak boleh kosong",
}),
{
status: 400,
headers: {
"Content-Type": "application/json",
},
}
);
}
const existing = await prisma.puskesmas.findUnique({
where: { id },
include: {
image: true,
kontak: true,
jam: true,
},
});
if (!existing) {
return new Response(
JSON.stringify({
success: false,
message: "Puskesmas tidak ditemukan",
}),
{
status: 404,
headers: {
"Content-Type": "application/json",
},
}
);
}
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);
}
}
}
await prisma.jamOperasional.update({
where: { id: existing.jamId },
data: {
workDays: jam.workDays,
weekDays: jam.weekDays,
holiday: jam.holiday,
},
});
await prisma.kontakPuskesmas.update({
where: { id: existing.kontakId },
data: {
kontakPuskesmas: kontak.kontakPuskesmas,
email: kontak.email,
facebook: kontak.facebook,
kontakUGD: kontak.kontakUGD,
},
});
const updated = await prisma.puskesmas.update({
where: { id },
data: {
name,
alamat,
jamId: jam.id,
imageId,
kontakId: kontak.id,
},
});
return new Response(
JSON.stringify({
success: true,
message: "Success update puskesmas",
data: updated,
}),
{
status: 200,
headers: {
"Content-Type": "application/json",
},
}
);
} catch (error) {
console.error("Update error:", error);
return new Response(
JSON.stringify({
success: false,
message:
"Gagal update puskesmas: " +
(error instanceof Error ? error.message : "Unknown error"),
}),
{
status: 500,
headers: {
"Content-Type": "application/json",
},
}
);
}
}