API & UI Tabs SubMenu Pendapatan, Menu PADesa

This commit is contained in:
2025-07-10 16:52:26 +08:00
parent 2bc9b2f3c6
commit cb52701f47
43 changed files with 2501 additions and 17 deletions

View File

@@ -2,7 +2,7 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function beritaFindManyPaginated(context: Context) {
async function beritaFindMany(context: Context) {
const page = Number(context.query.page) || 1;
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
@@ -41,4 +41,4 @@ async function beritaFindManyPaginated(context: Context) {
}
}
export default beritaFindManyPaginated;
export default beritaFindMany;

View File

@@ -10,6 +10,7 @@ import JumlahPendudukMiskin from "./jumlah-penduduk-miskin";
import SektorUnggulanDesa from "./sektor-unggulan-desa";
import DemografiPekerjaan from "./demografi-pekerjaan";
import JumlahPengangguran from "./jumlah-pengangguran";
import PendapatanAsliDesa from "./pendapatan-asli-desa";
const Ekonomi = new Elysia({
prefix: "/api/ekonomi",
@@ -26,5 +27,6 @@ const Ekonomi = new Elysia({
.use(SektorUnggulanDesa)
.use(DemografiPekerjaan)
.use(JumlahPengangguran)
.use(PendapatanAsliDesa)
export default Ekonomi

View File

@@ -0,0 +1,34 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
tahun: number;
pendapatanId: string;
belanjaId: string;
pembiayaanId: string;
}
export default async function apbDesaCreate(context: Context) {
const body = context.body as FormCreate;
const created = await prisma.apbDesa.create({
data: {
tahun: body.tahun,
pendapatanId: body.pendapatanId,
belanjaId: body.belanjaId,
pembiayaanId: body.pembiayaanId,
},
select: {
id: true,
tahun: true,
pendapatanId: true,
belanjaId: true,
pembiayaanId: true,
}
});
return {
success: true,
message: "Success create apb desa",
data: created,
};
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function apbDesaDelete(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.apbDesa.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus apb desa",
data: deleted,
};
}

View File

@@ -0,0 +1,43 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function apbDesaFindMany(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.apbDesa.findMany({
where: { isActive: true },
include: {
pendapatan: true,
belanja: true,
pembiayaan: true,
},
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.apbDesa.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch apb desa with pagination",
data,
page,
totalPages: Math.ceil(total / limit),
total,
};
} catch (e) {
console.error(e);
return {
success: false,
message: "Failed to fetch apb desa with pagination",
data: null,
};
}
}

View File

@@ -0,0 +1,56 @@
import prisma from "@/lib/prisma";
export default async function apbDesaFindUnique(
request: Request
) {
// Extract the ID from the URL path
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 {
// Validate that the ID is a valid UUID or whatever format you're using
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, { status: 400 });
}
const data = await prisma.apbDesa.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Apb desa tidak ditemukan",
}, { status: 404 });
}
// Ensure we're returning a proper Response object
return Response.json({
success: true,
message: "Success fetch apb desa by ID",
data,
}, {
status: 200,
});
} catch (e) {
console.error("Find by ID error:", e);
return Response.json({
success: false,
message: "Gagal mengambil apb desa: " + (e instanceof Error ? e.message : 'Unknown error'),
}, {
status: 500,
});
}
}

View File

@@ -0,0 +1,41 @@
import Elysia, { t } from "elysia";
import apbDesaFindMany from "./findMany";
import apbDesaFindUnique from "./findUnique";
import apbDesaCreate from "./create";
import apbDesaDelete from "./del";
import apbDesaUpdate from "./updt";
const APBDesa = new Elysia({
prefix: "/apbdesa",
tags: ["Ekonomi/Pendapatan Asli Desa/APB Desa"],
})
.get("/find-many", apbDesaFindMany)
.get("/:id", async (context) => {
const response = await apbDesaFindUnique(new Request(context.request));
return response;
})
.post("/create", apbDesaCreate, {
body: t.Object({
tahun: t.Number(),
pendapatanId: t.String(),
belanjaId: t.String(),
pembiayaanId: t.String(),
}),
})
.delete("/delete/:id", apbDesaDelete)
.put(
"/:id",
async (context) => {
const response = await apbDesaUpdate(context);
return response;
},
{
body: t.Object({
tahun: t.Number(),
pendapatanId: t.String(),
belanjaId: t.String(),
pembiayaanId: t.String(),
}),
}
);
export default APBDesa;

View File

@@ -0,0 +1,64 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormUpdate = Prisma.ApbDesaGetPayload<{
select: {
id: true;
tahun: true;
pendapatanId: true;
belanjaId: true;
pembiayaanId: true;
};
}>;
export default async function apbDesaUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
tahun,
pendapatanId,
belanjaId,
pembiayaanId,
} = body;
if (!id) {
return {
success: false,
message: "ID tidak boleh kosong",
};
}
const existing = await prisma.apbDesa.findUnique({
where: { id },
});
if (!existing) {
return {
success: false,
message: "APB Desa tidak ditemukan",
};
}
const updated = await prisma.apbDesa.update({
where: { id },
data: {
tahun,
pendapatanId,
belanjaId,
pembiayaanId,
}
});
return {
success: true,
message: "Success update APB Desa",
data: updated,
};
} catch (error) {
console.error('Error updating APB Desa:', error);
context.set.status = 500;
return { error: 'Failed to update APB Desa'};
}
}

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
name: string;
value: number;
}
export default async function belanjaCreate(context: Context) {
const body = context.body as FormCreate;
const created = await prisma.belanja.create({
data: {
name: body.name,
value: body.value,
},
select: {
id: true,
name: true,
value: true,
}
});
return {
success: true,
message: "Success create belanja",
data: created,
};
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function belanjaDelete(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.belanja.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus belanja",
data: deleted,
};
}

View File

@@ -0,0 +1,37 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function belanjaFindMany(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.belanja.findMany({
where: { isActive: true },
skip,
take: limit,
orderBy: { createdAt: "desc" },
}),
prisma.belanja.count({
where: { isActive: true },
}),
]);
return {
success: true,
message: "Success fetch berita 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 berita with pagination",
};
}
}

View File

@@ -0,0 +1,69 @@
import prisma from "@/lib/prisma";
export default async function belanjaFindUnique(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 {
// Validate that the ID is a valid UUID or whatever format you're using
if (typeof id !== "string") {
return Response.json(
{
success: false,
message: "ID tidak valid",
},
{ status: 400 }
);
}
const data = await prisma.belanja.findUnique({
where: { id },
});
if (!data) {
return Response.json(
{
success: false,
message: "Belanja tidak ditemukan",
},
{ status: 404 }
);
}
// Ensure we're returning a proper Response object
return Response.json(
{
success: true,
message: "Success fetch belanja by ID",
data,
},
{
status: 200,
}
);
} catch (e) {
console.error("Find by ID error:", e);
return Response.json(
{
success: false,
message:
"Gagal mengambil belanja: " +
(e instanceof Error ? e.message : "Unknown error"),
},
{
status: 500,
}
);
}
}

View File

@@ -0,0 +1,33 @@
import Elysia, { t } from "elysia";
import belanjaFindMany from "./findMany";
import belanjaFindUnique from "./findUnique";
import belanjaCreate from "./create";
import belanjaDelete from "./del";
import belanjaUpdate from "./updt";
const Belanja = new Elysia({
prefix: "/belanja",
tags: ["Ekonomi/Pendapatan Asli Desa/Belanja"],
})
.get("/find-many", belanjaFindMany)
.get("/:id", async (context) => {
const response = await belanjaFindUnique(new Request(context.request));
return response;
})
.post("/create", belanjaCreate, {
body: t.Object({
name: t.String(),
value: t.Number(),
}),
})
.delete("/delete/:id", belanjaDelete)
.put("/:id", async (context) => {
const response = await belanjaUpdate(context);
return response;
}, {
body: t.Object({
name: t.String(),
value: t.Number(),
}),
});
export default Belanja;

View File

@@ -0,0 +1,60 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormUpdate = Prisma.BelanjaGetPayload<{
select: {
id: true;
name: true;
value: true;
};
}>;
export default async function belanjaUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
name,
value,
} = body;
if (!id) {
return {
success: false,
message: "ID tidak boleh kosong",
};
}
const existing = await prisma.belanja.findUnique({
where: { id },
});
if (!existing) {
return {
success: false,
message: "Belanja tidak ditemukan",
};
}
const updated = await prisma.belanja.update({
where: { id },
data: {
name,
value,
}
});
return {
success: true,
message: "Success update belanja",
data: updated,
};
} catch (error) {
console.error("Update error:", error);
return {
success: false,
message: "Failed update belanja",
};
}
}

View File

@@ -0,0 +1,15 @@
import Elysia from "elysia";
import PendapatanAsli from "./pendapatan";
import Belanja from "./belanja";
import Pembiayaan from "./pembiayaan";
import APBDesa from "./apbDesa";
const PendapatanAsliDesa = new Elysia({
prefix: "/pendapatanaslidesa",
tags: ["Ekonomi/Pendapatan Asli Desa"],
})
.use(PendapatanAsli)
.use(Belanja)
.use(Pembiayaan)
.use(APBDesa)
export default PendapatanAsliDesa;

View File

@@ -0,0 +1,28 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
name: string;
value: number;
}
export default async function pembiayaanCreate(context: Context) {
const body = context.body as FormCreate;
const created = await prisma.pembiayaan.create({
data: {
name: body.name,
value: body.value,
},
select: {
id: true,
name: true,
value: true,
}
});
return {
success: true,
message: "Success create pembiayaan",
data: created,
};
}

View File

@@ -0,0 +1,22 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pembiayaanDelete(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.pembiayaan.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus pembiayaan",
data: deleted,
};
}

View File

@@ -0,0 +1,37 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pembiayaanFindMany(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.pembiayaan.findMany({
where: { isActive: true },
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.pembiayaan.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch pembiayaan 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 pembiayaan with pagination",
};
}
}

View File

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

View File

@@ -0,0 +1,37 @@
import Elysia, { t } from "elysia";
import pembiayaanFindMany from "./findMany";
import pembiayaanFindUnique from "./findUnique";
import pembiayaanCreate from "./create";
import pembiayaanDelete from "./del";
import pembiayaanUpdate from "./updt";
const Pembiayaan = new Elysia({
prefix: "/pembiayaan",
tags: ["Ekonomi/Pendapatan Asli Desa/Pembiayaan"],
})
.get("/find-many", pembiayaanFindMany)
.get("/:id", async (context) => {
const response = await pembiayaanFindUnique(new Request(context.request));
return response;
})
.post("/create", pembiayaanCreate, {
body: t.Object({
name: t.String(),
value: t.Number(),
}),
})
.delete("/delete/:id", pembiayaanDelete)
.put(
"/:id",
async (context) => {
const response = await pembiayaanUpdate(context);
return response;
},
{
body: t.Object({
name: t.String(),
value: t.Number(),
}),
}
);
export default Pembiayaan;

View File

@@ -0,0 +1,60 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormUpdate = Prisma.PembiayaanGetPayload<{
select: {
id: true;
name: true;
value: true;
};
}>;
export default async function pembiayaanUpdate(context: Context) {
try {
const id = context.params?.id as string;
const body = (await context.body) as Omit<FormUpdate, "id">;
const {
name,
value,
} = body;
if (!id) {
return {
success: false,
message: "ID tidak boleh kosong",
};
}
const existing = await prisma.pembiayaan.findUnique({
where: { id },
});
if (!existing) {
return {
success: false,
message: "Pembiayaan tidak ditemukan",
};
}
const updated = await prisma.pembiayaan.update({
where: { id },
data: {
name,
value,
}
});
return {
success: true,
message: "Success update pembiayaan",
data: updated,
};
} catch (error) {
console.error("Update error:", error);
return {
success: false,
message: "Failed update pembiayaan",
};
}
}

View File

@@ -0,0 +1,29 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
type FormCreate = {
name: string;
value: number;
}
export default async function pendapatanAsliCreate(context: Context) {
const body = context.body as FormCreate;
const created = await prisma.pendapatan.create({
data: {
name: body.name,
value: body.value,
},
select: {
id: true,
name: true,
value: true,
}
});
return {
success: true,
message: "Success create pendapatan asli desa",
data: created,
};
}

View File

@@ -0,0 +1,21 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pendapatanAsliDelete(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.pendapatan.delete({
where: { id },
});
return {
success: true,
message: "Berhasil menghapus pendapatan asli desa",
data: deleted,
};
}

View File

@@ -0,0 +1,40 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
async function pendapatanAsliFindMany(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.pendapatan.findMany({
where: { isActive: true },
skip,
take: limit,
orderBy: { createdAt: 'desc' },
}),
prisma.pendapatan.count({
where: { isActive: true }
})
]);
return {
success: true,
message: "Success fetch berita 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 berita with pagination",
};
}
}
export default pendapatanAsliFindMany;

View File

@@ -0,0 +1,56 @@
import prisma from "@/lib/prisma";
export default async function pendapatanAsliFindUnique(
request: Request
) {
// Extract the ID from the URL path
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 {
// Validate that the ID is a valid UUID or whatever format you're using
if (typeof id !== 'string') {
return Response.json({
success: false,
message: "ID tidak valid",
}, { status: 400 });
}
const data = await prisma.pendapatan.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Pendapatan tidak ditemukan",
}, { status: 404 });
}
// Ensure we're returning a proper Response object
return Response.json({
success: true,
message: "Success fetch pendapatan asli desa by ID",
data,
}, {
status: 200,
});
} catch (e) {
console.error("Find by ID error:", e);
return Response.json({
success: false,
message: "Gagal mengambil pendapatan asli desa: " + (e instanceof Error ? e.message : 'Unknown error'),
}, {
status: 500,
});
}
}

View File

@@ -0,0 +1,43 @@
import Elysia, { t } from "elysia";
import pendapatanAsliFindMany from "./findMany";
import pendapatanAsliFindUnique from "./findUnique";
import pendapatanAsliCreate from "./create";
import pendapatanAsliDelete from "./del";
import pendapatanAsliUpdate from "./updt";
const PendapatanAsli = new Elysia({
prefix: "/pendapatanasli",
tags: ["Ekonomi/Pendapatan Asli Desa/Pendapatan"],
})
.get("/find-many", pendapatanAsliFindMany)
.get("/:id", async (context) => {
const response = await pendapatanAsliFindUnique(
new Request(context.request)
);
return response;
})
.post("/create", pendapatanAsliCreate, {
body: t.Object({
name: t.String(),
value: t.Number(),
}),
})
.delete("/del/:id", pendapatanAsliDelete)
.put(
"/:id",
async (context) => {
return await pendapatanAsliUpdate(context);
},
{
params: t.Object({
id: t.String(),
}),
body: t.Object({
name: t.String(),
value: t.Number(),
}),
}
)
export default PendapatanAsli;

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function pendapatanAsliUpdate(context: Context) {
const id = context.params?.id as string;
const body = context.body as { name: string; value: number };
if (!id) {
return { success: false, message: "ID tidak boleh kosong" };
}
try {
const existing = await prisma.pendapatan.findUnique({ where: { id } });
if (!existing) {
return { success: false, message: "Data tidak ditemukan" };
}
const updated = await prisma.pendapatan.update({
where: { id },
data: {
name: body.name,
value: body.value,
},
});
return {
success: true,
message: "Berhasil update pendapatan",
data: updated,
};
} catch (error) {
console.error("Update error:", error);
return { success: false, message: "Gagal update pendapatan" };
}
}