Fix API Job untuk loaddata:

API – Job (Mobile)
- src/app/api/mobile/job/route.ts
- src/app/api/mobile/job/[id]/[status]/route.ts

Docs
- PROMPT-AI.md

Constants
- src/lib/constans-value/

### No Issue
This commit is contained in:
2026-02-02 17:03:51 +08:00
parent bb79a68f44
commit 2a857f54e7
4 changed files with 128 additions and 74 deletions

View File

@@ -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 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 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

View File

@@ -1,3 +1,4 @@
import { PAGINATION_DEFAULT_TAKE } from "@/lib/constans-value/constansValue";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import _ from "lodash"; import _ from "lodash";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
@@ -12,6 +13,11 @@ async function GET(
const { id, status } = params; const { id, status } = params;
const fixStatusName = _.startCase(status); 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({ const data = await prisma.job.findMany({
orderBy: { orderBy: {
updatedAt: "desc", updatedAt: "desc",
@@ -28,13 +34,20 @@ async function GET(
id: true, id: true,
title: true, title: true,
}, },
take: takeData,
skip: skipData,
}); });
return NextResponse.json( return NextResponse.json(
{ {
success: true, success: true,
message: "Success get job", message: "Success get job",
data: data, data: data,
pagination: {
currentPage: page,
dataPerPage: takeData,
},
}, },
{ status: 200 } { status: 200 }
); );

View File

@@ -3,6 +3,7 @@ import { routeAdminMobile } from "@/lib/mobile/route-page-mobile";
import prisma from "@/lib/prisma"; import prisma from "@/lib/prisma";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
import { NotificationMobileBodyType } from "../../../../../types/type-mobile-notification"; import { NotificationMobileBodyType } from "../../../../../types/type-mobile-notification";
import { PAGINATION_DEFAULT_TAKE } from "@/lib/constans-value/constansValue";
export { POST, GET }; export { POST, GET };
@@ -45,7 +46,7 @@ async function POST(request: Request) {
message: "Berhasil disimpan", message: "Berhasil disimpan",
data: create, data: create,
}, },
{ status: 201 } { status: 201 },
); );
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
@@ -54,7 +55,7 @@ async function POST(request: Request) {
message: "Error create job", message: "Error create job",
reason: (error as Error).message, reason: (error as Error).message,
}, },
{ status: 500 } { status: 500 },
); );
} }
} }
@@ -64,94 +65,129 @@ async function GET(request: Request) {
const search = searchParams.get("search"); const search = searchParams.get("search");
const category = searchParams.get("category"); const category = searchParams.get("category");
const authorId = searchParams.get("authorId"); const authorId = searchParams.get("authorId");
const page = Number(searchParams.get("page")) || 1;
const takeData = PAGINATION_DEFAULT_TAKE;
const skipData = page * takeData - takeData;
let fixData; let fixData;
try { try {
if (category === "archive") { if (category === "archive") {
const data = await prisma.job.findMany({ const [data, count] = await Promise.all([
where: { prisma.job.findMany({
authorId: authorId, where: {
isActive: true, authorId: authorId,
isArsip: true, isActive: true,
MasterStatus: { isArsip: true,
name: "Publish", MasterStatus: {
}, name: "Publish",
// title: {
// contains: search || "",
// mode: "insensitive",
// },
},
orderBy: {
createdAt: "desc",
},
select: {
id: true,
title: true,
deskripsi: true,
authorId: true,
MasterStatus: {
select: {
name: true,
}, },
// title: {
// contains: search || "",
// mode: "insensitive",
// },
}, },
Author: { orderBy: {
select: { createdAt: "desc",
id: true, },
username: true, select: {
Profile: { id: true,
select: { title: true,
id: true, deskripsi: true,
name: true, authorId: true,
imageId: 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; fixData = data;
} else if (category === "beranda") { } else if (category === "beranda") {
const data = await prisma.job.findMany({ const [data, count] = await Promise.all([
where: { prisma.job.findMany({
isActive: true, where: {
isArsip: false, isActive: true,
MasterStatus: { isArsip: false,
name: "Publish", MasterStatus: {
}, name: "Publish",
title: { },
contains: search || "", title: {
mode: "insensitive", contains: search || "",
}, mode: "insensitive",
},
orderBy: {
createdAt: "desc",
},
select: {
id: true,
title: true,
deskripsi: true,
authorId: true,
MasterStatus: {
select: {
name: true,
}, },
}, },
Author: { orderBy: {
select: { createdAt: "desc",
id: true, },
username: true, select: {
Profile: { id: true,
select: { title: true,
id: true, deskripsi: true,
name: true, authorId: true,
imageId: 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; fixData = data;
} }
@@ -161,8 +197,12 @@ async function GET(request: Request) {
success: true, success: true,
message: "Success get data job-vacancy", message: "Success get data job-vacancy",
data: fixData, data: fixData,
pagination: {
currentPage: page,
dataPerPage: takeData,
},
}, },
{ status: 200 } { status: 200 },
); );
} catch (error) { } catch (error) {
return NextResponse.json( return NextResponse.json(
@@ -171,7 +211,7 @@ async function GET(request: Request) {
message: "Error get data job-vacancy", message: "Error get data job-vacancy",
reason: (error as Error).message, reason: (error as Error).message,
}, },
{ status: 500 } { status: 500 },
); );
} }
} }

View File

@@ -0,0 +1 @@
export const PAGINATION_DEFAULT_TAKE = 10;