UI & API Menu Pendidikan, Submenu Info Sekolah

This commit is contained in:
2025-07-28 14:17:42 +08:00
parent 5601e59922
commit b24bcd8019
48 changed files with 3387 additions and 75 deletions

View File

@@ -0,0 +1,11 @@
import Elysia from "elysia";
import InfoSekolahPAUD from "./info-sekolah-paud";
const Pendidikan = new Elysia({
prefix: "/api/pendidikan",
tags: ["Pendidikan"]
})
.use(InfoSekolahPAUD)
export default Pendidikan;

View File

@@ -0,0 +1,17 @@
import Elysia from "elysia";
import JenjangPendidikan from "./jenjang-pendidikan";
import Pengajar from "./pengajar";
import Siswa from "./siswa";
import LembagaPendidikan from "./lembaga";
const InfoSekolahPAUD = new Elysia({
prefix: "/infosekolahpaud",
tags: ["Pendidikan/Info Sekolah PAUD"],
})
.use(JenjangPendidikan)
.use(Siswa)
.use(Pengajar)
.use(LembagaPendidikan)
export default InfoSekolahPAUD;

View File

@@ -0,0 +1,27 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
nama: string;
};
export default async function jenjangPendidikanCreate(context: Context) {
const body = (await context.body) as FormCreate;
try {
const result = await prisma.jenjangPendidikan.create({
data: {
nama: body.nama,
},
});
return {
success: true,
message: "Berhasil membuat jenjang pendidikan",
data: result,
};
} catch (error) {
console.error("Error creating jenjang pendidikan:", error);
throw new Error("Gagal membuat jenjang pendidikan: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,31 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function jenjangPendidikanDelete(context: Context) {
const id = context.params.id;
if (!id) {
return {
success: false,
message: "ID is required",
}
}
const jenjangPendidikan = await prisma.jenjangPendidikan.delete({
where: {
id: id,
},
})
if(!jenjangPendidikan) {
return {
success: false,
message: "Jenjang Pendidikan tidak ditemukan",
}
}
return {
success: true,
message: "Success delete jenjang pendidikan",
data: jenjangPendidikan,
}
}

View File

@@ -0,0 +1,15 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import prisma from "@/lib/prisma";
export default async function jenjangPendidikanFindMany() {
const data = await prisma.jenjangPendidikan.findMany();
return {
success: true,
data: data.map((item: any) => {
return {
id: item.id,
nama: item.nama,
}
}),
};
}

View File

@@ -0,0 +1,47 @@
import { Context } from "elysia";
import prisma from "@/lib/prisma";
export default async function jenjangPendidikanFindUnique(context: Context) {
const url = new URL(context.request.url);
const pathSegments = url.pathname.split('/');
const id = pathSegments[pathSegments.length - 1];
if (!id) {
return {
success: false,
message: "ID is required",
}
}
try {
if (typeof id !== 'string') {
return {
success: false,
message: "ID is required",
}
}
const data = await prisma.jenjangPendidikan.findUnique({
where: { id },
});
if (!data) {
return {
success: false,
message: "Jenjang Pendidikan tidak ditemukan",
}
}
return {
success: true,
message: "Success find jenjang pendidikan",
data,
}
} catch (error) {
console.error("Find by ID error:", error);
return {
success: false,
message: "Gagal mengambil jenjang pendidikan: " + (error instanceof Error ? error.message : 'Unknown error'),
}
}
}

View File

@@ -0,0 +1,29 @@
import Elysia, { t } from "elysia";
import jenjangPendidikanCreate from "./create";
import jenjangPendidikanDelete from "./del";
import jenjangPendidikanFindMany from "./findMany";
import jenjangPendidikanFindUnique from "./findUnique";
import jenjangPendidikanUpdate from "./updt";
const JenjangPendidikan = new Elysia({
prefix: "/jenjangpendidikan",
tags: ["Pendidikan/Jenjang Pendidikan"],
})
.get("/find-many", jenjangPendidikanFindMany)
.get("/:id", async (context) => {
const response = await jenjangPendidikanFindUnique(context);
return response;
})
.delete("/del/:id", jenjangPendidikanDelete)
.post("/create", jenjangPendidikanCreate, {
body: t.Object({
nama: t.String(),
}),
})
.put("/:id", jenjangPendidikanUpdate, {
body: t.Object({
nama: t.String(),
}),
});
export default JenjangPendidikan;

View File

@@ -0,0 +1,44 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function jenjangPendidikanUpdate(context: Context) {
const body = context.body as { nama: string };
const id = context.params?.id as string;
// Validasi ID dan nama
if (!id) {
return {
success: false,
message: "ID is required",
};
}
if (!body.nama) {
return {
success: false,
message: "Nama is required",
};
}
try {
const jenjangPendidikan = await prisma.jenjangPendidikan.update({
where: { id },
data: {
nama: body.nama,
},
});
return {
success: true,
message: "Success update jenjang pendidikan",
data: jenjangPendidikan,
};
} catch (error) {
console.error("Update error:", error);
return {
success: false,
message: "Gagal update jenjang pendidikan",
error: error instanceof Error ? error.message : String(error),
};
}
}

View File

@@ -0,0 +1,38 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
nama: string;
jenjangId: string;
};
export default async function lembagaPendidikanCreate(context: Context) {
const body = (await context.body) as FormCreate;
if (!body.jenjangId) {
throw new Error("jenjangId wajib diisi");
}
try {
const result = await prisma.lembaga.create({
data: {
nama: body.nama,
jenjangId: body.jenjangId,
},
include: {
jenjangPendidikan: true,
siswa: true,
pengajar: true,
},
});
return {
success: true,
message: "Berhasil membuat lembaga",
data: result,
};
} catch (error) {
console.error("Error creating lembaga:", error);
throw new Error("Gagal membuat lembaga: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function lembagaPendidikanDelete(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID lembaga pendidikan wajib diisi");
}
const deleted = await prisma.lembaga.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus lembaga pendidikan",
data: deleted,
};
}

View File

@@ -0,0 +1,45 @@
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function lembagaPendidikanFindMany(context: Context) {
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
try {
const [data, total] = await Promise.all([
prisma.lembaga.findMany({
where: { isActive: true },
include: {
jenjangPendidikan: true,
siswa: true,
pengajar: true,
},
skip,
take: limit,
orderBy: { createdAt: 'desc' }, // opsional, kalau mau urut berdasarkan waktu
}),
prisma.kegiatanDesa.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch lembaga pendidikan with pagination",
data,
page,
totalPages: Math.ceil(total / limit),
total,
};
} catch (e) {
console.error("Find many paginated error:", e);
return {
success: false,
message: "Failed fetch lembaga pendidikan with pagination",
};
}
}
export default lembagaPendidikanFindMany;

View File

@@ -0,0 +1,30 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function lembagaPendidikanFindUnique(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID tidak ditemukan dalam parameter");
}
const data = await prisma.lembaga.findUnique({
where: { id },
include: {
jenjangPendidikan: true,
siswa: true,
pengajar: true,
},
});
if (!data) {
throw new Error("Lembaga pendidikan tidak ditemukan");
}
return {
success: true,
message: "Data lembaga pendidikan ditemukan",
data,
};
}

View File

@@ -0,0 +1,37 @@
import Elysia, { t } from "elysia";
import lembagaPendidikanCreate from "./create";
import lembagaPendidikanDelete from "./del";
import lembagaPendidikanFindMany from "./findMany";
import lembagaPendidikanFindUnique from "./findUnique";
import lembagaPendidikanUpdate from "./updt";
const LembagaPendidikan = new Elysia({
prefix: "/lembagapendidikan",
tags: ["Pendidikan/Info Sekolah PAUD/Lembaga Pendidikan"],
})
// ✅ Find all
.get("/find-many", lembagaPendidikanFindMany)
// ✅ Find by ID
.get("/:id", lembagaPendidikanFindUnique)
// ✅ Create
.post("/create", lembagaPendidikanCreate, {
body: t.Object({
nama: t.String(),
jenjangId: t.String(),
}),
})
// ✅ Update
.put("/:id", lembagaPendidikanUpdate, {
body: t.Object({
nama: t.Optional(t.String()),
jenjangId: t.Optional(t.String()),
}),
})
// ✅ Delete
.delete("/del/:id", lembagaPendidikanDelete);
export default LembagaPendidikan;

View File

@@ -0,0 +1,49 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
nama?: string;
jenjangId?: string;
};
export default async function lembagaPendidikanUpdate(context: Context) {
const body = context.body as FormUpdate;
const id = context.params.id;
if (!id) {
return {
success: false,
message: "ID lembaga pendidikan wajib diisi",
};
}
try {
const updated = await prisma.lembaga.update({
where: { id },
data: {
nama: body.nama,
jenjangId: body.jenjangId,
},
include: {
jenjangPendidikan: true,
siswa: true,
pengajar: true,
},
});
return {
success: true,
message: "Lembaga pendidikan berhasil diperbarui",
data: updated,
};
} catch (error: any) {
console.error("❌ Error update lembaga pendidikan:", error);
return {
success: false,
message: "Gagal memperbarui lembaga pendidikan",
error: error.message,
};
}
}

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
nama: string;
lembagaId: string;
};
export default async function pengajarCreate(context: Context) {
const body = (await context.body) as FormCreate;
if (!body.lembagaId) {
throw new Error("lembagaId wajib diisi");
}
try {
const result = await prisma.pengajar.create({
data: {
nama: body.nama,
lembagaId: body.lembagaId,
},
include: {
lembaga: true,
},
});
return {
success: true,
message: "Berhasil menambahkan pengajar",
data: result,
};
} catch (error) {
console.error("Error creating pengajar:", error);
throw new Error("Gagal membuat pengajar: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pengajarDelete(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID tidak ditemukan dalam parameter");
}
const deleted = await prisma.pengajar.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus pengajar",
data: deleted,
};
}

View File

@@ -0,0 +1,43 @@
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function pengajarFindMany(context: Context) {
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
try {
const [data, total] = await Promise.all([
prisma.pengajar.findMany({
where: { isActive: true },
include: {
lembaga: true,
},
skip,
take: limit,
orderBy: { createdAt: 'desc' }, // opsional, kalau mau urut berdasarkan waktu
}),
prisma.pengajar.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch pengajar with pagination",
data,
page,
totalPages: Math.ceil(total / limit),
total,
};
} catch (e) {
console.error("Find many paginated error:", e);
return {
success: false,
message: "Failed fetch pengajar with pagination",
};
}
}
export default pengajarFindMany;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pengajarFindUnique(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID tidak ditemukan dalam parameter");
}
const data = await prisma.pengajar.findUnique({
where: { id },
include: {
lembaga: true,
},
});
if (!data) {
throw new Error("Pengajar tidak ditemukan");
}
return {
success: true,
message: "Data pengajar ditemukan",
data,
};
}

View File

@@ -0,0 +1,37 @@
import Elysia, { t } from "elysia";
import PengajarCreate from "./create";
import PengajarDelete from "./del";
import PengajarFindMany from "./findMany";
import PengajarFindUnique from "./findUnique";
import PengajarUpdate from "./updt";
const Pengajar = new Elysia({
prefix: "/pengajar",
tags: ["Pendidikan/Info Sekolah PAUD/Pengajar"],
})
// ✅ Find all
.get("/find-many", PengajarFindMany)
// ✅ Find by ID
.get("/:id", PengajarFindUnique)
// ✅ Create
.post("/create", PengajarCreate, {
body: t.Object({
nama: t.String(),
lembagaId: t.String(),
}),
})
// ✅ Update
.put("/:id", PengajarUpdate, {
body: t.Object({
nama: t.Optional(t.String()),
lembagaId: t.Optional(t.String()),
}),
})
// ✅ Delete
.delete("/del/:id", PengajarDelete);
export default Pengajar;

View File

@@ -0,0 +1,47 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdatePengajar = {
nama?: string;
lembagaId?: string;
};
export default async function pengajarUpdate(context: Context) {
const body = context.body as FormUpdatePengajar;
const id = context.params.id;
if (!id) {
return {
success: false,
message: "ID pengajar wajib diisi",
};
}
try {
const updated = await prisma.pengajar.update({
where: { id },
data: {
nama: body.nama,
lembagaId: body.lembagaId,
},
include: {
lembaga: true,
},
});
return {
success: true,
message: "Pengajar berhasil diperbarui",
data: updated,
};
} catch (error: any) {
console.error("❌ Error update pengajar:", error);
return {
success: false,
message: "Gagal memperbarui data pengajar",
error: error.message,
};
}
}

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
nama: string;
lembagaId: string;
};
export default async function siswaCreate(context: Context) {
const body = (await context.body) as FormCreate;
if (!body.lembagaId) {
throw new Error("lembagaId wajib diisi");
}
try {
const result = await prisma.siswa.create({
data: {
nama: body.nama,
lembagaId: body.lembagaId,
},
include: {
lembaga: true,
},
});
return {
success: true,
message: "Berhasil menambahkan siswa",
data: result,
};
} catch (error) {
console.error("Error creating siswa:", error);
throw new Error("Gagal membuat siswa: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function siswaDelete(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID tidak ditemukan dalam parameter");
}
const deleted = await prisma.siswa.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus siswa",
data: deleted,
};
}

View File

@@ -0,0 +1,43 @@
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function siswaFindMany(context: Context) {
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
try {
const [data, total] = await Promise.all([
prisma.siswa.findMany({
where: { isActive: true },
include: {
lembaga: true,
},
skip,
take: limit,
orderBy: { createdAt: 'desc' }, // opsional, kalau mau urut berdasarkan waktu
}),
prisma.siswa.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch siswa with pagination",
data,
page,
totalPages: Math.ceil(total / limit),
total,
};
} catch (e) {
console.error("Find many paginated error:", e);
return {
success: false,
message: "Failed fetch siswa with pagination",
};
}
}
export default siswaFindMany;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function siswaFindUnique(context: Context) {
const { params } = context;
const id = params?.id as string;
if (!id) {
throw new Error("ID tidak ditemukan dalam parameter");
}
const data = await prisma.siswa.findUnique({
where: { id },
include: {
lembaga: true,
},
});
if (!data) {
throw new Error("Siswa tidak ditemukan");
}
return {
success: true,
message: "Data siswa ditemukan",
data,
};
}

View File

@@ -0,0 +1,37 @@
import Elysia, { t } from "elysia";
import SiswaCreate from "./create";
import SiswaDelete from "./del";
import SiswaFindMany from "./findMany";
import SiswaFindUnique from "./findUnique";
import SiswaUpdate from "./updt";
const Siswa = new Elysia({
prefix: "/siswa",
tags: ["Pendidikan/Info Sekolah PAUD/Siswa"],
})
// ✅ Find all
.get("/find-many", SiswaFindMany)
// ✅ Find by ID
.get("/:id", SiswaFindUnique)
// ✅ Create
.post("/create", SiswaCreate, {
body: t.Object({
nama: t.String(),
lembagaId: t.String(),
}),
})
// ✅ Update
.put("/:id", SiswaUpdate, {
body: t.Object({
nama: t.Optional(t.String()),
lembagaId: t.Optional(t.String()),
}),
})
// ✅ Delete
.delete("/del/:id", SiswaDelete);
export default Siswa;

View File

@@ -0,0 +1,48 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdateSiswaDesa = {
nama?: string;
lembagaId?: string;
};
export default async function siswaUpdate(context: Context) {
const body = context.body as FormUpdateSiswaDesa;
const id = context.params.id;
if (!id) {
return {
success: false,
message: "ID siswa wajib diisi",
};
}
try {
const updated = await prisma.siswa.update({
where: { id },
data: {
nama: body.nama,
lembagaId: body.lembagaId,
updatedAt: new Date(),
},
include: {
lembaga: true,
},
});
return {
success: true,
message: "Siswa berhasil diperbarui",
data: updated,
};
} catch (error: any) {
console.error("❌ Error update siswa:", error);
return {
success: false,
message: "Gagal memperbarui data siswa",
error: error.message,
};
}
}

View File

@@ -22,6 +22,7 @@ import Ekonomi from "./_lib/ekonomi";
import Inovasi from "./_lib/inovasi";
import Lingkungan from "./_lib/lingkungan";
import LandingPage from "./_lib/landing_page";
import Pendidikan from "./_lib/pendidikan";
const ROOT = process.cwd();
@@ -77,16 +78,17 @@ const ApiServer = new Elysia()
})
)
.use(cors(corsConfig))
.use(PPID)
.use(Kesehatan)
.use(Desa)
.use(Keamanan)
.use(Utils)
.use(FileStorage)
.use(LandingPage)
.use(PPID)
.use(Desa)
.use(Kesehatan)
.use(Keamanan)
.use(Ekonomi)
.use(Inovasi)
.use(Lingkungan)
.use(LandingPage)
.use(Pendidikan)
.onError(({ code }) => {
if (code === "NOT_FOUND") {
return {