API & State Jumlah Pengangguran

This commit is contained in:
2025-07-09 12:00:37 +08:00
parent 124dfb8160
commit 119275b95c
35 changed files with 1635 additions and 18 deletions

View File

@@ -9,6 +9,7 @@ import GrafikMenganggurBerdasarkanPendidikan from "./usia-kerja-yang-menganggur/
import JumlahPendudukMiskin from "./jumlah-penduduk-miskin";
import SektorUnggulanDesa from "./sektor-unggulan-desa";
import DemografiPekerjaan from "./demografi-pekerjaan";
import JumlahPengangguran from "./jumlah-pengangguran";
const Ekonomi = new Elysia({
prefix: "/api/ekonomi",
@@ -24,5 +25,6 @@ const Ekonomi = new Elysia({
.use(JumlahPendudukMiskin)
.use(SektorUnggulanDesa)
.use(DemografiPekerjaan)
.use(JumlahPengangguran)
export default Ekonomi

View File

@@ -0,0 +1,60 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.DetailDataPengangguranGetPayload<{
select: {
month: true;
year: true;
totalUnemployment: true;
educatedUnemployment: true;
uneducatedUnemployment: true;
percentageChange: true;
};
}>;
export default async function detailDataPengangguranCreate(context: Context) {
const body = context.body as FormCreate;
// Cek apakah data untuk bulan & tahun tersebut sudah ada
const existing = await prisma.detailDataPengangguran.findFirst({
where: {
month: body.month,
year: body.year,
},
});
if (existing) {
return {
success: false,
message: `Data bulan ${body.month} ${body.year} sudah ada.`,
data: null,
};
}
const created = await prisma.detailDataPengangguran.create({
data: {
month: body.month,
year: body.year,
totalUnemployment: body.totalUnemployment,
educatedUnemployment: body.educatedUnemployment,
uneducatedUnemployment: body.uneducatedUnemployment,
percentageChange: body.percentageChange ?? null,
},
select: {
id: true,
month: true,
year: true,
totalUnemployment: true,
educatedUnemployment: true,
uneducatedUnemployment: true,
percentageChange: true,
},
});
return {
success: true,
message: "Berhasil menambahkan data pengangguran bulanan",
data: created,
};
}

View File

@@ -0,0 +1,36 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function detailDataPengangguranDelete(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const existing = await prisma.detailDataPengangguran.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const deleted = await prisma.detailDataPengangguran.delete({
where: { id },
})
return {
success: true,
message: "Data berhasil dihapus",
data: deleted,
}
}

View File

@@ -0,0 +1,10 @@
import prisma from "@/lib/prisma";
export default async function detailDataPengangguranFindMany() {
const res = await prisma.detailDataPengangguran.findMany({
orderBy: [{ year: "desc" }, { month: "asc" }],
});
return {
data: res,
};
}

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function detailDataPengangguranFindUnique(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.detailDataPengangguran.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, { status: 404 });
}
return Response.json({
success: true,
message: "Data ditemukan",
data: data,
}, { status: 200 });
} catch (error) {
console.error("Error fetching data:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengambil data",
}, { status: 500 });
}
}

View File

@@ -0,0 +1,48 @@
import Elysia, { t } from "elysia";
import detailDataPengangguranFindMany from "./findMany";
import detailDataPengangguranCreate from "./create";
import detailDataPengangguranUpdate from "./updt";
import detailDataPengangguranFindUnique from "./findUnique";
import detailDataPengangguranDelete from "./del";
const DetailDataPengangguran = new Elysia({
prefix: "/detaildatapengangguran",
tags: ["Ekonomi/Jumlah Pengangguran/Detail Data Pengangguran"],
})
.get("/:id", async (context) => {
const response = await detailDataPengangguranFindUnique(
new Request(context.request)
);
return response;
})
.get("/find-many", detailDataPengangguranFindMany)
.post("/create", detailDataPengangguranCreate, {
body: t.Object({
month: t.String(),
year: t.Number(),
totalUnemployment: t.Number(),
educatedUnemployment: t.Number(),
uneducatedUnemployment: t.Number(),
percentageChange: t.Number(),
}),
})
.put("/:id", detailDataPengangguranUpdate, {
params: t.Object({
id: t.String(),
}),
body: t.Object({
month: t.String(),
year: t.Number(),
totalUnemployment: t.Number(),
educatedUnemployment: t.Number(),
uneducatedUnemployment: t.Number(),
percentageChange: t.Number(),
}),
})
.delete("/del/:id", detailDataPengangguranDelete, {
params: t.Object({
id: t.String(),
}),
});
export default DetailDataPengangguran;

View File

@@ -0,0 +1,68 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function detailDataPengangguranUpdate(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const { month, year, totalUnemployment, educatedUnemployment, uneducatedUnemployment, percentageChange } = context.body as {
month: string;
year: number;
totalUnemployment: number;
educatedUnemployment: number;
uneducatedUnemployment: number;
percentageChange: number;
}
const duplicate = await prisma.detailDataPengangguran.findFirst({
where: {
month,
year,
NOT: { id },
},
});
if (duplicate) {
return {
success: false,
message: `Data bulan ${month} ${year} sudah ada.`,
};
}
const existing = await prisma.detailDataPengangguran.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const updated = await prisma.detailDataPengangguran.update({
where: { id },
data: {
month,
year,
totalUnemployment,
educatedUnemployment,
uneducatedUnemployment,
percentageChange,
},
})
return {
success: true,
message: "Data berhasil diupdate",
data: updated,
}
}

View File

@@ -0,0 +1,13 @@
import Elysia from "elysia";
import DetailDataPengangguran from "./detail-data-pengangguran";
import RingkasanDataPengangguran from "./ringkasan-data-pengangguran";
import SedangMencariKerja from "./sedang-mencari-kerja";
const JumlahPengangguran = new Elysia({
prefix: "/jumlahpengangguran",
})
.use(DetailDataPengangguran)
.use(RingkasanDataPengangguran)
.use(SedangMencariKerja)
export default JumlahPengangguran;

View File

@@ -0,0 +1,61 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.RingkasanDataPengangguranGetPayload<{
select: {
year: true;
totalUnemployment: true;
educatedUnemployment: true;
percentageEducatedOfTotal: true;
productiveAgePopulation: true;
percentageProductiveOfTotal: true;
percentageChangeFromPreviousYear: true;
};
}>;
export default async function ringkasanDataPengangguranCreate(context: Context) {
const body = context.body as FormCreate;
const existing = await prisma.ringkasanDataPengangguran.findFirst({
where: {
year: body.year,
},
});
if (existing) {
return {
success: false,
message: `Data tahun ${body.year} sudah ada.`,
data: null,
};
}
const created = await prisma.ringkasanDataPengangguran.create({
data: {
year: body.year,
totalUnemployment: body.totalUnemployment,
educatedUnemployment: body.educatedUnemployment,
percentageEducatedOfTotal: body.percentageEducatedOfTotal,
productiveAgePopulation: body.productiveAgePopulation,
percentageProductiveOfTotal: body.percentageProductiveOfTotal,
percentageChangeFromPreviousYear: body.percentageChangeFromPreviousYear,
},
select: {
id: true,
year: true,
totalUnemployment: true,
educatedUnemployment: true,
percentageEducatedOfTotal: true,
productiveAgePopulation: true,
percentageProductiveOfTotal: true,
percentageChangeFromPreviousYear: true,
},
});
return {
success: true,
message: "Berhasil menambahkan data ringkasan pengangguran",
data: created,
};
}

View File

@@ -0,0 +1,38 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function ringkasanDataPengangguranDelete(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const existing = await prisma.ringkasanDataPengangguran.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const deleted = await prisma.ringkasanDataPengangguran.delete({
where: {
id: id,
},
})
return {
success: true,
message: "Berhasil menghapus data ringkasan pengangguran",
data: deleted,
}
}

View File

@@ -0,0 +1,10 @@
import prisma from "@/lib/prisma";
export default async function ringkasanDataPengangguranFindMany() {
const res = await prisma.ringkasanDataPengangguran.findMany({
orderBy: [{ year: "desc" }],
});
return {
data: res,
};
}

View File

@@ -0,0 +1,45 @@
import prisma from "@/lib/prisma";
export default async function ringkasanDataPengangguranFindUnique(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.ringkasanDataPengangguran.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, { status: 404 });
}
return Response.json({
success: true,
data: data,
}, { status: 200 });
} catch (error) {
console.error("Error fetching data:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengambil data",
}, { status: 500 });
}
}

View File

@@ -0,0 +1,50 @@
import Elysia, { t } from "elysia";
import ringkasanDataPengangguranFindUnique from "./findUnique";
import ringkasanDataPengangguranFindMany from "./findMany";
import ringkasanDataPengangguranCreate from "./create";
import ringkasanDataPengangguranUpdate from "./updt";
import ringkasanDataPengangguranDelete from "./del";
const RingkasanDataPengangguran = new Elysia({
prefix: "/ringkasandatapengangguran",
tags: ["Ekonomi/Jumlah Pengangguran/Ringkasan Data Pengangguran"],
})
.get("/:id", async (context) => {
const response = await ringkasanDataPengangguranFindUnique(
new Request(context.request)
);
return response;
})
.get("/find-many", ringkasanDataPengangguranFindMany)
.post("/create", ringkasanDataPengangguranCreate, {
body: t.Object({
year: t.Number(),
totalUnemployment: t.Number(),
educatedUnemployment: t.Number(),
percentageEducatedOfTotal: t.Number(),
productiveAgePopulation: t.Number(),
percentageProductiveOfTotal: t.Number(),
percentageChangeFromPreviousYear: t.Number(),
}),
})
.put("/:id", ringkasanDataPengangguranUpdate, {
params: t.Object({
id: t.String(),
}),
body: t.Object({
year: t.Number(),
totalUnemployment: t.Number(),
educatedUnemployment: t.Number(),
percentageEducatedOfTotal: t.Number(),
productiveAgePopulation: t.Number(),
percentageProductiveOfTotal: t.Number(),
percentageChangeFromPreviousYear: t.Number(),
}),
})
.delete("/del/:id", ringkasanDataPengangguranDelete, {
params: t.Object({
id: t.String(),
}),
});
export default RingkasanDataPengangguran;

View File

@@ -0,0 +1,70 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function ringkasanDataPengangguranUpdate(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const { year, totalUnemployment, educatedUnemployment, percentageEducatedOfTotal, productiveAgePopulation, percentageProductiveOfTotal, percentageChangeFromPreviousYear } = context.body as {
year: number;
totalUnemployment: number;
educatedUnemployment: number;
percentageEducatedOfTotal: number;
productiveAgePopulation: number;
percentageProductiveOfTotal: number;
percentageChangeFromPreviousYear: number;
}
const duplicate = await prisma.ringkasanDataPengangguran.findFirst({
where: {
year,
NOT: { id },
},
});
if (duplicate) {
return {
success: false,
message: `Data tahun ${year} sudah ada.`,
};
}
const existing = await prisma.ringkasanDataPengangguran.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const updated = await prisma.ringkasanDataPengangguran.update({
where: { id },
data: {
year,
totalUnemployment,
educatedUnemployment,
percentageEducatedOfTotal,
productiveAgePopulation,
percentageProductiveOfTotal,
percentageChangeFromPreviousYear,
},
})
return {
success: true,
message: "Data berhasil diupdate",
data: updated,
}
}

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
import { Prisma } from "@prisma/client";
import { Context } from "elysia";
type FormCreate = Prisma.SedangMencariKerjaGetPayload<{
select: {
count: true;
percentageOfTotal: true;
recordedDate: true;
};
}>;
export default async function sedangMencariKerjaCreate(context: Context) {
const body = context.body as FormCreate;
const existing = await prisma.sedangMencariKerja.findFirst({
where: {
recordedDate: body.recordedDate,
},
});
if (existing) {
return {
success: false,
message: "Data sudah ada",
data: null,
};
}
const created = await prisma.sedangMencariKerja.create({
data: {
count: body.count,
percentageOfTotal: body.percentageOfTotal,
recordedDate: body.recordedDate,
},
select: {
id: true,
count: true,
percentageOfTotal: true,
recordedDate: true,
},
});
return {
success: true,
message: "Berhasil menambahkan data sedang mencari kerja",
data: created,
};
}

View File

@@ -0,0 +1,38 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function sedangMencariKerjaDelete(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const existing = await prisma.sedangMencariKerja.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const deleted = await prisma.sedangMencariKerja.delete({
where: {
id: id,
},
})
return {
success: true,
message: "Berhasil menghapus data sedang mencari kerja",
data: deleted,
}
}

View File

@@ -0,0 +1,10 @@
import prisma from "@/lib/prisma";
export default async function sedangMencariKerjaFindMany() {
const res = await prisma.sedangMencariKerja.findMany({
orderBy: [{ recordedDate: "desc" }],
});
return {
data: res,
};
}

View File

@@ -0,0 +1,46 @@
import prisma from "@/lib/prisma";
export default async function sedangMencariKerjaFindUnique(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.sedangMencariKerja.findUnique({
where: { id },
});
if (!data) {
return Response.json({
success: false,
message: "Data tidak ditemukan",
}, { status: 404 });
}
return Response.json({
success: true,
message: "Data ditemukan",
data,
}, { status: 200 });
} catch (error) {
console.error("Error fetching data:", error);
return Response.json({
success: false,
message: "Terjadi kesalahan saat mengambil data",
}, { status: 500 });
}
}

View File

@@ -0,0 +1,42 @@
import Elysia, { t } from "elysia";
import sedangMencariKerjaFindUnique from "./findUnique";
import sedangMencariKerjaFindMany from "./findMany";
import sedangMencariKerjaCreate from "./create";
import sedangMencariKerjaUpdate from "./updt";
import sedangMencariKerjaDelete from "./del";
const SedangMencariKerja = new Elysia({
prefix: "/sedangmencarikerja",
tags: ["Ekonomi/Jumlah Pengangguran/Sedang Mencari Kerja"],
})
.get("/:id", async (context) => {
const response = await sedangMencariKerjaFindUnique(
new Request(context.request)
);
return response;
})
.get("/find-many", sedangMencariKerjaFindMany)
.post("/create", sedangMencariKerjaCreate, {
body: t.Object({
count: t.Number(),
percentageOfTotal: t.Number(),
recordedDate: t.String(),
}),
})
.put("/:id", sedangMencariKerjaUpdate, {
params: t.Object({
id: t.String(),
}),
body: t.Object({
count: t.Number(),
percentageOfTotal: t.Number(),
recordedDate: t.String(),
}),
})
.delete("/del/:id", sedangMencariKerjaDelete, {
params: t.Object({
id: t.String(),
}),
});
export default SedangMencariKerja;

View File

@@ -0,0 +1,49 @@
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function sedangMencariKerjaUpdate(context: Context) {
const id = context.params?.id;
if (!id) {
return {
success: false,
message: "ID tidak ditemukan",
}
}
const { count, percentageOfTotal, recordedDate } = context.body as {
count: number;
percentageOfTotal: number;
recordedDate: string;
}
const existing = await prisma.sedangMencariKerja.findUnique({
where: {
id: id,
},
})
if (!existing) {
return {
success: false,
message: "Data tidak ditemukan",
}
}
const updated = await prisma.sedangMencariKerja.update({
where: {
id: id,
},
data: {
count: count,
percentageOfTotal: percentageOfTotal,
recordedDate: recordedDate,
},
})
return {
success: true,
message: "Berhasil mengupdate data sedang mencari kerja",
data: updated,
}
}