diff --git a/package.json b/package.json index ea32368a..6ca5e126 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "desa-darmasaba", - "version": "0.1.45", + "version": "0.1.46", "private": true, "scripts": { "dev": "next dev", diff --git a/src/app/api/[[...slugs]]/_lib/desa/index.ts b/src/app/api/[[...slugs]]/_lib/desa/index.ts index bed69bfd..00274899 100644 --- a/src/app/api/[[...slugs]]/_lib/desa/index.ts +++ b/src/app/api/[[...slugs]]/_lib/desa/index.ts @@ -14,6 +14,7 @@ import MantanPerbekel from "./profile/profile-mantan-perbekel"; import AjukanPermohonan from "./layanan/ajukan_permohonan"; import Musik from "./musik"; import KegiatanDesa from "./kegiatan-desa"; +import KategoriKegiatan from "./kegiatan-desa/kategori-kegiatan"; const Desa = new Elysia({ prefix: "/desa", tags: ["Desa"] }) @@ -32,6 +33,7 @@ const Desa = new Elysia({ prefix: "/desa", tags: ["Desa"] }) .use(AjukanPermohonan) .use(Musik) .use(KegiatanDesa) + .use(KategoriKegiatan) export default Desa; diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/create.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/create.ts new file mode 100644 index 00000000..e9c23002 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/create.ts @@ -0,0 +1,26 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +type FormCreate = { + nama: string; +} + +export default async function kategoriKegiatanCreate(context: Context) { + const body = (await context.body) as FormCreate; + + try { + const result = await prisma.kategoriKegiatan.create({ + data: { + nama: body.nama, + }, + }); + return { + success: true, + message: "Berhasil membuat kategori kegiatan", + data: result, + }; + } catch (error) { + console.error("Error creating kategori kegiatan:", error); + throw new Error("Gagal membuat kategori kegiatan: " + (error as Error).message); + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/del.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/del.ts new file mode 100644 index 00000000..f0175086 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/del.ts @@ -0,0 +1,50 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function kategoriKegiatanDelete(context: Context) { + try { + const id = context.params?.id as string; + + if (!id) { + return Response.json({ + success: false, + message: "ID tidak boleh kosong", + }, { status: 400 }); + } + + // ✅ Cek apakah kategori masih digunakan oleh kegiatan + const kegiatanCount = await prisma.kegiatanDesa.count({ + where: { + kategoriKegiatanId: id, + isActive: true, + }, + }); + + if (kegiatanCount > 0) { + return Response.json({ + success: false, + message: `Kategori tidak dapat dihapus karena masih digunakan oleh ${kegiatanCount} kegiatan`, + }, { status: 400 }); + } + + // ✅ Soft delete (bukan hard delete) + await prisma.kategoriKegiatan.update({ + where: { id }, + data: { + deletedAt: new Date(), + isActive: false, + }, + }); + + return { + success: true, + message: "Kategori kegiatan berhasil dihapus", + }; + } catch (error) { + console.error("Delete kategori error:", error); + return Response.json({ + success: false, + message: "Gagal menghapus kategori: " + (error instanceof Error ? error.message : 'Unknown error'), + }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findMany.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findMany.ts new file mode 100644 index 00000000..6a0b5381 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findMany.ts @@ -0,0 +1,52 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +async function kategoriKegiatanFindMany(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 = [ + { nama: { contains: search, mode: 'insensitive' } }, + ]; + } + + try { + // Ambil data dan total count secara paralel + const [data, total] = await Promise.all([ + prisma.kategoriKegiatan.findMany({ + where, + skip, + take: limit, + orderBy: { createdAt: 'asc' }, + }), + prisma.kategoriKegiatan.count({ where }), + ]); + + return { + success: true, + message: "Berhasil ambil kategori kegiatan 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 kategori kegiatan", + }; + } +} + +export default kategoriKegiatanFindMany; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findUnique.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findUnique.ts new file mode 100644 index 00000000..5f8df078 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/findUnique.ts @@ -0,0 +1,46 @@ +import prisma from "@/lib/prisma"; + +export default async function kategoriKegiatanFindUnique(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.kategoriKegiatan.findUnique({ + where: { id }, + }); + + if (!data) { + return { + success: false, + message: "Data not found", + } + } + + return { + success: true, + message: "Success get kategori kegiatan", + data, + } + } catch (error) { + console.error("Find by ID error:", error); + return { + success: false, + message: "Gagal mengambil data: " + (error instanceof Error ? error.message : 'Unknown error'), + } + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/index.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/index.ts new file mode 100644 index 00000000..1591ed19 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/index.ts @@ -0,0 +1,33 @@ +import Elysia, { t } from "elysia"; +import kategoriKegiatanCreate from "./create"; +import kategoriKegiatanDelete from "./del"; +import kategoriKegiatanFindMany from "./findMany"; +import kategoriKegiatanFindUnique from "./findUnique"; +import kategoriKegiatanUpdate from "./updt"; + +const KategoriKegiatan = new Elysia({ + prefix: "/kategorikegiatan", + tags: ["Desa / Kegiatan Desa / Kategori Kegiatan"], +}) + + .post("/create", kategoriKegiatanCreate, { + body: t.Object({ + nama: t.String(), + }), + }) + + .get("/findMany", kategoriKegiatanFindMany) + .get("/:id", async (context) => { + const response = await kategoriKegiatanFindUnique( + new Request(context.request) + ); + return response; + }) + .put("/:id", kategoriKegiatanUpdate, { + body: t.Object({ + nama: t.String(), + }), + }) + .delete("/del/:id", kategoriKegiatanDelete); + +export default KategoriKegiatan; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/updt.ts b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/updt.ts new file mode 100644 index 00000000..474e69f6 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/desa/kegiatan-desa/kategori-kegiatan/updt.ts @@ -0,0 +1,28 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +type FormUpdate = { + nama: string; +} + +export default async function kategoriKegiatanUpdate(context: Context) { + const body = (await context.body) as FormUpdate; + const id = context.params.id as string; + + try { + const result = await prisma.kategoriKegiatan.update({ + where: { id }, + data: { + nama: body.nama, + }, + }); + return { + success: true, + message: "Berhasil mengupdate kategori kegiatan", + data: result, + }; + } catch (error) { + console.error("Error updating kategori kegiatan:", error); + throw new Error("Gagal mengupdate kategori kegiatan: " + (error as Error).message); + } +} \ No newline at end of file