Fix Admin Menu PPID, Submenu IKM

This commit is contained in:
2025-08-13 00:07:57 +08:00
parent c1583c21b1
commit a1d55e2b0a
64 changed files with 2865 additions and 1829 deletions

View File

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

View File

@@ -0,0 +1,16 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function jenisKelaminRespondenDelete(context: Context) {
const id = context.params.id as string;
await prisma.jenisKelaminResponden.delete({
where: { id },
});
return {
status: 200,
success: true,
message: "Success delete jenis kelamin responden",
};
}

View File

@@ -0,0 +1,53 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function jenisKelaminRespondenFindMany(context: Context) {
// Ambil parameter dari query
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const search = (context.query.search as string) || '';
const skip = (page - 1) * limit;
// Buat where clause
const where: any = { isActive: true };
// Tambahkan pencarian (jika ada)
if (search) {
where.OR = [
{ name: { contains: search, mode: 'insensitive' } },
];
}
try {
// Ambil data dan total count secara paralel
const [data, total] = await Promise.all([
prisma.jenisKelaminResponden.findMany({
where,
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.jenisKelaminResponden.count({ where }),
]);
return {
success: true,
message: "Berhasil ambil jenis kelamin responden dengan pagination",
data,
page,
limit,
total,
totalPages: Math.ceil(total / limit),
};
} catch (e) {
console.error("Error di findMany paginated:", e);
return {
success: false,
message: "Gagal mengambil data jenis kelamin responden",
};
}
}
export default jenisKelaminRespondenFindMany;

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function jenisKelaminRespondenFindUnique(request: Request) {
const url = new URL(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.jenisKelaminResponden.findUnique({
where: { id },
});
if (!data) {
return {
success: false,
message: "Data not found",
}
}
return {
success: true,
message: "Success get jenis kelamin responden",
data,
}
} catch (error) {
console.error("Find by ID error:", error);
return {
success: false,
message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'),
}
}
}

View File

@@ -0,0 +1,33 @@
import Elysia, { t } from "elysia";
import jenisKelaminRespondenCreate from "./create";
import jenisKelaminRespondenDelete from "./del";
import jenisKelaminRespondenFindMany from "./findMany";
import jenisKelaminRespondenFindUnique from "./findUnique";
import jenisKelaminRespondenUpdate from "./updt";
const JenisKelaminResponden = new Elysia({
prefix: "/jeniskelaminresponden",
tags: ["PPID / Indeks Kepuasan / Jenis Kelamin Responden"],
})
.post("/create", jenisKelaminRespondenCreate, {
body: t.Object({
name: t.String(),
}),
})
.get("/findMany", jenisKelaminRespondenFindMany)
.get("/:id", async (context) => {
const response = await jenisKelaminRespondenFindUnique(
new Request(context.request)
);
return response;
})
.put("/:id", jenisKelaminRespondenUpdate, {
body: t.Object({
name: t.String(),
}),
})
.delete("/del/:id", jenisKelaminRespondenDelete);
export default JenisKelaminResponden;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
name: string;
}
export default async function jenisKelaminRespondenUpdate(context: Context) {
const body = (await context.body) as FormUpdate;
const id = context.params.id as string;
try {
const result = await prisma.jenisKelaminResponden.update({
where: { id },
data: {
name: body.name,
},
});
return {
success: true,
message: "Berhasil mengupdate jenis kelamin responden",
data: result,
};
} catch (error) {
console.error("Error updating jenis kelamin responden:", error);
throw new Error("Gagal mengupdate jenis kelamin responden: " + (error as Error).message);
}
}

View File

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

View File

@@ -0,0 +1,16 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pilihanRatingRespondenDelete(context: Context) {
const id = context.params.id as string;
await prisma.pilihanRatingResponden.delete({
where: { id },
});
return {
status: 200,
success: true,
message: "Success delete pilihan rating responden",
};
}

View File

@@ -0,0 +1,53 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function pilihanRatingRespondenFindMany(context: Context) {
// Ambil parameter dari query
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const search = (context.query.search as string) || '';
const skip = (page - 1) * limit;
// Buat where clause
const where: any = { isActive: true };
// Tambahkan pencarian (jika ada)
if (search) {
where.OR = [
{ name: { contains: search, mode: 'insensitive' } },
];
}
try {
// Ambil data dan total count secara paralel
const [data, total] = await Promise.all([
prisma.pilihanRatingResponden.findMany({
where,
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.pilihanRatingResponden.count({ where }),
]);
return {
success: true,
message: "Berhasil ambil pilihan rating responden dengan pagination",
data,
page,
limit,
total,
totalPages: Math.ceil(total / limit),
};
} catch (e) {
console.error("Error di findMany paginated:", e);
return {
success: false,
message: "Gagal mengambil data pilihan rating responden",
};
}
}
export default pilihanRatingRespondenFindMany;

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function pilihanRatingRespondenFindUnique(request: Request) {
const url = new URL(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.pilihanRatingResponden.findUnique({
where: { id },
});
if (!data) {
return {
success: false,
message: "Data not found",
}
}
return {
success: true,
message: "Success get pilihan rating responden",
data,
}
} catch (error) {
console.error("Find by ID error:", error);
return {
success: false,
message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'),
}
}
}

View File

@@ -0,0 +1,33 @@
import Elysia, { t } from "elysia";
import pilihanRatingRespondenCreate from "./create";
import pilihanRatingRespondenDelete from "./del";
import pilihanRatingRespondenFindMany from "./findMany";
import pilihanRatingRespondenFindUnique from "./findUnique";
import pilihanRatingRespondenUpdate from "./updt";
const PilihanRatingResponden = new Elysia({
prefix: "/pilihanratingresponden",
tags: ["PPID / Indeks Kepuasan / Pilihan Rating Responden"],
})
.post("/create", pilihanRatingRespondenCreate, {
body: t.Object({
name: t.String(),
}),
})
.get("/findMany", pilihanRatingRespondenFindMany)
.get("/:id", async (context) => {
const response = await pilihanRatingRespondenFindUnique(
new Request(context.request)
);
return response;
})
.put("/:id", pilihanRatingRespondenUpdate, {
body: t.Object({
name: t.String(),
}),
})
.delete("/del/:id", pilihanRatingRespondenDelete);
export default PilihanRatingResponden;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
name: string;
}
export default async function pilihanRatingRespondenUpdate(context: Context) {
const body = (await context.body) as FormUpdate;
const id = context.params.id as string;
try {
const result = await prisma.pilihanRatingResponden.update({
where: { id },
data: {
name: body.name,
},
});
return {
success: true,
message: "Berhasil mengupdate pilihan rating responden",
data: result,
};
} catch (error) {
console.error("Error updating pilihan rating responden:", error);
throw new Error("Gagal mengupdate pilihan rating responden: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,43 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
name: string;
tanggal: string;
jenisKelaminId: string;
ratingId: string;
kelompokUmurId: string;
}
export default async function respondenCreate(context: Context) {
const body = (await context.body) as FormCreate;
try {
// Convert the date string to a Date object
const tanggal = new Date(body.tanggal);
// Validate the date
if (isNaN(tanggal.getTime())) {
throw new Error('Tanggal tidak valid');
}
const result = await prisma.responden.create({
data: {
name: body.name,
tanggal: tanggal, // Use the Date object
jenisKelaminId: body.jenisKelaminId,
ratingId: body.ratingId,
kelompokUmurId: body.kelompokUmurId,
},
});
return {
success: true,
message: "Berhasil membuat responden",
data: result,
};
} catch (error) {
console.error("Error creating responden:", error);
throw new Error("Gagal membuat responden: " + (error as Error).message);
}
}

View File

@@ -0,0 +1,33 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function respondenDelete(context: Context) {
const id = context.params?.id as string;
const responden = await prisma.responden.findUnique({
where: { id },
include: {
jenisKelamin: true,
rating: true,
kelompokUmur: true,
},
});
if (!responden) {
return {
status: 404,
success: false,
message: "Responden tidak ditemukan",
};
}
await prisma.responden.delete({
where: { id },
});
return {
status: 200,
success: true,
message: "Success delete responden",
};
}

View File

@@ -0,0 +1,61 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function respondenFindMany(context: Context) {
// Ambil parameter dari query
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const search = (context.query.search as string) || '';
const skip = (page - 1) * limit;
// Buat where clause
const where: any = { isActive: true };
// Tambahkan pencarian (jika ada)
if (search) {
where.OR = [
{ tanggal: { contains: search, mode: 'insensitive' } },
{ jenisKelamin: { name: { contains: search, mode: 'insensitive' } } },
{ rating: { name: { contains: search, mode: 'insensitive' } } },
{ kelompokUmur: { name: { contains: search, mode: 'insensitive' } } }
];
}
try {
// Ambil data dan total count secara paralel
const [data, total] = await Promise.all([
prisma.responden.findMany({
where,
include: {
jenisKelamin: true,
rating: true,
kelompokUmur: true,
},
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.responden.count({ where }),
]);
return {
success: true,
message: "Berhasil ambil responden dengan pagination",
data,
page,
limit,
total,
totalPages: Math.ceil(total / limit),
};
} catch (e) {
console.error("Error di findMany paginated:", e);
return {
success: false,
message: "Gagal mengambil data responden",
};
}
}
export default respondenFindMany;

View File

@@ -0,0 +1,51 @@
import prisma from "@/lib/prisma";
export default async function respondenFindUnique(request: Request) {
const url = new URL(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.responden.findUnique({
where: { id },
include: {
jenisKelamin: true,
rating: true,
kelompokUmur: true,
},
});
if (!data) {
return {
success: false,
message: "Data not found",
}
}
return {
success: true,
message: "Success fetch responden by ID",
data,
}
} catch (e) {
console.error("Find by ID error:", e);
return {
success: false,
message: "Gagal mengambil responden: " + (e instanceof Error ? e.message : 'Unknown error'),
}
}
}

View File

@@ -0,0 +1,42 @@
import Elysia from "elysia";
import { t } from "elysia";
import respondenFindMany from "./findMany";
import respondenFindUnique from "./findUnique";
import respondenCreate from "./create";
import respondenUpdate from "./updt";
import respondenDelete from "./del";
const Responden = new Elysia({ prefix: "/responden", tags: ["Desa/Responden"] })
.get("/findMany", respondenFindMany)
.get("/:id", async (context) => {
const response = await respondenFindUnique(new Request(context.request));
return response;
})
.post("/create", respondenCreate, {
body: t.Object({
name: t.String(),
tanggal: t.String(),
jenisKelaminId: t.String(),
ratingId: t.String(),
kelompokUmurId: t.String(),
}),
})
.delete("/del/:id", respondenDelete)
.put(
"/:id",
async (context) => {
const response = await respondenUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
tanggal: t.String(),
jenisKelaminId: t.String(),
ratingId: t.String(),
kelompokUmurId: t.String(),
}),
}
);
export default Responden;

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
name: string;
tanggal: string;
jenisKelaminId: string;
ratingId: string;
kelompokUmurId: string;
}
export default async function respondenUpdate(context: Context) {
const body = (await context.body) as FormUpdate;
const id = context.params.id as string;
try {
const result = await prisma.responden.update({
where: { id },
data: {
name: body.name,
tanggal: body.tanggal,
jenisKelaminId: body.jenisKelaminId,
ratingId: body.ratingId,
kelompokUmurId: body.kelompokUmurId,
},
});
return {
success: true,
message: "Berhasil mengupdate responden",
data: result,
};
} catch (error) {
console.error("Error updating responden:", error);
throw new Error("Gagal mengupdate responden: " + (error as Error).message);
}
}

View File

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

View File

@@ -0,0 +1,16 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function umurRespondenDelete(context: Context) {
const id = context.params.id as string;
await prisma.umurResponden.delete({
where: { id },
});
return {
status: 200,
success: true,
message: "Success delete umur responden",
};
}

View File

@@ -0,0 +1,53 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
// /api/berita/findManyPaginated.ts
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function umurRespondenFindMany(context: Context) {
// Ambil parameter dari query
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const search = (context.query.search as string) || '';
const skip = (page - 1) * limit;
// Buat where clause
const where: any = { isActive: true };
// Tambahkan pencarian (jika ada)
if (search) {
where.OR = [
{ name: { contains: search, mode: 'insensitive' } },
];
}
try {
// Ambil data dan total count secara paralel
const [data, total] = await Promise.all([
prisma.umurResponden.findMany({
where,
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.umurResponden.count({ where }),
]);
return {
success: true,
message: "Berhasil ambil umur responden dengan pagination",
data,
page,
limit,
total,
totalPages: Math.ceil(total / limit),
};
} catch (e) {
console.error("Error di findMany paginated:", e);
return {
success: false,
message: "Gagal mengambil data umur responden",
};
}
}
export default umurRespondenFindMany;

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function umurRespondenFindUnique(request: Request) {
const url = new URL(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.umurResponden.findUnique({
where: { id },
});
if (!data) {
return {
success: false,
message: "Data not found",
}
}
return {
success: true,
message: "Success get umur responden",
data,
}
} catch (error) {
console.error("Find by ID error:", error);
return {
success: false,
message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'),
}
}
}

View File

@@ -0,0 +1,33 @@
import Elysia, { t } from "elysia";
import umurRespondenCreate from "./create";
import umurRespondenDelete from "./del";
import umurRespondenFindMany from "./findMany";
import umurRespondenFindUnique from "./findUnique";
import umurRespondenUpdate from "./updt";
const UmurResponden = new Elysia({
prefix: "/umurresponden",
tags: ["PPID / Indeks Kepuasan / Umur Responden"],
})
.post("/create", umurRespondenCreate, {
body: t.Object({
name: t.String(),
}),
})
.get("/findMany", umurRespondenFindMany)
.get("/:id", async (context) => {
const response = await umurRespondenFindUnique(
new Request(context.request)
);
return response;
})
.put("/:id", umurRespondenUpdate, {
body: t.Object({
name: t.String(),
}),
})
.delete("/del/:id", umurRespondenDelete);
export default UmurResponden;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormUpdate = {
name: string;
}
export default async function umurRespondenUpdate(context: Context) {
const body = (await context.body) as FormUpdate;
const id = context.params.id as string;
try {
const result = await prisma.umurResponden.update({
where: { id },
data: {
name: body.name,
},
});
return {
success: true,
message: "Berhasil mengupdate umur responden",
data: result,
};
} catch (error) {
console.error("Error updating umur responden:", error);
throw new Error("Gagal mengupdate umur responden: " + (error as Error).message);
}
}

View File

@@ -8,6 +8,10 @@ import SDGSDesa from "./sdgs-desa";
import APBDes from "./apbdes";
import PrestasiDesa from "./prestasi-desa";
import KategoriPrestasi from "./prestasi-desa/kategori-prestasi";
import JenisKelaminResponden from "./indeks_kepuasan/jenis-kelamin-responden";
import PilihanRatingResponden from "./indeks_kepuasan/pilihan-rating-responden";
import UmurResponden from "./indeks_kepuasan/umur-responden";
import Responden from "./indeks_kepuasan/responden";
const LandingPage = new Elysia({
prefix: "/api/landingpage",
@@ -23,5 +27,9 @@ const LandingPage = new Elysia({
.use(APBDes)
.use(PrestasiDesa)
.use(KategoriPrestasi)
.use(JenisKelaminResponden)
.use(PilihanRatingResponden)
.use(UmurResponden)
.use(Responden)
export default LandingPage