From 2a857f54e73b9d262362ad87853ed0b2eb4450d8 Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Mon, 2 Feb 2026 17:03:51 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20API=20Job=20untuk=20loaddata:=20API=20?= =?UTF-8?q?=E2=80=93=20Job=20(Mobile)=20-=20src/app/api/mobile/job/route.t?= =?UTF-8?q?s=20-=20src/app/api/mobile/job/[id]/[status]/route.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs - PROMPT-AI.md Constants - src/lib/constans-value/ ### No Issue --- PROMPT-AI.md | 2 +- src/app/api/mobile/job/[id]/[status]/route.ts | 13 ++ src/app/api/mobile/job/route.ts | 186 +++++++++++------- src/lib/constans-value/constansValue.ts | 1 + 4 files changed, 128 insertions(+), 74 deletions(-) create mode 100644 src/lib/constans-value/constansValue.ts diff --git a/PROMPT-AI.md b/PROMPT-AI.md index c3a14f44..a807c539 100644 --- a/PROMPT-AI.md +++ b/PROMPT-AI.md @@ -1,5 +1,5 @@ -File utama: src/app/api/mobile/notification/[id]/route.ts +File utama: src/app/api/mobile/job/route.ts Terapkan pagination pada file "File utama" pada method GET Analisa juga file "File utama", jika belum memiliki page dari seachParams maka terapkan. Juga pastikan take dan skip sudah sesuai dengan pagination. Buat default nya menjadi 10 untuk take data diff --git a/src/app/api/mobile/job/[id]/[status]/route.ts b/src/app/api/mobile/job/[id]/[status]/route.ts index e7a6fa51..698c963d 100644 --- a/src/app/api/mobile/job/[id]/[status]/route.ts +++ b/src/app/api/mobile/job/[id]/[status]/route.ts @@ -1,3 +1,4 @@ +import { PAGINATION_DEFAULT_TAKE } from "@/lib/constans-value/constansValue"; import prisma from "@/lib/prisma"; import _ from "lodash"; import { NextResponse } from "next/server"; @@ -12,6 +13,11 @@ async function GET( const { id, status } = params; const fixStatusName = _.startCase(status); + const { searchParams } = new URL(request.url); + const page = Number(searchParams.get("page")); + const takeData = PAGINATION_DEFAULT_TAKE; + const skipData = page ? page * takeData - takeData : 0; + const data = await prisma.job.findMany({ orderBy: { updatedAt: "desc", @@ -28,13 +34,20 @@ async function GET( id: true, title: true, }, + take: takeData, + skip: skipData, }); + return NextResponse.json( { success: true, message: "Success get job", data: data, + pagination: { + currentPage: page, + dataPerPage: takeData, + }, }, { status: 200 } ); diff --git a/src/app/api/mobile/job/route.ts b/src/app/api/mobile/job/route.ts index 460e2d11..298a2845 100644 --- a/src/app/api/mobile/job/route.ts +++ b/src/app/api/mobile/job/route.ts @@ -3,6 +3,7 @@ import { routeAdminMobile } from "@/lib/mobile/route-page-mobile"; import prisma from "@/lib/prisma"; import { NextResponse } from "next/server"; import { NotificationMobileBodyType } from "../../../../../types/type-mobile-notification"; +import { PAGINATION_DEFAULT_TAKE } from "@/lib/constans-value/constansValue"; export { POST, GET }; @@ -45,7 +46,7 @@ async function POST(request: Request) { message: "Berhasil disimpan", data: create, }, - { status: 201 } + { status: 201 }, ); } catch (error) { return NextResponse.json( @@ -54,7 +55,7 @@ async function POST(request: Request) { message: "Error create job", reason: (error as Error).message, }, - { status: 500 } + { status: 500 }, ); } } @@ -64,94 +65,129 @@ async function GET(request: Request) { const search = searchParams.get("search"); const category = searchParams.get("category"); const authorId = searchParams.get("authorId"); + + const page = Number(searchParams.get("page")) || 1; + const takeData = PAGINATION_DEFAULT_TAKE; + const skipData = page * takeData - takeData; let fixData; try { if (category === "archive") { - const data = await prisma.job.findMany({ - where: { - authorId: authorId, - isActive: true, - isArsip: true, - MasterStatus: { - name: "Publish", - }, - // title: { - // contains: search || "", - // mode: "insensitive", - // }, - }, - orderBy: { - createdAt: "desc", - }, - select: { - id: true, - title: true, - deskripsi: true, - authorId: true, - MasterStatus: { - select: { - name: true, + const [data, count] = await Promise.all([ + prisma.job.findMany({ + where: { + authorId: authorId, + isActive: true, + isArsip: true, + MasterStatus: { + name: "Publish", }, + // title: { + // contains: search || "", + // mode: "insensitive", + // }, }, - Author: { - select: { - id: true, - username: true, - Profile: { - select: { - id: true, - name: true, - imageId: true, + orderBy: { + createdAt: "desc", + }, + select: { + id: true, + title: true, + deskripsi: true, + authorId: true, + MasterStatus: { + select: { + name: true, + }, + }, + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + imageId: true, + }, }, }, }, }, - }, - }); + take: takeData, + skip: skipData, + }), + prisma.job.count({ + where: { + authorId: authorId, + isActive: true, + isArsip: true, + MasterStatus: { + name: "Publish", + }, + }, + }), + ]); fixData = data; } else if (category === "beranda") { - const data = await prisma.job.findMany({ - where: { - isActive: true, - isArsip: false, - MasterStatus: { - name: "Publish", - }, - title: { - contains: search || "", - mode: "insensitive", - }, - }, - orderBy: { - createdAt: "desc", - }, - select: { - id: true, - title: true, - deskripsi: true, - authorId: true, - MasterStatus: { - select: { - name: true, + const [data, count] = await Promise.all([ + prisma.job.findMany({ + where: { + isActive: true, + isArsip: false, + MasterStatus: { + name: "Publish", + }, + title: { + contains: search || "", + mode: "insensitive", }, }, - Author: { - select: { - id: true, - username: true, - Profile: { - select: { - id: true, - name: true, - imageId: true, + orderBy: { + createdAt: "desc", + }, + select: { + id: true, + title: true, + deskripsi: true, + authorId: true, + MasterStatus: { + select: { + name: true, + }, + }, + Author: { + select: { + id: true, + username: true, + Profile: { + select: { + id: true, + name: true, + imageId: true, + }, }, }, }, }, - }, - }); + take: takeData, + skip: skipData, + }), + prisma.job.count({ + where: { + isActive: true, + isArsip: false, + MasterStatus: { + name: "Publish", + }, + title: { + contains: search || "", + mode: "insensitive", + }, + }, + }), + ]); fixData = data; } @@ -161,8 +197,12 @@ async function GET(request: Request) { success: true, message: "Success get data job-vacancy", data: fixData, + pagination: { + currentPage: page, + dataPerPage: takeData, + }, }, - { status: 200 } + { status: 200 }, ); } catch (error) { return NextResponse.json( @@ -171,7 +211,7 @@ async function GET(request: Request) { message: "Error get data job-vacancy", reason: (error as Error).message, }, - { status: 500 } + { status: 500 }, ); } } diff --git a/src/lib/constans-value/constansValue.ts b/src/lib/constans-value/constansValue.ts new file mode 100644 index 00000000..76fa2e1d --- /dev/null +++ b/src/lib/constans-value/constansValue.ts @@ -0,0 +1 @@ +export const PAGINATION_DEFAULT_TAKE = 10; \ No newline at end of file